一、GTID的概述:
1、全局事物标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的(log_slave_updates),在mysql5.6配置GTID,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制), 但是其增大了从服务器的IO负载, 而在MySQL 5.7中该选项已经不是必须项。
二、GTID的组成部分:
前面是server_uuid:后面是一个序列号
例如:server_uuid:sequence number
7800a22c-95ae-11e4-983d-080027de205a:10
UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。
三、GTID比传统复制的优势:
1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
2、更简单的搭建主从复制。
3、比传统复制更加安全。
4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
四、GTID的工作原理:
五、配置GTID主从复制
当前的一样是传统的主从复制,测试的目的是将传统的主从复制改到GTID主从复制。
如果主从都是新库的话,还需要分别建立复制帐户并赋予相应的权限。
1.确定传统主从复制运行正常,并且所有的binlog都同步应用到从库后关闭数据库。
master:
mysql> show master status\G
*************************** 1. row ***************************
File: mysql_bin.000043
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
slave:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.61.131
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000043
Read_Master_Log_Pos: 154
Relay_Log_File: slave_relay_bin.000016
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql_bin.000043
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
master and slave:
[root@qht131 ~]# service mysql stop
Shutting down MySQL............ [ OK ]
2.确保主从是不一样的server-uuid,修改/etc/my.cnf
master:
[root@qht131 ~]# cat /u01/mysql/auto.cnf
[auto]
server-uuid=8d8746fb-2cc6-11e8-b1b6-000c295c63e0
slave:
[root@qht132 ~]# cat /u01/mysql/auto.cnf
[auto]
server-uuid=744cfcde-3a9b-11e8-b299-000c2900d025
master:
[mysqld]
socket = /usr/local/mysql/mysql.sock
character_set_server= utf8
init_connect= 'SET NAMES utf8'
basedir= /usr/local/mysql
datadir= /u01/mysql
socket = /u01/mysql/mysql.sock
log-error= /u01/log/mysql/mysql_3306.err
pid-file= /u01/mysql/mysqld.pid
lower_case_table_names = 1
sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
secure-file-priv = /u01/backup
gtid_mode=on #开启gtid
enforce_gtid_consistency=on #强制gtid一致性,开启后create table ... select以及create/drop temporary table不被支持
server-id=10000 #服务器ID
skip_slave_start=1 #slave库打开后会稍后同步数据,等待change master to 执行后才同步数据,建议开启,避免slave开启后数据不同步
log_bin = /u01/mysql/mysql_bin
max_binlog_size=1G
binlog_format = row #强制建议用row
binlog_row_image = full
innodb_flush_log_at_trx_commit=1
sync_binlog=1
expire_logs_days=10
read_only=on #建议暂时只读状态打开master
slave:
[mysqld]
socket = /usr/local/mysql/mysql.sock
character_set_server= utf8
init_connect= 'SET NAMES utf8'
basedir= /usr/local/mysql
datadir= /u01/mysql
socket = /u01/mysql/mysql.sock
log-error= /u01/log/mysql/mysql_3306.err
pid-file= /u01/mysql/mysqld.pid
lower_case_table_names = 1
sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
secure-file-priv = /u01/backup
gtid_mode=on #开启gtid
enforce_gtid_consistency=on #强制gtid一致性
server-id=10001 #服务器ID
skip_slave_start=1 #slave库打开后会稍后同步数据
#log_bin = /u01/mysql/mysql_bin
#skip-grant-tables
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
relay-log=/u01/mysql/slave_relay_bin
expire_logs_days=10
relay_log_recovery=on
relay_log_info_repository=TABLE
3.开启主从数据库,配置主从连接:
master:
[root@qht131 ~]# service mysql start
Starting MySQL. [ OK ]
slave:
[root@qht131 ~]# service mysql start
Starting MySQL. [ OK ]
mysql> change master to
-> master_host='172.17.61.131',
-> master_user='repl',
-> master_password='repl',
-> master_port=3306,
-> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
4.取消master read only,并验证主从复制
master:
[root@qht131 ~]# cat /etc/my.cnf
。。。
#read_only=on
[root@qht131 ~]# service mysql restart
Shutting down MySQL............ [ OK ]
Starting MySQL. [ OK ]
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
slave:
mysql> use l5m
Database changed
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
同步没有问题!
5.最后重新做备份,因为之前的备份是没有GTID的,现在数据开启GTID后,原备份就不适用了。
参考:
http://www.cnblogs.com/luckcs/articles/6295992.html