目录
1,什么是GTID?
gtid即全局事务id,其保证为每一个在主上提交的事务,在复制集群中可以生成一个唯一的id
GTID = source_id(主库server的 uuid的值,是在mysql首次启动时自动生成的,保存在数据库的数据目录中):transaction_id(事务的自增id)
2,步骤:
<1>在主库上创建复制账号
create user zhaoheng@'192.168.195.%' identified by 'zh179883';
#(允许该用户访问主库和从库,这是一个全局权限,必须对所有数据库设置该权限)
grant replication slave on *.* to zhaoheng@'192.168.195.%';
注意:建立账号时不要在从服务器上建立相同账号,因为基于gtid,会把没有在从上执行的事务都同步到从上去,这样启动复制链路会出现错误
<2>配置主数据库服务器
建议配置:从服务器连接主服务器的配置信息,及中继日志的存储方式
[mysqld]
log_bin = /var/lib/mysql/bin-log
binlog_format = row
server_id=1
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
查看主库GTID是否开启
mysql> show variables like "%gtid%";
<3>配置从数据库服务器
在二进制日志中,会额外记录每一个事务的gtid标识符
用于保证启动后事务的安全
MySQL5.6及以前,要配置log-slave-updates=on,否则gtid模式无法启动
[mysqld]
log_bin = /var/lib/mysql/bin-log
server_id =138
binlog_format = row
relay_log=mysql-relay-bin
read_only=on
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
<4>初始化从服务器的数据
mysqldump -u root -p --single-transaction --master-data --triggers --routines --all-databases > all.sql
将sql文件传到从库上
scp all.sql root@192.168.195.138:/home
从服务器导入数据
mysql -uroot -p <all.sql
<5>启动基于gtid的复制
change master to master_host='192.168.195.137',
-> master_user='zhaoheng',
-> master_password='zh179883',
-> master_auto_position = 1;
3,优缺点:
基于日志的复制,需要我们指定二进制日志的偏移量,如果指定不一致就会造成遗漏或重复
基于gitd复制,从库会告诉主库已执行事务的gtid值,主库将未执行事务的gtid值告诉从库,这样就可以保证同一个事务在指定的库中执行一次
相比于基于日志点的复制,基于gtid可以很方便的进行故障转移,因为gtid是全局唯一的标识符,根据gtid就可以知道哪些事务是没有在从库中执行的,不用根据主的二进制日志偏移量来进行同步了
如何选择: