基础环境:
主库 | 从库 | |
服务器IP地址 | 192.168.10.11 | 192.168.10.12 |
版本 | 5.7.24 | 5.7.24 |
已存在的数据库 |
mysql> show databases; +--------------------+ | Database | | information_schema | lijiamandb | mysql | performance_schema | sys | testdb ------------------+ |
------------------+
|
(一)什么是GTID
GTID全称为全局事物标识符(global transaction identifiers),GTID具有唯一性,与主服务器上提交的每个事务相关联,如果客户端提交事务到主服务器上,则为其分配一个新的GTID,GTID是单调递增的。该标识符不仅对于主数据库是惟一的,而且在给定复制拓扑中的所有服务器上也是唯一的。GTID信息存储在数据库mysql.gtid_executed表中,该表中的一行包含它代表的每个GTID或一组GTID,始发服务器的UUID以及该组的起始和结束事务ID。
如果具有给定GTID的事务已开始在服务器上执行,但尚未提交或回滚,则在具有相同GTID的服务器上启动并发事务的任何尝试都将被阻止。服务器既不开始执行并发事务,也没有将控制权返回给客户端。一旦对事务的第一次尝试提交或回滚,在同一GTID上阻塞的并发会话可能会继续进行。如果第一次尝试回滚,则一个并发会话将继续尝试事务,并且在同一GTID上阻塞的任何其他并发会话将保持阻塞状态。如果进行了第一次尝试,则所有并发会话都将停止阻塞,并自动跳过事务的所有语句。
GTID由2部分构成:
GTID = source_id:transaction_id
其中source_id为server_uuid,对单台服务器来说,是一个固定值。transaction_id是事物的id。
GTID举例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
(二)使用GTID配置复制
(2.1)开启GTID(主从都需配置)
要启用基于GTID的复制,必须将gtid_mode变量设置为ON,并启用变量enforce_gtid_consistency为ON。
[mysqld]
# 启用GTID
gtid_mode=ON
enforce-gtid-consistency=ON
配置完成,重启数据库生效。可以使用show master status来查看gtid值
开启gtid后,数据库需要有事物执行,Executed_Gtid_Set才会有值 mysql show master status; -----------------+----------+--------------+------------------+----------------------------------------+ File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | master-bin.000027 | 352 | | | caa64a22-481a-11ea-b0f1-000c29fb6200:1 -----------------+----------+--------------+------------------+----------------------------------------+
(2.2)创建用于复制的用户(主)
每个从服务器都需要使用MySQL的用户和密码连接到主服务器上,因此需要在主服务器上创建MySQL的用户,用于进行复制操作。可以为每个从库单独创建一个账号,也可以使用同一个账号。账号需具有“replication slave”权限。
(2.3)初始化从库(从)
备份主数据库,直接在备库节点执行:
[root@slavedb ~]# mysqldump -uroot -p123456 -h 192.168.10.11 --single-transaction --all-databases --master-data=2 > master.sql
将备份还原到从库:
[root@slavedb ~]# mysql -uroot -p123456 < master.sql
还原报错:
[root@slavedb ~]# mysql -uroot -p123456 < master.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
处理方法:
[root@slavedb ~]# mysql -uroot -p123456
mysql> reset master;
Query OK,0 rows affected (0.03 sec)
(2.4)从库配置(从)
如果尚未设置从服务器ID,或者当前值与您为主服务器选择的值冲突,请关闭从服务器并编辑[mysqld]配置文件的 部分以指定唯一的服务器ID。例如:
(2.5)将从数据库添加到复制环境(从)
这里是与“使用二进制日志文件复制”差别最大的地方,在使用二进制方法时,我们需要指定二进制日志文件的位置(master_log_file,master_log_pos),但是在使用GTID时,MySQL会自动查找位置。
mysql> CHANGE MASTER TO -> master_host='192.168.10.11',-> master_port=3306rep1231; Query OK,0 rows affected,2 warnings (0.00 sec)
启动从库复制相关进程:
(2.6)确认复制状态(从)
在从库执行“ show slave status ”,如果Slave_IO_Running和Slave_SQL_Running都是“YES”,说明复制正常。
【完】
附录:
MySQL复制(replication)文档集合: 1.复制概述 2.基于二进制日志文件位置(binlog)配置复制 3.基于全局事物标识符(GTID)配置复制 4.多源复制 5.级联复制 6.半同步复制 7.延迟复制 8.复制过滤规则 9.对复制进行故障排除 10.故障切换 11.复制管理 |