MYSQL GTID 復(fù)制
MySQL5.7以后都基本用GTID方式復(fù)制了,相對(duì)于binlog和position號(hào)方式,在failover時(shí)候減少很多人工切換操作
GTID,global transaction identitifiers,基于全局事務(wù)的復(fù)制方式,由server_uuid:transaction_id組成,server_uuid在數(shù)據(jù)庫啟動(dòng)過程生成,在/data/auto.cnf中
復(fù)制過程:master事務(wù)提交時(shí)GTID,記錄到binlog;然后master的binlog傳送到slave的relaylog,slave讀取GTID生成gtid_next系統(tǒng)參數(shù);slave校驗(yàn)GTID是否在binlog并進(jìn)一步應(yīng)用事務(wù)(5.7后是存放在gtid_executed系統(tǒng)表,這樣不用開啟log_slave_updates參數(shù),從而不用把relaylog記錄再記錄到binlog,減少slave壓力)
下面操作下:
首先主從都配置gtid_mode、enforce_gtid_consistency參數(shù),其中備庫多加個(gè)log_slave_updates=1
[root@localhost /usr/local/mysql/data]$ cat /etc/my.cnf [mysqld] datadir=/usr/local/mysql/data log_bin=mysql-bin server_id=1 gtid_mode=on enforce_gtid_consistency=on [root@localhost /usr/local/mysql/data]$
mysql> show variables like '%gtid%'; +----------------------------------+-----------+ | Variable_name | Value | +----------------------------------+-----------+ | binlog_gtid_simple_recovery | ON | | enforce_gtid_consistency | ON | | gtid_executed_compression_period | 1000 | | gtid_mode | ON | | gtid_next | AUTOMATIC | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------+-----------+ 8 rows in set (0.00 sec) mysql>
然后將之前異步復(fù)制的配置去掉,重新配置slave中主庫信息即可
mysql> show variables like '%log_slave_updates%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| log_slave_updates | ON |
+-------------------+-------+
1 row in set (0.00 sec)
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> reset slave all;
Query OK, 0 rows affected (0.02 sec)
mysql> change master to
-> master_host='192.0.1.10',
-> master_user='scott',
-> master_password='tiger',
-> master_port=3306,
-> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.0.1.10
Master_User: scott
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 573
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 786
Relay_Master_Log_File: mysql-bin.000004
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: 573
Relay_Log_Space: 997
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
Master_UUID: 531fa6d1-627f-11e9-8dc7-000c297887a1
Master_Info_File: /data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 531fa6d1-627f-11e9-8dc7-000c297887a1:1-2
Executed_Gtid_Set: 531fa6d1-627f-11e9-8dc7-000c297887a1:1-2
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql>
測(cè)試一下,ok的,主庫狀態(tài)可以看到
mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000004 | 573 | | | 531fa6d1-627f-11e9-8dc7-000c297887a1:1-2 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec) mysql>
將slave中l(wèi)og_slave_updates關(guān)掉,就能看到mysql.gtid_executed表中記錄已執(zhí)行g(shù)tid信息了
mysql> select * from mysql.gtid_executed; +--------------------------------------+----------------+--------------+ | source_uuid | interval_start | interval_end | +--------------------------------------+----------------+--------------+ | 531fa6d1-627f-11e9-8dc7-000c297887a1 | 1 | 2 | | 531fa6d1-627f-11e9-8dc7-000c297887a1 | 3 | 3 | +--------------------------------------+----------------+--------------+ 2 rows in set (0.00 sec)
由于是基于事務(wù)的,所以就有了限制條件: create table select的方式在基于行復(fù)制的情況下會(huì)被拆分為創(chuàng)建表和insert數(shù)據(jù)兩個(gè)事件,某些情況下這兩個(gè)事件會(huì)被分配相同GTID導(dǎo)致后面insert數(shù)據(jù)部分被忽略而產(chǎn)生錯(cuò)誤; 一個(gè)事務(wù)中既包含InnoDB表又包含MyISAM表會(huì)導(dǎo)致可能產(chǎn)生多個(gè)gtid,或者表在主從庫中存儲(chǔ)引擎不一致都會(huì)產(chǎn)生gtid復(fù)制異常
博客出處:http://www.rzrgm.cn/yongestcat/
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)標(biāo)明出處。
如果你覺得本文還不錯(cuò),對(duì)你的學(xué)習(xí)帶來了些許幫助,請(qǐng)幫忙點(diǎn)擊右下角的推薦

浙公網(wǎng)安備 33010602011771號(hào)