寫在前邊:
這兩天來了個需求,配置部署兩台服務器的MySQL數據同步,折騰了兩天查了很多相關資料,一直連不上,后來發現其實是數據庫授權的ip有問題,我們用的服務器是機房中的虛擬機加上反向代理出來的,坑的不行。看了好多博客,寫的怎么說呢,寫的好的是太好了太詳細了;寫的不好的,配置什么的都講的不清楚,剛接觸這塊的時候不曉得原理,一味的復制粘貼,后來看到有個博主寫的好文,瞬間醍醐灌頂,也有了自己的思路,我就簡單的記錄下操作步驟和一些細節的注釋,原理就直接搬運了,原理圖也畫了份,就不獻丑了,有寫錯的地方,還望各位大佬不吝賜教,在下感激不盡!
配置MySQL的主從同步有什么好處?
1--數據分布 (Data distribution )
2--負載平衡(load balancing)
3--數據備份(Backups) ,保證數據安全(最主要的作用)
4--高可用性和容錯行(High availability and failover)
5--實現讀寫分離,緩解數據庫壓力
MySQL主從同步實現原理(參考博文點這里):
master服務器將數據的改變記錄二進制binlog日志,當master上的數據發生改變時,則將其改變寫入二進制日志中;salve服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件,同時主節點為每個I/O線程啟動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日志中,從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
注意幾點:
1--master將操作語句記錄到binlog日志中,然后授予slave遠程連接的權限(master一定要開啟binlog二進制日志功能;通常為了數據安全考慮,slave也開啟binlog功能)。
2--slave開啟兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日志relay log里;SQL線程負責從relay log日志里讀出binlog內容,並更新到slave的數據庫里,這樣就能保證slave數據和master數據保持一致了。
3--Mysql復制至少需要兩個Mysql的服務,當然Mysql服務可以分布在不同的服務器上,也可以在一台服務器上啟動多個服務。
4--Mysql復制最好確保master和slave服務器上的Mysql版本相同(如果不能滿足版本一致,那么要保證master主節點的版本低於slave從節點的版本)
5--master和slave兩節點間時間需同步
Mysql復制的流程圖如下:

