mysql5.7 GTID 主从复制模式-传统复制改为GTID复制

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jolly10/article/details/80221892

一、GTID的概述:

1、全局事物标识:global transaction identifieds。

2、GTID事物是全局唯一性的,且一个事务对应一个GTID。

3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。

5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

6、在传统的slave端,binlog是不用开启的(log_slave_updates),在mysql5.6配置GTID,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制), 但是其增大了从服务器的IO负载, 而在MySQL 5.7中该选项已经不是必须项。

  

二、GTID的组成部分:

前面是server_uuid:后面是一个序列号

例如:server_uuid:sequence number

7800a22c-95ae-11e4-983d-080027de205a:10

UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。

Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。

 

三、GTID比传统复制的优势:

1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。

2、更简单的搭建主从复制。

3、比传统复制更加安全。

4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

 

四、GTID的工作原理:

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

五、配置GTID主从复制

当前的一样是传统的主从复制,测试的目的是将传统的主从复制改到GTID主从复制。

如果主从都是新库的话,还需要分别建立复制帐户并赋予相应的权限。

1.确定传统主从复制运行正常,并且所有的binlog都同步应用到从库后关闭数据库。

master:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql_bin.000043
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

slave:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.61.131
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_bin.000043
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave_relay_bin.000016
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql_bin.000043
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

master and slave:

[root@qht131 ~]# service mysql stop
Shutting down MySQL............                            [  OK  ]

2.确保主从是不一样的server-uuid,修改/etc/my.cnf

master:

[root@qht131 ~]# cat /u01/mysql/auto.cnf
[auto]
server-uuid=8d8746fb-2cc6-11e8-b1b6-000c295c63e0

slave:

[root@qht132 ~]#  cat /u01/mysql/auto.cnf
[auto]
server-uuid=744cfcde-3a9b-11e8-b299-000c2900d025

master:

[mysqld]
socket = /usr/local/mysql/mysql.sock
character_set_server= utf8
init_connect= 'SET NAMES utf8'
basedir= /usr/local/mysql
datadir= /u01/mysql
socket = /u01/mysql/mysql.sock
log-error= /u01/log/mysql/mysql_3306.err
pid-file= /u01/mysql/mysqld.pid
lower_case_table_names = 1
sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
secure-file-priv = /u01/backup
gtid_mode=on #开启gtid
enforce_gtid_consistency=on #强制gtid一致性,开启后create table ... select以及create/drop temporary table不被支持
server-id=10000 #服务器ID
skip_slave_start=1  #slave库打开后会稍后同步数据,等待change master to 执行后才同步数据,建议开启,避免slave开启后数据不同步
log_bin = /u01/mysql/mysql_bin
max_binlog_size=1G
binlog_format = row #强制建议用row
binlog_row_image = full
innodb_flush_log_at_trx_commit=1
sync_binlog=1
expire_logs_days=10

read_only=on #建议暂时只读状态打开master

slave:

[mysqld]
socket = /usr/local/mysql/mysql.sock
character_set_server= utf8
init_connect= 'SET NAMES utf8'
basedir= /usr/local/mysql
datadir= /u01/mysql
socket = /u01/mysql/mysql.sock
log-error= /u01/log/mysql/mysql_3306.err
pid-file= /u01/mysql/mysqld.pid
lower_case_table_names = 1
sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
secure-file-priv = /u01/backup
gtid_mode=on #开启gtid
enforce_gtid_consistency=on #强制gtid一致性
server-id=10001 #服务器ID
skip_slave_start=1 #slave库打开后会稍后同步数据
#log_bin = /u01/mysql/mysql_bin
#skip-grant-tables
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
relay-log=/u01/mysql/slave_relay_bin
expire_logs_days=10
relay_log_recovery=on
relay_log_info_repository=TABLE

3.开启主从数据库,配置主从连接:

master:

[root@qht131 ~]# service mysql start
Starting MySQL.                                            [  OK  ]

slave:

[root@qht131 ~]# service mysql start
Starting MySQL.                                            [  OK  ]
mysql> change master to
    -> master_host='172.17.61.131',
    -> master_user='repl',
    -> master_password='repl',
    -> master_port=3306,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

4.取消master read only,并验证主从复制

master:

[root@qht131 ~]# cat /etc/my.cnf
。。。
#read_only=on
[root@qht131 ~]# service mysql restart
Shutting down MySQL............                            [  OK  ]
Starting MySQL.                                            [  OK  ]
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

slave:

mysql> use l5m
Database changed
mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

同步没有问题!

5.最后重新做备份,因为之前的备份是没有GTID的,现在数据开启GTID后,原备份就不适用了。


参考:

http://www.cnblogs.com/luckcs/articles/6295992.html


展开阅读全文

没有更多推荐了,返回首页