基于事务的Replication,就是利用GTID来实现的复制
GTID(全局事务标示符)最初由google实现,在MySQL 5.6中引入.GTID在事务提交时生成,由UUID和事务ID组成.uuid会在第一次启动MySQL时生成,保存在数据目录下的auto .cnf文件里,事务ID则从1开始自增使用GTID的好处主要有两点:
一. 不再需要指定传统复制中的master_log_files和master_log_pos,使主从复制更简单可靠
二. 可以实现基于库的多线程复制,减小主从复制的延迟
基于gtid实现主从复制
1.首先准备俩台干净服务器
主从都进行该些操作
[root@slave ~]# yum -y erase `rpm -qa | grep -E "mysql|mariadb"`
[root@slave ~]# rm -rf /etc/my* /var/lib/mysql* /var/log/mysql*
#检查一下
[root@slave ~]# [[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "数据库已清除" || echo "数据库未清理"
2.安装mysql
主库从库都执行的操作
#初始化数据库
[root@slave ~]# systemctl start mysqld
# 修改初始密码
[root@slave ~]# mysqladmin -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password 'Qianfeng@123'
3.主库
3.1创建binlog日志存放路径,并授权
mkdir /var/log/mysql -p
授权
chown -R mysql.mysql /var/log/mysql
3.2编辑MySQL配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
server-id = 163
log-bin=/data/binlog/mysql-bin
#打开gtid模式
gtid_mode=ON
enforce_gtid_consistency=1
# 重启MySQL
[root@master ~]# systemctl restart mysqld
从库
# 修改MySQL配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id = 164
#打开gtid模式
gtid_mode=ON
enforce_gtid_consistency=1
# 重启MySQL
[root@slave ~]# systemctl restart mysqld
主库
(这是为了防止在做主从复制时候,数据库仍然会写入数据,先进行锁表,在解表)
登入MySQL
插入数据
然后锁表
mysql > flush tables with read lock;
打开新的窗口
备份
# mysqldump -uroot -p'密码' -A --master-data > all.sql
远程传输到从库服务器中
创建远程复制的用户
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'Qf_123456';
解表
unlock tables;
从库
首先恢复数据
登录mysql :
mysql > source + 远程传输过来的文件路径
进行主从复制
mysql> CHANGE MASTER TO
-> MASTER_HOST='master',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='Qf_123456',
-> MASTER_AUTO_POSITION=1;
开始主从复制服务:
mysql > start slave;
查看主从复制状态:
mysql > show slave status\G
Replication故障排除
1.开启 GTID 后的导出导入数据的注意点
意思是: 当前数据库实例中开启了 GTID 功能, 在开启有 GTID 功能的数据库实例中, 导出其中任何一个库, 如果没有显示地指定--set-gtid-purged参数, 都会提示这一行信息. 意思是默认情况下, 导出的库中含有 GTID 信息, 如果不想导出包含有 GTID 信息的数据库, 需要显示地添加--set-gtid-purged=OFF参数.
mysqldump -uroot -p --set-gtid-purged=OFF --all-databases > alldb.db
导入数据是就可以相往常一样导入了。
2.UUID一致,导致主从复制I/O线程不是yes
致命错误:由于master和slave具有相同的mysql服务器uuid,导致I/O线程不进行;这些uuid必须不同才能使复制工作。
问题提示主从使用了相同的server UUID,一个个的检查:
检查主从server_id
主库:
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
从库:
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
server_id不一样,排除。
检查主从状态:
主库:
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 849
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 21c27a81-633b-11ea-8d7d-00163e064efa:1-3
1 row in set (0.00 sec)
从库:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.31.47.161
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 849
File一样,排除。
最后检查发现他们的auto.cnf中的server-uuid是一样的。
[root@localhost ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f