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

本文介绍了MySQL中GTID(全局事务标识符)的概念及其在主从复制中的应用。GTID提供了一种简单且安全的方式来实现主从复制,避免了传统复制方法中寻找log_file和log_pos的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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


MySQL 5.7引入了GTID(Global Transaction Identifier)特性,这对于高可用性和故障恢复非常重要。GTID提供了一种跟踪跨多个数据库实例的事务的方式,使得主从复制更为可靠。下面是安装和配置MySQL 5.7 GTID主从的一般步骤: 1. **安装MySQL 5.7**: - 下载MySQL 5.7的二进制包,可以从MySQL官网下载适用于你操作系统的版本。 - 按照官方文档的指示进行安装,确保在安装过程中选择“GTID”作为复制模式。 2. **初始化主服务器**: - 配置my.cnf文件,开启GTID相关选项,例如设置`gtid_mode=ON` 和 `enforce_gtid_consistency=ON`。 - 启动MySQL服务并创建一个包含GTID的初始数据库实例。 3. **启用二进制日志**: - 在my.cnf中配置`log_bin`和`expire_logs_days`以管理二进制日志,这对主从复制至关重要。 4. **配置主从复制**: - 创建复制用户并分配合适的权限,如`REPLICATION SLAVE`。 - 在主服务器上执行`CHANGE MASTER TO`命令来指定从服务器的信息,包括GTID的位置(例如,`MASTER_GTID_FILE`和`MASTER_BINLOG_POS`)。 5. **启动从服务器**: - 使用相同的GTID配置启动从服务器。 - 运行`START SLAVE`命令,让从服务器开始同步数据。 6. **监控和调试**: - 定期检查`SHOW MASTER STATUS`和`SHOW SLAVE STATUS\G`来确保复制状态正常。 - 如果遇到问题,查看错误日志和使用`mysqlbinlog`工具分析事务历史。 **相关问题--:** 1. GTID是什么,它如何提高复制的可靠性? 2. 在配置主从复制时,如何正确设置`CHANGE MASTER TO`命令? 3. 有哪些常见的GTID复制问题及解决方法?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值