1.概述
從MYSQL5.6 開始,mysql開始支持GTID復制。
基於日志點復制的缺點:
從那個二進制日志的偏移量進行增量同步,如果指定錯誤會造成遺漏或者重復,導致數據不一致。
基於GTID復制:
1.從服務器會告訴主服務器已執行的事務的GTID值。
2.主庫會告訴從哪些GTID事務沒有被執行。
同一個事務在指定的從庫執行一次。
什么是GTID
GTID即全局事務ID,器保證為每一個在主上提交的事務在復制集群中可以生成一個唯一的ID.
GTID=source_id:transaction_id
source_id:是主庫的server UUID,在數據目錄的auto.cnf 文件中。
transaction_id: 從1開始的一個序列。
2.基於GTID復制的步驟
1.在主DB服務器上建立復制帳號。
在主庫執行命令
create user repl@'192.168.31.%' identified by 'repl';
grant all privileges on *.* to repl@'192.168.31.%' identified by 'repl';
2.配置主數據庫服務器
修改 /etc/my.cnf
log_bin =on
server_id=1001
gtid-mode=on
enforce_gtid_consistency:強制事務一致性,保證事務的安全
注意如果使用了基於事務點日志配置下面兩種情況不能使用:
1.create table 。。select
2.在事務中使用create temporary table 建立臨時表,使用關聯更新事務表和非事務表。
3.配置從服務器。
server_id=1002
log_bin=on
gtid-mode=on
enforce-gtid-consistency
建議配置
read_only=on
保證從服務器數據安全性
master_info_repository=TABLE
relay_log_info_repository=TABLE
從服務器連接主服務器的信息和中繼日志存放咱 master_info,和relay_log中。
4.初始化從服務器數據。
從主庫導出數據
mysqldump --single-transaction --master-data=2 --all-databases --triggers --routines --events -uroot -p >all.sql
可以使用 scp 命令將數據從主庫機器copy 到從庫:
scp all.sql root@192.168.31.101:/jsaas
從庫導入數據
mysql -uroot -p < all.sql
5.啟動基於GTID的復制
change master to master-host=’主服務IP’,
master_user=’repl’,
master_password=’password’,
master_auto_position=1
change master to MASTER_HOST='192.168.1.106',
MASTER_PORT=3308,
MASTER_USER='repl',
MASTER_PASSWORD='repl',
master_auto_position=1;
可能報錯的情況:
@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
在命令行下執行命令:
reset master;
后重啟mysql 服務。
start slave;
show slave status \G;
在啟動slave時報錯。
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解決辦法:
reset slave;重置slave
再啟動 slave
start slave;
測試同步:
1.在主庫創建一張表,插入記錄。
2.在從庫查詢驗證是否正確,經驗證配置正確。