一、GTID简介
GTID是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号!
GTID官方定义如下:
| GTID = source_id :transaction_id |
| 7E11FA47-31CA-19E1-9E56-C43AA21293967:29 |
什么是sever_uuid,和Server-id 区别?
核心特性: 全局唯一,具备幂等性!
二、GTID重要参数
| gtid-mode=on #启用gtid类型,否则就是普通的复制架构 |
| enforce-gtid-consistency=true #强制GTID的一致性 |
| log-slave-updates=1 #slave更新是否记入日志 |
三、实验环境
OS |
IP |
hostname |
service |
centos 7.5 |
192.168.1.1 |
db01 |
mysql 5.7.29 |
centos 7.5 |
192.168.1.2 |
db02 |
mysql 5.7.29 |
centos 7.5 |
192.168.1.3 |
db03 |
mysql 5.7.29 |
搭建mysql过程略!
四、清理环境
| [root@db01 ~]# systemctl stop mysqld |
| [root@db01 ~]# rm -rf /usr/local/mysql/data/* |
| #删除原始数据库下的目录,并且保证数据库是停止状态 |
五、准备配置文件
| master(db01) |
| [root@db01 ~]# cat > /etc/my.cnf << EOF |
| [mysqld] |
| basedir=/usr/local/mysql |
| datadir=/usr/local/mysql/data |
| socket=/usr/local/mysql/mysql.sock |
| server_id=1 |
| port=3306 |
| secure-file-priv=/tmp |
| autocommit=0 |
| log_bin=/usr/local/mysql/data/mysql-bin |
| binlog_format=row |
| gtid-mode=on |
| enforce-gtid-consistency=true |
| log-slave-updates=1 |
| [mysql] |
| prompt=db01[\\d]> |
| EOF |
| |
| slave1(db02) |
| [root@db02 ~]# cat > /etc/my.cnf << EOF |
| [mysqld] |
| basedir=/usr/local/mysql |
| datadir=/usr/local/mysql/data |
| socket=/usr/local/mysql/mysql.sock |
| server_id=2 |
| port=3306 |
| secure-file-priv=/tmp |
| autocommit=0 |
| log_bin=/usr/local/mysql/data/mysql-bin |
| binlog_format=row |
| gtid-mode=on |
| enforce-gtid-consistency=true |
| log-slave-updates=1 |
| [mysql] |
| prompt=db02[\\d]> |
| EOF |
| |
| slave2(db03) |
| [root@db03 ~]# cat > /etc/my.cnf << EOF |
| [mysqld] |
| basedir=/usr/local/mysql |
| datadir=/usr/local/mysql/data |
| socket=/usr/local/mysql/mysql.sock |
| server_id=3 |
| port=3306 |
| secure-file-priv=/tmp |
| autocommit=0 |
| log_bin=/usr/local/mysql/data/mysql-bin |
| binlog_format=row |
| gtid-mode=on |
| enforce-gtid-consistency=true |
| log-slave-updates=1 |
| [mysql] |
| prompt=db03[\\d]> |
| EOF |
六、初始化数据、启动数据库
| [root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data |
| [root@db01 ~]# systemctl start mysqld |
| #三台数据都需进行操作 |
七、构建主从
| db01[(none)]>grant replication slave on *.* to repl@'192.168.1.%' identified by '123'; |
| #主库创建主从复制专用用户 |
| db02[(none)]>change master to |
| master_host='192.168.1.1', |
| master_user='repl', |
| master_password='123', |
| master_auto_position=1; |
| db02[(none)]> start slave; |
| db03[(none)]>change master to |
| master_host='192.168.1.1', |
| master_user='repl', |
| master_password='123', |
| master_auto_position=1; |
| db03[(none)]> start slave; |
八、验证主从复制
| db01[(none)]>show master status; |
| +------------------+----------+--------------+------------------+----------------------------------------+ |
| | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | |
| +------------------+----------+--------------+------------------+----------------------------------------+ |
| | mysql-bin.000002 | 447 | | | 8365c1b0-813e-11ea-a031-000c29667213:1 | |
| +------------------+----------+--------------+------------------+----------------------------------------+ |
| #注意GTID号 |
| db02[(none)]>show slave status \G |
| Retrieved_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1 #需要恢复的GTID号 |
| Executed_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1 #已经执行的GTID号 |
| db03[(none)]>show slave status \G |
| Retrieved_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1 |
| Executed_Gtid_Set: 8365c1b0-813e-11ea-a031-000c29667213:1 |
| #从库上的GTID号与主库上的GTID号保持一致,表示同步没有问题 |
九、GTID 复制和普通复制的区别
| CHANGE MASTER TO |
| MASTER_HOST='192.168.1.1', |
| MASTER_USER='repl', |
| MASTER_PASSWORD='123', |
| MASTER_PORT=3307, |
| MASTER_LOG_FILE='mysql-bin.000001', |
| MASTER_LOG_POS=444, |
| MASTER_CONNECT_RETRY=10; |
| |
| change master to |
| master_host='192.168.1.1', |
| master_user='repl', |
| master_password='123' , |
| MASTER_AUTO_POSITION=1; |
| |
| 0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover |
| 1)额外功能参数(3个) |
| 2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1; |
| 3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号 |
| 4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式 |
| SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1'; |
| 告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。 |
注意:gtid的主从复制,第一次开启时,读取relaylog的最后gtid+gtid_purge参数,确认复制起点!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律