mysql5.7基於binlog的主從複製最詳細

要求

1、主從服務器操作系統版本和位數一致
2、Master和Slave數據庫的版本要一致
3、Master和Slave數據庫中的數據要一致
4、Master開啓二進制日誌,Master和Slave的server_id在局域網內必須唯一

具體配置

硬件需求
兩臺或兩臺以上安裝了相同版本的MySQL(我沒有試過不同版本會不會有問題,有興趣的可以試試),當然這個可以用虛擬機或者Docker代替,個人推薦用Docker,比虛擬機消耗少太多了,當然用起來可能沒有虛擬機那麼方便,但是卻不用挨個環境配置了

配置Master

一、安裝數據庫
二、配置my.ini
[mysqld]
##設置server_id,一般設置爲IP,注意要唯一
server_id=100
##複製過濾:也就是指定哪個數據庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
##開啓二進制日誌功能,可以隨便取,最好有含義(關鍵就是這裏了)
log-bin=edu-mysql-bin
##爲每個session 分配的內存,在事務過程中用來存儲二進制日誌的緩存
binlog_cache_size=1M
##主從複製的格式(mixed,statement,row,默認格式是statement)
binlog_format=mixed
##二進制日誌自動刪除/過期的天數。默認值爲0,表示不自動刪除。
expire_logs_days=7
##跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
##如:1062錯誤是指一些主鍵重複,1032錯誤是因爲主從數據庫數據不一致
slave_skip_errors=1062

配置完成後重啓mysql

關於複製過濾
複製過濾可以讓你只複製服務器中的一部分數據,有兩種複製過濾:

1、在Master上過濾二進制日誌中的事件
2、在Slave上過濾中繼日誌中的事件。

複製類型
1、基於語句的複製
在Master上執行的SQL語句,在Slave上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現沒法精確複製時,會自動選着基於行的複製

2、基於行的複製
把改變的內容複製到Slave,而不是把命令在Slave上執行一遍。從MySQL5.0開始支持

3、混合類型的複製
默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製

三、創建數據同步用戶
1.CREATE USER ‘slave’@’%’ IDENTIFIED BY ‘123456’;
2.GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@’%’;
這裏主要是要授予用戶REPLICATION SLAVE權限和REPLICATION CLIENT權限

配置Slave

一、安裝數據庫
二、配置my.ini
[mysqld]
##設置server_id,一般設置爲IP,注意要唯一
server_id=101
##複製過濾:也就是指定哪個數據庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
##開啓二進制日誌功能,以備Slave作爲其它Slave的Master時使用
log-bin=edu-mysql-slave1-bin
##爲每個session 分配的內存,在事務過程中用來存儲二進制日誌的緩存
binlog_cache_size=1M
##主從複製的格式(mixed,statement,row,默認格式是statement)
binlog_format=mixed
##二進制日誌自動刪除/過期的天數。默認值爲0,表示不自動刪除。
expire_logs_days=7
##跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
##如:1062錯誤是指一些主鍵重複,1032錯誤是因爲主從數據庫數據不一致
slave_skip_errors=1062
##relay_log配置中繼日誌
relay_log=edu-mysql-relay-bin
##log_slave_updates表示slave將複製事件寫進自己的二進制日誌
log_slave_updates=1
##防止改變數據(除了特殊的線程)
read_only=1
如果Slave爲其它Slave的Master時,必須設置bin_log。配置完成後重啓mysql

完成Master和Slave鏈接
一、初始化數據
保證Master和Slave除不同步的數據庫,其他庫的數據一致

二、查詢Master狀態
在Master中執行
1 show master status;
記錄下返回結果的File列和Position列的值

三、Slave中設置Master信息
在Slave中執行
1 change master to master_host=‘192.168.1.100’, master_user=‘slave’, master_password=‘123456’, master_port=3306, master_log_file=‘edu-mysql-bin.000001’, master_log_pos=1389, master_connect_retry=30;
上面執行的命令的解釋:

master_host=’192.168.1.100’ ## Master的IP地址

master_user=’slave’ ## 用於同步數據的用戶(在Master中授權的用戶)

master_password=’123456’ ## 同步數據用戶的密碼

master_port=3306 ## Master數據庫服務的端口

master_log_file=’edu-mysql-bin.000001’ ##指定Slave從哪個日誌文件開始讀複製數據(Master上執行命令的結果的File字段)

master_log_pos=429 ## 從哪個POSITION號開始讀(Master上執行命令的結果的Position字段)

master_connect_retry=30 ##當重新建立主從連接時,如果連接建立失敗,間隔多久後重試。單位爲秒,默認設置爲60秒,同步延遲調優參數。

四、查看主從同步狀態
在Slave中執行命令
1 show slave status;
可看到Slave_IO_State爲空, Slave_IO_Running和Slave_SQL_Running是No,表明Slave還沒有開始複製過程。相反Slave_IO_Running和Slave_SQL_Running是Yes表明已經開始工作了

五、開啓主從同步
在Slave中執行命令
1 start slave(開啓同步線程執行同步);
2 stop slave(關閉同步線程)
查詢查看主從同步狀態,會發現Slave_IO_Running和Slave_SQL_Running是Yes了,表明開啓成功

注意:我在實際操作中,首次操作完成後,在主服務器數據庫添加數據後,發現從服務器數據庫並沒有天機對應的數據,這時候不要着急,請按照如下步驟再操作一次:
1.在Slave中執行 stop slave 命令
2.在master中執行 show master status,並查看master_log_file 和 master_log_pos的值
3.重新再slave中執行 (設置master_log_file和master_log_pos的的值爲如上查出的值)
change master to master_host=‘192.168.1.100’, master_user=‘slave’, master_password=‘123456’, master_port=3306, master_log_file=‘edu-mysql-bin.000001’, master_log_pos=1389, master_connect_retry=30;
4.重新執行 show slave status命令,可看到Slave_IO_State爲空, Slave_IO_Running和Slave_SQL_Running是No,表明Slave還沒有開始複製過程。相反Slave_IO_Running和Slave_SQL_Running是Yes表明已經開始工作了
5.在Slave中執行 start slave命令
6.繼續執行 show slave status,Slave_IO_Running和Slave_SQL_Running是Yes表明已經開始工作了,此時主從複製正式開啓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章