主从复制(gtid方式)

基于事务的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

主从复制(gtid方式)_第1张图片

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

修改uuid并重启服务

你可能感兴趣的:(MySQL,主从复制,gtid)