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)修改主配置文件

[root@20liuzhenchao ~]# 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)修改从配置文件

[root@localhost ~]# 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)
原文地址:https://www.cnblogs.com/liuzhenchao/p/10889776.html