1.GTID是什么?
GTID
全称A global transaction identifier
全局事物id
,是MASTER
创建的和事物相匹配的ID
号;
- 它不仅在本机上是唯一的,而且在其他服务器上也是唯一的;
gitd
与事物一一对应master
每次commit
事物的时候就会自动创建gtid
gitd格式是
GTID = source_id:transaction_id
(如04038bcc-fd0c-11e7-9cc5-000c29db6599:1-2
)
source_id
一般是发起事物的uuid
, 保存在auto.cnf
文件中;
transaction_id
是事物id
,1-2
代表第二个事物;第1-n
代表n个事物
2.为什么要用GTID?
-
在主从复制中,尤其是半同步复制中, 由于
Master
的dump
进程一边要发送binlog给Slave,一边要等待Slave
的ACK
消息,这个过程是串行的,即前一个事物的ACK
没有收到消息,那么后一个事物只能排队候着; 这样将会极大地影响性能;有了GTID
后,SLAVE
就直接可以通过数据流获得GTID
信息,而且可以同步; -
另外,主从故障切换中,如果一台MASTER down,需要提取拥有最新日志的SLAVE做MASTER,这个是很好判断,而有了
GTID
,就只要以GTID
为准即可方便判断;而有了GTID
后,SLAVE
就不需要一直保存这bin-log
的文件名和Position
了;只要启用MASTER_AUTO_POSITION
即可 -
当
MASTER crash
的时候,GTID
有助于保证数据一致性,因为每个事物都对应唯一GTID
,如果在恢复的时候某事物被重复提交,SLAVE
会直接忽略;
3.什么时候用GTID?
一般在主从复制的场景下,如果只有单台就没必要使用
GTID不支持:
-
CREATE TABLE...SELECT
语句,因为一个事物一个GTID
,这个语句有2个事物,一个CREATE
,一个INSERT
,所以不支持 -
CRETAE TEMPORARY TABLE
,或者DROP TEMPORARY TABLE
不支持 -
事物和非事物混合使用; 不支持
4. 如何配置GTID?
//在主库上的配置文件中添加:
#GTID:
server_id=1 #服务器id
gtid_mode=on #开启gtid模式
enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持
log_bin=master-binlog #开启日志
//以上是GTID的基础配置,必须存在,其他配置可以根据需要自行设置
//在从库上的配置:
#GTID:
server_id=5 #从库id,比主库的大
gtid_mode=on #开启gtid模式
enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持
log_bin=slave-binlog #开启日志
//与主库一样,这四项是必须项,其他的可以自行添加
4.1启用GTID的主从
//主库:
//创建复制用户,并开启权限
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.163.130 IDENTIFIED BY "cljhfy";
Query OK, 0 rows affected, 1 warning (0.00 sec)
// 可以指向单个从库的IP也可以指定从库群的网段,
//从库:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status G ###可以看到复制工作已经开始且正常
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.163.128
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-binlog.000001
Read_Master_Log_Pos: 503939
Relay_Log_File: slave-relay-log.000002
Relay_Log_Pos: 863
Relay_Master_Log_File: master-binlog.000001
Slave_IO_Running: Yes //此两处是Yes表示GTID已启动
Slave_SQL_Running: Yes //如果有No,表示有疏漏。
...
2、已运行经典复制mysql服务器转向GTID复制
a、按本文第四点描述配置参数文件;
b、所有服务器设置global.read_only参数,等待主从服务器同步完毕;
mysql> SET @@global.read_only = ON;
c、依次重启主从服务器;
d、使用change master 更新主从配置;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1;
e、从库开启复制
mysql> START SLAVE;
f、验证主从复制
4.2验证
//主库初始数据
mysql> show tables;
+------------------+
| Tables_in_cljhfy |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
//从库初始数据
mysql> show tables;
+------------------+
| Tables_in_cljhfy |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
//在主库插入数据
mysql> insert student(name,age) values('jerry',35),('tom',66);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | jerry | 35 |
| 2 | tom | 66 |
+----+-------+------+
2 rows in set (0.00 sec)
//在从库验证
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | jerry | 35 |
| 2 | tom | 66 |
+----+-------+------+
2 rows in set (0.00 sec)