第二章 Linux学习之MySQL GTID主从同步

系列文章目录

第一章 Linux学习之MySQL传统主从同步
第二章 Linux学习之MySQL GTID主从同步
第三章 Linux学习之MySQL MHA高可用集群架构
第四章 Linux学习之MySQL MGR集群
第五章 Linux学习之MySQL mycat
第六章 Linux学习之MySQL Redis
第七章 Linux学习之MongoDB 主从同步



前言

linux学习之mysql的GTID主从同步,连接主库与一台从库。


一、什么是GTID?

概念:
  从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID保证了每个在主库上提交的事务在集群中有一个唯一的ID。

  这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

  在原来基于二进制日志的复制,从库需要告知主库要从哪个偏移量进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

  GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

  下面是一个GTID的具体形式:03a1eb63-c21a-11ec-b07f-000c2987bea6:1-25,冒号分割前边为UUID,后边为TID。

  GTID 集合可以包含来自多个 MySQL 实例的事务,它们之间用逗号分隔。

  如果来自同一MySQL实例的事务序号有多个范围区间,各组范围之间用冒号分隔。
例如: 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6,03a1eb63-c21a-11ec-b07f-000c2987bea6:1-25
可以使用show master status实时查看当前事务执行数。

原理:
①当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
②binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置GTID_next变量,即告诉Slave,下一个要执行的GTID值。
③sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
④如果有记录,说明该GTID的事务已经执行,slave会忽略。
⑤如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
⑥在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

环境:

角色IP主机名
master192.168.10.11server11
slave192.168.10.12server12

二、实现步骤

1.配置主库

配置/etc/my.cnf:

log-bin=mysql-bin --------》开启二进制日志
server-id=11 --------》服务器ID,必须唯一
gtid-mode=on --------》开启gtid模式
enforce-gtid-consistency=on --------》强制gtid一致性,开启后对特定的create table不支持
binlog-format=row --------》默认为mixed混合模式,更改成row复制,为了数据一致性
log-slave-updates=1 --------》从库binlog记录主库同步的操作日志
skip-slave-start=1 --------》跳过slave复制线程
binlog-ignore-db=mysql

重启MySQL:

[root@server11 ~]# systemctl restart mysqld

在主数据库里创建一个同步账户授权给从数据库使用:

mysql> grant replication slave on *.* to 'repl'@'192.168.10.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)

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

查看GTID模式状态:

[root@server11 ~]# mysql -uroot -p1234 -e 'show variables like "%GTID%";'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+

2.配置从库

配置/etc/my.cnf:

log-bin=mysql-bin
server-id=12
gtid-mode=on
enforce-gtid-consistency=on
binlog-format=row
log-slave-updates=1
skip-slave-start=1

重启MySQL:

[root@server12 ~]# systemctl restart mysqld

查看GTID模式状态:

[root@server12 ~]# mysql -uroot -p1234 -e 'show variables like "%GTID%";'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+

3.开启主从同步

使用GTID方式同步的时候,必须指定master_auto_position=1
GTID使用master_auto_position=1代替了基于binlog和position号的主从同步方式,更便于主从同步的搭建

[root@server12 ~]# mysql -uroot -p1234
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to
     master_host='192.168.10.11',
     master_user='repl',
     master_password='1234',
     master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: server12-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          ......
1 row in set (0.00 sec)

查看主从库的信息是否同步:
查看主库

[root@server11 ~]# mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

查看从库

[root@server12 ~]# mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

4.测试主从同步

主库创建数据:

CREATE DATABASE BOOK;
USE BOOK;
CREATE TABLE book (name char(66),price int,pages int);
INSERT INTO book(name,price,pages) VALUES('Linux','30','666');
INSERT INTO book(name,price,pages) VALUES('Cloud Computing','60','666');
INSERT INTO book(name,price,pages) VALUES('Operation System','80','666');
INSERT INTO book(name,price,pages) VALUES('Artificial Intelligence','166','666');
select * from book;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| BOOK               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from BOOK.book;
+-------------------------+-------+-------+
| name                    | price | pages |
+-------------------------+-------+-------+
| Linux                   |    30 |   666 |
| Cloud Computing         |    60 |   666 |
| Operation System        |    80 |   666 |
| Artificial Intelligence |   166 |   666 |
+-------------------------+-------+-------+
4 rows in set (0.00 sec)

从库查看数据:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| BOOK               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from BOOK.book;
+-------------------------+-------+-------+
| name                    | price | pages |
+-------------------------+-------+-------+
| Linux                   |    30 |   666 |
| Cloud Computing         |    60 |   666 |
| Operation System        |    80 |   666 |
| Artificial Intelligence |   166 |   666 |
+-------------------------+-------+-------+
4 rows in set (0.00 sec)

查看状态:

#主库状态

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |     1620 |              |                  | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
#从库状态

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |     1584 |              |                  | 03a1eb63-c21a-11ec-b07f-000c2987bea6:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

从库停掉同步后,主库数据改变,从库连接后数据同步。


总结

本文介绍了MySQL的GTID主从同步,用于学习笔记。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值