MySQL主從複製與主主複製
主從複製:
1.環境說明:
準備兩臺linux虛擬主機
Linux版本CentOS7、MySQL 5.7.17
ip:192.168.1.1、192.168.1.2
2.創建複製賬號
mysql會賦予一些特殊的權限給複製線程,在備庫運行的I/O線程會建立一個到主庫TCP/IP連接,這意味着必須在主庫創建一個用戶,並賦予其合適的權限,備庫I/O線程以該用戶名連接到主庫並取其二進制日誌;(摘自:高性能mysql => 複製)
在192.168.1.1 中創建一個192.168.1.2主機中可以登錄的MySQL用戶
//192.168.1.1 : 主數據庫服務器:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'192.168.1.2' IDENTIFIED BY 'tongbu';
mysql>FLUSH PRIVILEGES;
注意1:這裏我把這個賬號限制在本地並且只有192.168.1.2這個主機可以訪問,因爲這是一個特殊權限的賬號(儘管這個賬號無法執行select或者update),但是任然能從二進制日誌中獲取一些數據(摘自:高性能mysql => 複製)
3.配置主庫和備庫
MySQL配置文件都在: /etc/my.cnf
1.在主庫的my.cnf
文件的[mysqld]
下添加:log-bin,server_id(具體如下:)
log-bin=mysql-bin # 開啓二進制日誌
server_id=10 # 0-232任取 但必須和其他數據庫中的不同 (必須唯一)!
注意:二進制日誌必須開啓,因爲數據的同步實質上就是其他的MySQL數據庫服務器將這個數據變更的二進制日誌在本機上再執行一遍。
2.保存後重啓mysql
3.查看主庫中MySQL服務器二進制文件名與位置
mysql>SHOW MASTER STATUS;
注意:這裏重點關注File和Position這兩項;
4.告知二進制文件名與位置
在備庫中執行:
mysql>CHANGE MASTER TO
>MASTER_HOST='192.168.1.1',
>MASTER_USER='tongbu',
>MASTER_PASSWORD='tongbu',
>MASTER_LOG_FILE='mysql-bin.000001',
>MASTER_LOG_POS=98;
完成主從複製配置
5.開啓並查看
在備庫中執行:
mysql>START SLAVE; #開啓複製
mysql>SHOW SLAVE STATUS\G #查看主從複製是否配置成功
注意:當看到Slave_IO_Running: YES、Slave_SQL_Running: YES才表明狀態正常(如有異常請看3.關於報錯中提供的解決方案!)
主主複製:
1.設置配置文件(參考上面)
–192.168.1.1
server-id=11 #任意自然數n,只要保證兩臺MySQL主機不重複就可以了。
log-bin=mysql-bin #開啓二進制日誌
auto_increment_increment=2 #步進值auto_imcrement。一般有n臺主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n臺主MySQL。此時爲第一臺主MySQL
binlog-ignore=mysql #忽略mysql庫【我一般都不寫】
binlog-ignore=information_schema #忽略information_schema庫【我一般都不寫】
replicate-do-db=aa #要同步的數據庫,默認所有庫
–192.168.1.2
server-id=12
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
replicate-do-db=aa
配置好後重啓MySQL
2.創建複製賬號並配置二進制文件名與位置
第一步:
在192.168.1.1中創建一個192.168.1.2主機中可以登錄的MySQL用戶
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.2' IDENTIFIED BY 'root';
mysql>FLUSH PRIVILEGES;
第二步:
在192.168.1.1查看二進制日誌名和位置
mysql>show master status;
在192.168.1.2中執行:
mysql>CHANGE MASTER TO
>MASTER_HOST='192.168.1.1',
>MASTER_USER='root',
>MASTER_PASSWORD='root',
>MASTER_LOG_FILE='mysql-bin.000001',
>MASTER_LOG_POS=98;
第三步:
在192.168.1.2中創建一個192.168.1.1主機中可以登錄的MySQL用戶
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.1' IDENTIFIED BY 'root';
mysql>FLUSH PRIVILEGES;
第四步:
在192.168.1.2查看二進制日誌名和位置
mysql>show master status;
在192.168.1.1中執行:
mysql>CHANGE MASTER TO
>MASTER_HOST='192.168.1.2',
>MASTER_USER='root',
>MASTER_PASSWORD='root',
>MASTER_LOG_FILE='mysql-bin.000001',
>MASTER_LOG_POS=98;
3.完成mysql主主複製
分別開啓START SLAVE;
mysql>START SLAVE; #開啓複製
mysql>SHOW SLAVE STATUS\G #查看主從複製是否配置成功
注意:當看到兩臺主機的Slave_IO_Running: YES、Slave_SQL_Running: YES才表明狀態正常
3.關於報錯
1.主從同步報錯Fatal error: The slave I/O thread stops because master and slave have equal MySQL server
原因分析:
mysql 5.6的複製引入了uuid的概念,各個複製結構中的server_uuid得保證不一樣,但是查看到直接copy data文件夾後server_uuid是相同的,show variables like ‘%server_uuid%’;
解決方法:
找到data文件夾下的auto.cnf文件,修改裏面的uuid值,保證各個db的uuid不一樣,重啓db即可
場景二:創建主從關係時copy了同樣的my.cnf文件,報錯
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;
原因分析:
和server_uuid類似,servier_id也得保證不一樣
解決方法:
找到my.cnf配置文件中的server_id,修改從庫的server_id保證和複製結構中的其他db不一樣,重啓db即可
1、主主複製配置文件中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
2、當配置完成Slave_IO_Running、Slave_SQL_Running不全爲YES時,show slave status\G信息中有錯誤提示,可根據錯誤提示進行更正。
3、Slave_IO_Running、Slave_SQL_Running不全爲YES時,大多數問題都是數據不統一導致。
常見出錯點:
1、兩臺數據庫都存在db數據庫,而第一臺MySQL db中有tab1,第二臺MySQL db中沒有tab1,那肯定不能成功。
2、已經獲取了數據的二進制日誌名和位置,又進行了數據操作,導致POS發生變更。在配置CHANGE MASTER時還是用到之前的POS。
3、stop slave後,數據變更,再start slave。出錯。
終極更正法:重新執行一遍CHANGE MASTER就好了。