MySQL主從複製與主主複製

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就好了。

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