MySQL是怎樣同步的?
1--基於語句的復制: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認采用基於語句的復制,效率比較高。一旦發現沒法精確復制時,會自動選着基於行的復制。
2--基於行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
3--混合類型的復制: 默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。
實現環境:
| System | mysql | ip |
|:---- |:---- |:----
|win7 | mysql-5.6.24 | 192.168.1.129 |
|centos 6.7 | mysql-5.6.39 | 192.168.1.128 |
注:從服務器的mysql版本最好和主服務器相同,或者大於主服務器版本
MySQL主從同步的實現部分:
首先是Master(主節點)的配置:
#主Master服務器配置:
1.進入mysql的安裝目錄,新建一個log文件夾(這個是存儲binary log的路徑)
2.主服務器開啟log_bin,需修改my.ini,配置如下:
#*********************master my.ini配置文件開始*****************************************
#路徑均為當前服務器的實際路徑
basedir = D:\\apps\\mysql-5.6.24-win32 datadir = D:\\apps\\mysql-5.6.24-win32\\data port = 3306
#生成記錄文件位置,同步必須,請勿手動刪除,格式位置為 :log-bin=mysql安裝路徑/log/mysql-bin.log
log-bin=D:\\apps\\mysql-5.6.24-win32\\log\\mysql-bin.log
#服務ID,用於區分服務,范圍1~2^32-1,需要與從服務器不同
server_id= 1
#MySQL 磁盤寫入策略以及數據安全性
#每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去
innodb_flush_log_at_trx_commit=1
#當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數將它的寫二進制日志binary log同步到磁盤中去。
sync_binlog 的默認值是0,像操作系統刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統來刷新binary log。
sync_binlog= 1
#同步數據庫,如果多庫,就以此格式另寫幾行即可
binlog-do-db=test
#無需同步的數據庫,以下幾行基本一樣,無需改動
binlog-ignore-db = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = information_schema
#mysql復制模式,三種:SBR(基於sql語句復制),RBR(基於行的復制),MBR(混合模式復制)
#混合模式復制
binlog_format=MIXED
#binlog過期清理時間
expire_logs_days=7
#binlog每個日志文件大小
max_binlog_size=20M
#*********************master my.ini配置文件結束*****************************************
3.重啟mysql服務,mysql命令行執行:
show master status;#記錄文件名以及緊跟的當前行數數字
4.創建並授權用戶,后兩個slave分別是用戶名和密碼
grant replication slave ,replication client on *.* to slave@'192.168.1.128' identified by "slave"; flush privileges; #權限修改立即生效 flush tables with read lock; #鎖定數據庫為只讀,確保備份數據一致性
5.退出mysql命令行,執行備份命令
#備份當前所有數據庫,可以參考備份單庫 mysqldump -u root -p --all-databases --master-data > dbdump.sql
6.將sql腳本在從服務器執行
7.從服務器啟動slave(前提是配置好從服務器)
8.從服務器啟動完畢后關閉表鎖
unlock tables;
#從服務器的配置
1.停掉slave服務
service mysqld stop
2.修改配置文件:
vim /etc/my.cnf
#從數據庫(Slave)配置:
#***********************************slave my.cnf配置開始******************************
#從庫日志記錄文件位置或名稱前綴
log_bin = /var/lib/mysql/mylogbin.log
#同步日志記錄的頻率,1為每條都記錄,安全但效率低
sync_binlog = 1
#server的id,不能與相同id的mysql主從連接
server-id=2
#從庫日志忽略的數據庫名稱,不記錄
#這里記錄從庫的binlog是為了安全,如果覺得沒必要,可以去掉從庫binlog的配置
binlog-ignore-db = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = information_schema
#此處添加需要同步的數據庫名稱,那么它會只接收這個數據庫的信息,多個數據庫需同步按照此格式另寫幾行即可
#這里同步數據有兩種思路,一種是主服務器只發從庫需要的,在主庫指定;一種是主服務器把所有數據同步過來,從庫按需過濾接收
#為了讓配置更詳細些,此處配置了從庫過濾接收的配置
replicate-do-db=test
#忽略接收的庫名
replicate-ignore-db = cluster replicate-ignore-db = mysql replicate-ignore-db = performance_schema replicate-ignore-db = information_schema
#跳過所有錯誤繼續
slave-skip-errors=all
#設置延時時間
slave-net-timeout=60
#mysql復制模式,三種:SBR(基於sql語句復制),RBR(基於行的復制),MBR(混合模式復制)
binlog_format=MIXED #混合模式復制
expire_logs_days=7 #binlog過期清理時間
max_binlog_size=20M #binlog每個日志文件大小
#***********************************slave my.cnf配置結束******************************
3.保存退出:wq
4.啟動mysqld服務
service mysqld start
5.刪除多余數據庫,導入數據,刪除部分不予演示,sql的位置請自行指定
mysqldump -u root -p < ~/dbdump.sql #這里演示就是上傳到了root的根目錄,具體請使用“find / -name sql腳本名” 命令查詢
6.從服務器指定master
CHANGE MASTER TO MASTER_HOST='192.168.1.129', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=593;
注:最后兩行是之前在主服務器show master status 所記錄的數據
如果之前已經啟動了一個slave進程,那么以上的命令會失效,並提示stop slave first,所以先stop slave; 然后重試
7.啟動slave
start slave; show slave status\G #注意,沒有分號
輸出如下,顯示兩個都為yes即成功,可以測試一下
mysql> show slave status; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.129 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 593 Relay_Log_File: mysql-relay-log.000004 Relay_Log_Pos: 441 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 52360 Relay_Log_Space: 597 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 """
8.去主服務器開啟表只讀鎖
unlock tables;
--------------------------------實現部分到此結束--------------------------------------
徹底解除主從復制關系
1)stop slave;
2)reset slave; #或直接刪除master.info和relay-log.info這兩個文件;
3)修改my.cnf刪除主從相關配置參數。
4)Delete FROM user Where User='slave' and Host='192.168.1.128';#刪除主服務器配置的連接slave用戶
本文參考博文列表:
Mysql主從同步(1)-主從/主主環境部署梳理
MySQL5.7 添加用戶、刪除用戶與授權
mysql設置指定ip訪問,用戶權限相關操作
win7下mysql5.6與centos下mysql5.6主從復制
mysql5.6 主從復制同步詳細配置(圖文)
MySQL5.6 數據庫主從(Master/Slave)同步安裝與配置詳解
centos 7下mysql5.7 主從數據庫同步配置
MySql 5.7.18 數據庫主從(Master/Slave)同步安裝與配置詳解
mysql從庫Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'報錯處理
【MySQL】Last_IO_Errno: 1593 server-uuid重復導致slave報錯
【MySQL】MySQL5.6數據庫基於binlog主從(Master/Slave)同步安裝與配置詳解
Window 下mysql binlog開啟及查看,mysqlbinlog
mysql主從復制-CHANGE MASTER TO 語法詳解
[trouble] error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400
