Mysql GTID
Posted liuzhenchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql GTID相关的知识,希望对你有一定的参考价值。
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
1)修改主配置文件
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
server-id=1 //服务器id
gtid-mode=on //开启gtid模式
enforce-gtid-consistency=on //强制gtid一致性,开启后对于特定create table不被支持
log-bin=master-binlog
log-slave-updates=1
binlog-format=row
skip-slave-start=1
2)修改从配置文件
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
gtid-mode=on
enforce-gtid-consistency=on
server-id=2
log-bin=slave-binlog
log-slave-updates=1
binlog-format=row
skip-slave-start=1
3)配置基于GTID的复制
//主服务器上创建复制账号
mysql> grant replication slave on *.* to ‘repl‘@‘192.168.56.23‘ identified by ‘repl123!‘;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
//在从服务器上启动同步(需先重启mysqld服务)
mysql> change master to master_host=‘192.168.56.20‘,master_user=‘repl‘,master_password=‘repl123!‘,master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.04 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.168.56.20
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-binlog.000001
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 375
Relay_Master_Log_File: master-binlog.000001
Slave_IO_Running: Yes //此处为yes表示复制线程已启动
Slave_SQL_Running: Yes //此处为yes表示复制线程已启动
4)验证复制效果
在主库上创建一个数据库liuzhenchao
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zabbix |
+--------------------+
5 rows in set (1.03 sec)
mysql> create database liuzhenchao;
Query OK, 1 row affected (0.00 sec)
在从库上查看是否同步
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liuzhenchao |
| mysql |
| performance_schema |
| sys |
| zabbix |
+--------------------+
6 rows in set (0.07 sec)
以上是关于Mysql GTID的主要内容,如果未能解决你的问题,请参考以下文章
Mysql主从复制—gtid集合信息的变更时机(包含gtid初始化)
Mysql主从复制—gtid集合信息的变更时机(包含gtid初始化)