本文共 3010 字,大约阅读时间需要 10 分钟。
前言
1)Gtid的概念
全局事务标识:global transaction identifiers GTID是一个事务一一对应,并且全局唯一ID GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或主从不一致 GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。 MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。 在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。 2)Gtid的组成 uuid和事务id 3)Gtid优势 更简单的实现failover,不用以前那样在需要找log_file和log_pos。 更简单的搭建主从复制。 比传统的复制更加安全。 GTID是连续的没有空洞的,保证数据的一致性,零丢失。 4)Gtid的工作原理 1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。 2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。 3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。 4、如果有记录,说明该GTID的事务已经执行,slave会忽略。 5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。 6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。一、环境
主机名 | OS | IP |
MASTER | centos7.5 | 192.168.182.164 |
SLAVE | centos7.5 | 192.168.182.163 |
二、配置my.cnf
1)master
[root@master opt]# cat /etc/my.cnf
[mysqld] user = mysql relay-log = relay-bin relay-log-index = slave-relay-bin.index basedir = /usr/local/mysql datadir = /usr/local/mysql/data socket = /usr/local/mysql/mysql.sock log-error = /usr/local/mysql/data/mysql.err pid-file = /usr/local/mysql/data/mysqld.pid server_id=1 //主服务器id gtid_mode=on //开启gtid模式 enforce_gtid_consistency=on //强制gtid一致性,开启后对于特定create table不被支持 log-bin=mysql-bin log-slave-updates=1 binlog_format=row //强烈建议,其他格式可能导致数据不一致 skip_slave_start=1 [client] socket = /usr/local/mysql/mysql.sock [root@master opt]# 2)slave[root@slave data]# cat /etc/my.cnf
[mysqld] user = mysql relay-log = relay-bin relay-log-index = slave-relay-bin.index basedir = /usr/local/mysql datadir = /usr/local/mysql/data socket = /usr/local/mysql/mysql.sock log-error = /usr/local/mysql/data/mysql.err pid-file = /usr/local/mysql/data/mysqld.pid server_id=2 gtid_mode=on enforce_gtid_consistency=on log-bin=mysql-bin log-slave-updates=1 binlog_format=row skip_slave_start=1 [client] socket = /usr/local/mysql/mysql.sock [root@slave data]# 三、配置主从库1)master
mysql>grant replication slave on *.* to 'masterrep'@'192.168.182.%' identified by '123.com';
mysql>flush privileges;mysqldump -uroot -p'123.com' -B -A -F --set-gtid-purged=OFF --master-data=2 --single-transaction --events | gzip >/opt/juwo_$(date +%F).sql.gz
mysql> flush tables with read lock; //此锁表的终端必须在备份完成以后才能退出(退出锁表失效)2)slave
mysql>mysql -uroot -p'123.com' -e "source /root/juwo_$(date +%F).sql"
mysql>changemastertomaster_host='192.168.182.164',master_port=3306,master_user='masterrep',master_password='123.com',master_auto_position=1; mysql>start slave; mysql>show slave status\G;*********************** 1. row ***************************
Slave_IO_State: Waiting for master to send event Master_Host: 192.168.182.164 Master_User: masterrep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 194 Relay_Log_File: relay-bin.000004 Relay_Log_Pos: 407 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: 注:IO和SQL都为yes,说明成功了
转载地址:http://lzxvb.baihongyu.com/