一、A、B雙主模型的實現條件:
1. 開啓二進制日誌
2. 開啓中繼日誌
3. 解決自動增長列的問題
如果A服務器上自動增長的列編號有一個35,此時還沒有同步到B服務器上,在B服務器上插入一條數據,編號也是35。當同步A的35到B服務器上來的話,必然產生數據丟失。
解決辦法:
讓在A上插入的行的自動增長都爲奇數,讓B服務器上的自動增長都爲偶數。這樣就解決了自動增長的問題。
假設A是一臺生產環境中的數據庫,現在想添加B服務器,實現雙主模型。
二、步驟:
1. 在A、B服務器上創建具有複製權限的帳號
2. 在A、B服務器上修改配置文件(開啓二進制日誌、中繼日誌等)
3. 將A服務器上存在的數據文件導入到B服務器中
注意:導入數據的時候,先關閉B服務器的二進制日誌。
4. 讓B先成爲slave,再讓A成爲slave
5. 測試
三、開始配置
1. 創建授權用戶
mysql> grant replication slave on *.* to 'slave'@'192.168.2.96' identified by '12345'; Query OK, 0 rows affected (0.00 sec) #A服務器 mysql> grant replication slave on *.* to 'slave'@'192.168.2.93' identified by '12345'; Query OK, 0 rows affected (0.00 sec) #B服務器
2. 編輯配置文件
[root@oracle ~]# vim /etc/my.cnf log-bin=mysql-bin #開啓二進制日誌 server-id=1 relay-log=mysql-relay-bin #開啓中繼日誌 log_slave_updates = on #從服務器將時間記錄到二進制日誌中 auto_increment_increment=2 #自動增長的步長 auto_increment_offset=1 #自動增長的起始數值 #A服務器的配置
[root@node2 ~]# vim /etc/my.cnf server-id=2 #log-bin=mysql-bin #log_slave_updates = on auto_increment_increment=2 auto_increment_offset=2 #B服務器的配置,先關閉二進制日誌
重啓服務
[root@oracle ~]# service mysqld restart Shutting down MySQL.. [ OK ] Starting MySQL. [ OK ]
創建測試用的表
mysql> select * from info; +-----+-------+-----+ | sid | name | age | +-----+-------+-----+ | 1 | zhang | 23 | | 2 | li | 12 | | 3 | cheng | 34 | | 4 | wang | 22 | | 5 | chen | 44 | +-----+-------+-----+ 5 rows in set (0.00 sec) #在A服務器上創建測試用的表
3. 將表導入到B服務器上
[root@oracle ~]# mysqldump --databases data --lock-all-tables --master-data=2 > /root/dump.sql [root@oracle ~]# scp /root/dump.sql [email protected]:/root/ #A服務器上dump+拷貝 [root@node2 ~]# mysql < dump.sql #B服務器上執行
4. 讓B服務器先成爲slave
mysql> change master to master_host='192.168.2.93',master_user='slave',master_password='12345',master_port=3306,MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=1068; #MASTER_LOG_FILE和MASTER_LOG_POS在dump.sql中有記錄
[root@node2 ~]# vim /etc/my.cnf #將剛剛註釋掉的參數生效 log-bin=mysql-bin log_slave_updates = on
[root@node2 ~]# service mysqld restart Shutting down MySQL.. [確定] Starting MySQL. [確定]
再讓A服務器成爲slave
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) #在B上查看二進制日誌信息 mysql> change master to master_host='192.168.2.96',master_user='slave',master_password='12345',master_port=3306,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120; mysql> start slave;
查看A、B服務器的狀態:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.96 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes #A服務器上的狀態
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.93 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-relay-bin.000003 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000008 Slave_IO_Running: Yes Slave_SQL_Running: Yes #在B服務器上查看狀態
5. 測試:
mysql> insert into info(name,age) values('sun',25),('ding',29); #在A服務器上插入2行數據 mysql> select * from info; +-----+-------+-----+ | sid | name | age | +-----+-------+-----+ | 1 | zhang | 23 | | 2 | li | 12 | | 3 | cheng | 34 | | 4 | wang | 22 | | 5 | chen | 44 | | 7 | sun | 25 | | 9 | ding | 29 | +-----+-------+-----+ 7 rows in set (0.00 sec) #在B服務器上查看的結果
mysql> insert into info(name,age) values('BB',33),('BC',21); #在B服務器上插入2行數據 mysql> select * from info; +-----+-------+-----+ | sid | name | age | +-----+-------+-----+ | 1 | zhang | 23 | | 2 | li | 12 | | 3 | cheng | 34 | | 4 | wang | 22 | | 5 | chen | 44 | | 7 | sun | 25 | | 9 | ding | 29 | | 10 | BB | 33 | | 12 | BC | 21 | +-----+-------+-----+ 9 rows in set (0.00 sec) #在A服務器上查看
這樣雙主模型就已經實現了。