2.1 GTID介紹
對於binlog中的每一個事務,都會生成一個GTID號碼
DDL ,DCL 一個event就是一個事務,就會有一個GTID號.
DML語句來講,begin到commit,是一個事務,就是一個GTID號
2.2 GTID的組成
severi_uuid:TID
severi_uuid?
[root@db01 data]# cat auto.cnf
[auto]
server-uuid=d60b549f-9e10-11e9-ab04-000c294a1b3b
TID是一個:自增長的數據,從1開始
d60b549f-9e10-11e9-ab04-000c294a1b3b:1-15
2.3 GTID的冪等性
如果拿有GTID的日誌去恢復時,檢查當前系統中是否有相同GTID號,有相同的就自動跳過
會影響到binlog恢復和主從複製.
2.4 GTID的開啟和配置
vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true
2.5 查看GTID信息
mysql> create database gtid charset utf8mb4;
mysql> show master status;
mysql> use gtid;
mysql> create table t1(id int);
mysql> show master status;
mysql> insert into t1 values(1);
mysql> commit;
mysql> show master status;
mysql> drop database gtid;
2.6 基於GTID,binlog恢復
(1) 截取日誌
[root@db01 data]# cd /data/binlog/
[root@db01 binlog]# mysqlbinlog --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql-bin.000005 >/tmp/gtid.sql
(2)恢復
mysql> set sql_log_bin=0;
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;
(3) 報錯
ERROR 1049 (42000): Unknown database 'gtid'
Query OK, 0 rows affected (0.00 sec)
ERROR 1046 (3D000): No database selected
為什麼報錯?
因為冪等性的檢查,1-3事務已經做過了.
(4)正確的做法?
mysqlbinlog --skip-gtids --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql-bin.000005 >/tmp/gtid.sql
--skip-gtids 作用:在導出時,忽略原有的gtid信息,恢復時生成最新的gtid信息
(5) 恢復
set sql_log_bin=0;
source /tmp/gtid.sql
set sql_log_bin=1;
2.7 GTID相關的參數
--skip-gtids
--include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'
--exclude-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'