Centos8.3、mysql8.0主從復制實戰記錄


引言

     最近又上線了一個項目感覺自己這段時間收獲不少就想把自己做這個項目用的技術總結梳理一下這個項目是我自己發起領導們不是特別重視所以得到資源有限資源有限的情況我只能選擇手動搭建數據庫環境資源充足的情況下還是推薦使用類似PolarDB這種雲數據庫原因很多穩定性好使用維護簡單擴容方便還提供一系列的sql審計工具 

環境准備

環境和軟件

版本

數量

1

centos

8.3

3

2

mysql

8.0.21

3

 

安裝命令

yum -y install mysql-server                     # 安裝mysql -y 的意思就是安裝過程如果需要輸入y 可以不用在輸入。
systemctl enable mysqld.service                 # 設置為開啟自啟
systemctl start mysqld.service                  # 開啟mysql服務

   vim  /etc/my.cnf                                        # 編輯mysql配置文件 默認安裝是在/etc目錄下 

   skip-grant-tables --shared-memory           # 設置跳過密碼 添加到[service-clinet]標簽下如下圖:

 

  mysql -u root -p                                     # 輸入命令 然后回車鍵跳過密碼登錄

  ALTER USER 'root'@'localhost' IDENTIFIED BY 'jishuzhai';  #添加root用戶和密碼 注意localhost意味這不能遠程登錄可以換成% 這里不推薦 建議創建新的賬號遠程訪問

  再次編輯 /etc/my.cnf文件注釋掉剛才跳過密碼那句話

  systemctl restart mysqld.service # 重啟mysql服務

mysql安裝注意事項

   安裝命令這里只供參考不過個人推薦使用yum命令安裝這樣簡單快捷而且方便擴容不過有一點在生產環境要注意那就是磁盤初始容量一定要大最好是冗余的即使初始化數據容量很小主從會產生大量的日志文件磁盤容量很小很容易導致磁盤被寫滿那個時候再去擴容需要停機維護另外數據庫備份推薦備份目錄為數據盤並且主從數據庫都備份

創建遠程訪問的賬號

CREATE USER 'proxysql'@'%' IDENTIFIED BY 'jishuzhai'; #創建賬號
GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%' WITH GRANT OPTION; # 賦予權限
flush privileges; # 刷新權限

注意 讀取賬號只需要主數據庫一個就可以了,但是這里為了下一步使用proxysql做讀寫分離 所以每一個數據庫實例都創建了一個賬號

創建測試數據庫

CREATE DATABASE brief_test;# 創建數據庫

CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `service_name` varchar(50) NOT NULL COMMENT '自增',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; # 創建測試表

INSERT INTO `test` VALUES (1, 'master');
INSERT INTO `test` VALUES (2, 'slave1');
INSERT INTO `test` VALUES (3, 'slave2'); # 添加測試數據

 

注意在主庫上創建 然后同步到所有從數據庫 主從開始前要保證數據一致 不然會綁定失敗

編輯主從數據庫配置

登錄到主數據的服務器編輯數據庫配置文件

將以下配置添加到/etc/my.conf 文件中 如下圖

[mysqld]
#配置主庫
server_id=1              #服務器id 不能重復 1,2,3,4這種以此類推
log_bin=master-bin
log_bin-index=master-bin.index
binlog-do-db=brief_test  #需要同步的數據庫名稱 配置多個數據庫需要配置多個binlog-do-db 例如 binlog-do-db=brief_test1 binlog-do-db=brief_test2 binlog-do-db=brief_test3 這種方式配置

 

systemctl restart mysqld.service#重啟mysql服務

登錄到從數據庫將以下配置添加到/etc/my.conf文件中如下圖

[mysqld]
server_id=2    #服務編號不能重復
read_only=on   #設置為只讀

systemctl restart mysqld.service #重啟mysql服務

最后一步配置主從 

1登錄主數據庫 執行 show master status 如下圖

記錄file 和 position的值從數據庫綁定要用的到

 

(2)登錄從數據庫執行:

CHANGE MASTER TO MASTER_HOST='172.16.102.7', #主數據庫ip
MASTER_PORT=3306,                            #主數據庫端口
MASTER_USER='proxysql',                      #主數據庫復制賬號
MASTER_PASSWORD='jishuzhai',                 #主數據庫密碼
MASTER_LOG_FILE='master-bin.000001',         #剛才從master數據庫查詢file值
MASTER_LOG_POS=156;                          #剛才從master數據庫查詢postition值

然后執行

start slave; #開啟slave

然后執行 

show slave status;#查看slave狀態

正確結果如下圖:

常見問題:

    show slave status結果slave_io_running slave_sql_running值均為No或者一個為no我遇到四種情況

    第一種情況是server_id 重復Mysql 8.0 的 server_id 必須在[mysql]標簽下 而且必須在[clinet-servser]配置之前才生效結果就導致我明明配置server_id 卻還是連接失敗針對這種情況可以使用

    select @@server_id #查詢數據庫的server_id 可以看到當前的id

   第二種情況是uuid重復 使用虛擬機安裝好數據庫 然后克隆出slave1slave2 這種情況uuid也是重復的 導致連接失敗針對這種情況可以手動修改

   vim  /var/lib/mysql/auto.cnf 如下圖:

   

   隨便更改一個字符保持uuid 不重復即可。

   第三種情況 主從數據庫不一致 主要表現某個應用連接到從數據庫並且寫入了數據 從數據庫雖然設置了只讀 但是root權限的賬號可以寫入這種情況最麻煩但是好處理停止所有應用或者設置主數據庫鎖住 然后把主數據同步到從數據庫然后重新連接

第四種情況 事物回滾導致的 這種情況比少但是好處理

使用以下命令:

STOP SLAVE #先執行關閉語句
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;#重置值
START SLAVE #打開語句

 

關於清理binary日志

 主從會產生大量的日志文件 可以使用以下方式自動清理 

show binary logs;#查詢日志
set GLOBAL binlog_expire_logs_seconds = 1296000 #設置日志過期時間為15天單位秒 超過15的會被自動清除
SELECT @@binlog_expire_logs_seconds #查詢是否生效
flush logs;# 立即生效

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM