GTID AUTO_POSITION MODE的主从
搭建主从模式
注意,主备库必须开启GTID并设置好server_id:
enforce_gtid_consistency = ON # 开启强制GTID一致性,防止非GTID事务复制
gtid_mode = ON # 开启GTID
server_id = 9910 # 主主或者主从配置必须不一样
binlog_format = row
主从库都开启 binary log。如果不设置级联从库,那么从库不需要开启参数 log_slave_updates。
log_bin = /usr/local/data/data_3306/binlog/mysql-bin # 开启binlog
log_slave_updates = 1 # 从服务器也记录二进制日志,级联从库,一主一从不需要开启这个参数
创建复制用户并赋权限
CREATE USER 'repl'@'%' IDENTIFIED BY '***'
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'
导出主库数据
mysqldump --single-transaction --master-data=2 -R -E --triggers --all-databases > exporter.sql
从库导入数据
mysql -e "exporter.sql"
从库执行reset master命令
这一步主要防止gtid_executed表在导入数据的过程中被覆盖,我们在MySQL 5.7的某些 版本中遇到过这种情况。一旦从库再次重启,读取 gtid_executed 表就会得到错误的 gtid_executed变量,进而导致从库启动失败。因此最好重新设置gtid_purged变量。
reset master;
提取gtid_purged变量,并且执行。
使用head-n 40命令打印刚刚导出的sql数据,可以快速得到gtid_purged变量
# 从库执行
SET @@GLOBAL.GTID_PURGED='刚刚提取到的GTID值'
使用MASTER_AUTO_POSITION建立同步
# 从库执行
change master to master_host='***',master_password='***',master_port=3310,MASTER_AUTO_POSITION=1;
启动slave
start slave;
查看slave状态
查看Slave_IO_Running
和Slave_SQL_Running
的状态是否为Yes
,以及是否有任何错误或警告信息。
主主模式
一句话概括即为两个或多个库互为主从
主从切换
切换必须保证主从没有延迟,可以通过对照主从库的gtid_executed变量进行确认。同 时,切换时必须要确认原从库(新主库)没有做过本地GTID操作。如果原从库(新主库) 做过本地GTID操作,那么切换后新从库(原主库)需要拉取这一部分的GTID Event,如果 部分Event已经不存在了,那么会报错,即著名的1236错误。
原从库(新主库)执行
stop slave;
reset slave all;
原主库(新从库执行
change master to master_host='***',master_password='***',master_port=3310,MASTER_AUTO_POSITION=1;start slave;
新主库(原从库)会生成自己的GTID事务,新从库(原主库)接 受后执行即可。切换后主库的gtid_executed变量会出现两个server_uuid,
一些特殊的配置项的解释
binlog_format
在MySQL中,将binlog_format
设置为ROW
具有多重重要作用,主要体现在以下几个方面:
1. 数据一致性保障
- 详细记录行变更:
ROW
格式记录的是每一行数据的具体变更情况,而不是执行的SQL语句。这意味着,无论SQL语句如何复杂,ROW
格式都能确保准确地记录下每行数据的修改。 - 避免主从不一致:在涉及随机函数(如
NOW()
、UUID()
)、自增字段等情况下,STATEMENT
格式可能会导致主从数据库之间的数据不一致。而ROW
格式则不会出现这种问题,因为它记录的是数据变更的结果,而不是SQL语句本身。
2. 优化复制性能
- 高效处理复杂SQL:对于执行时间较长但只修改了少量行数据的复杂SQL语句,
ROW
格式能够更高效地处理。因为它只记录实际发生变化的行,而不是整个SQL语句的执行过程。 - 减少从库扫描:在主从复制环境中,如果主库上的SQL语句操作了大量数据,那么在从库上回放binlog时,
ROW
格式能够减少全表扫描的次数,从而提高复制效率。
3. 支持更多复制场景
- 数据类型差异:即使主库和从库上的数据类型或表结构存在微小差异,
ROW
格式也能确保复制过程顺利进行。因为它记录的是数据变更的结果,而不是依赖于具体的SQL语法或数据类型。 - 跨版本复制:在不同版本的MySQL之间进行复制时,
ROW
格式通常具有更好的兼容性。因为它不依赖于特定版本的SQL语法或功能。
4. 提供更详细的审计信息
- 记录数据变更历史:
ROW
格式的binlog记录了每行数据的变更历史,这对于数据审计、故障排查等场景非常有用。 - 支持数据恢复:在数据丢失或损坏的情况下,可以使用
ROW
格式的binlog来恢复数据。因为它记录了每行数据的具体变更情况,所以能够精确地恢复到某个时间点或某个操作之前的状态。
综上所述,将binlog_format
设置为ROW
能够保障数据一致性、优化复制性能、支持更多复制场景以及提供更详细的审计信息。因此,在需要高数据一致性和复制可靠性的场景中,推荐使用ROW
格式来配置binlog。
skip_slave_start
skip_slave_start
是MySQL数据库中的一个参数,它用于控制从库(Slave)在启动时是否跳过复制过程。以下是对skip_slave_start
参数的详细解释:
一、参数作用
- 当
skip_slave_start
参数设置为ON
时,从库在启动时会自动跳过复制过程,不会连接到主库(Master)进行数据同步。 - 当
skip_slave_start
参数设置为OFF
(默认值)时,从库在启动时会自动启动复制进程,并连接到主库进行数据同步。
二、使用场景
- 从库故障恢复:在从库出现故障并需要进行恢复时,可以设置
skip_slave_start=ON
,以避免在恢复过程中与主库进行数据同步,从而防止潜在的问题。 - 大规模数据导入:在从库需要进行大规模数据导入时,可以设置
skip_slave_start=ON
,以暂停从库的复制进程,确保数据导入的顺利进行。 - 维护操作:在进行从库的维护操作(如升级、配置调整等)时,也可以设置
skip_slave_start=ON
,以避免在维护过程中与主库进行数据同步,从而简化维护流程。
三、查看和修改参数值
- 查看参数值:可以使用以下SQL命令查看
skip_slave_start
参数的值:
SHOW VARIABLES LIKE 'skip_slave_start';
- 修改参数值:可以使用以下SQL命令修改
skip_slave_start
参数的值:
SET GLOBAL skip_slave_start = ON; -- 设置为ON,跳过复制过程 SET GLOBAL skip_slave_start = OFF; -- 设置为OFF,启动复制进程
四、注意事项
- 修改
skip_slave_start
参数可能会对数据库复制产生重要影响,因此在进行此类操作之前应谨慎考虑,并确保已经备份了所有重要的数据。 - 在从库恢复正常或完成数据导入后,应及时将
skip_slave_start
参数设置回OFF
,以恢复从库的复制进程。
综上所述,skip_slave_start
参数是MySQL数据库中用于控制从库启动时是否跳过复制过程的重要参数。在合适的场景下使用该参数,可以有效地避免潜在的问题,并简化数据库维护流程。
gtid_mode
在MySQL中,GTID(Global Transaction Identifier)模式是一种用于确保数据一致性和可靠性的复制机制。要在线开启GTID_MODE,可以按照以下步骤进行:
一、检查MySQL版本和GTID状态
- 确认MySQL版本:确保你的MySQL版本是5.7.6或更高版本,因为GTID功能是在这个版本中引入的。
- 检查GTID状态:在执行开启操作之前,最好先检查当前的GTID状态。可以使用以下SQL命令来查看:
SHOW VARIABLES LIKE 'gtid_mode'; SHOW VARIABLES LIKE 'enforce_gtid_consistency';
二、设置GTID模式
- 设置enforce_gtid_consistency:首先,需要将
enforce_gtid_consistency
设置为WARN
或ON
。WARN
模式会在检测到不一致性时发出警告,而ON
模式则会阻止不一致的操作。建议使用ON
以确保数据一致性。
sql复制代码SET GLOBAL ENFORCE_GTID_CONSISTENCY = 'ON';
- 切换GTID模式:GTID模式的切换需要经历几个过渡状态。首先,将
gtid_mode
设置为OFF_PERMISSIVE
,允许现有的基于语句的复制(STATEMENT-based replication)继续运行,但不允许新的基于语句的复制事务开始。然后,将其设置为ON_PERMISSIVE
,此时GTID复制和基于语句的复制都可以运行,但新的基于语句的复制事务会被分配GTID。最后,将其设置为ON
,完全启用GTID模式。
SET GLOBAL GTID_MODE = 'OFF_PERMISSIVE'; -- 等待所有现有的基于语句的复制事务完成
SET GLOBAL GTID_MODE = 'ON_PERMISSIVE'; -- 确保所有新的复制事务都使用GTID
SET GLOBAL GTID_MODE = 'ON';
三、修改配置文件并重启MySQL(可选)
虽然可以通过SQL命令在线开启GTID模式,但为了确保配置在MySQL重启后仍然有效,建议在MySQL的配置文件(如my.cnf或my.ini)中添加相应的配置参数。
ini复制代码[mysqld] gtid_mode=ON enforce_gtid_consistency=ON
修改配置文件后,需要重启MySQL服务以使更改生效。但请注意,在大多数情况下,如果已经在线设置了GTID模式,并且确认所有复制事务都已使用GTID,则可能不需要重启MySQL服务。
四、配置主从复制(如果尚未配置)
在开启GTID模式后,需要配置主从复制以确保数据能够正确同步。这包括在主库上设置复制用户、在从库上配置复制源信息等。具体步骤可能因MySQL版本和具体需求而有所不同,但通常涉及以下SQL命令:
-- 在主库上创建复制用户
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'replication_password'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; FLUSH PRIVILEGES;
-- 在从库上配置复制源信息
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='replication_user', MASTER_PASSWORD='replication_password', MASTER_AUTO_POSITION=1;
-- 启动从库复制进程 START SLAVE;
五、验证GTID复制状态
最后,使用以下SQL命令验证GTID复制状态,确保主从复制正常运行:
sql复制代码SHOW SLAVE STATUS\G;
在输出结果中,检查Slave_IO_Running
和Slave_SQL_Running
是否都为Yes
,以及Last_Error
是否为空。如果一切正常,则表示GTID复制已成功配置并正在运行。
请注意,以上步骤可能因MySQL版本和具体环境而有所不同。在执行任何操作之前,请务必备份数据库数据以防止意外发生。
log_slave_updates
log_slave_updates
是MySQL数据库中的一个重要参数,与主从复制功能紧密相关。以下是对log_slave_updates
参数的详细解释:
一、定义与作用
log_slave_updates
是一个布尔类型的参数,决定了在从服务器(Slave)上是否将接收到的复制事件(即从主服务器传来的二进制日志事件)记录到从服务器自己的二进制日志中。
- 当
log_slave_updates
设置为ON
时,从服务器会将通过复制接收到并执行的更新操作写入自己的二进制日志中。这使得连接到此从服务器的其他从服务器也能接收到这些自主服务器同步过来的更新,从而支持多级复制配置(如链式复制或星形复制)。 - 当
log_slave_updates
设置为OFF
(默认值)时,从服务器只执行主服务器发送的事件,但不会将这些事件记录到自己的二进制日志中。因此,附加到此从服务器的其他服务器不会收到从主服务器复制的更新。
二、使用场景
- 多级复制配置:在需要构建多级复制拓扑结构时,如链式复制或星形复制,需要启用
log_slave_updates
参数。这样,从服务器可以将其接收到的更新操作记录到二进制日志中,并传递给更下一级的从服务器,实现数据的级联复制。 - 数据恢复与一致性:在某些情况下,如果主服务器发生故障,可能需要从从服务器恢复数据。如果启用了
log_slave_updates
,从服务器的二进制日志将包含更多关于主服务器更新的信息,有助于确保数据恢复的一致性和完整性。
三、配置方法
- 在配置文件中设置:通常,可以通过修改MySQL的配置文件(如
my.cnf
或my.ini
)来设置log_slave_updates
参数。在配置文件的[mysqld]
部分添加以下行:
ini复制代码log_slave_updates = ON
修改配置文件后,需要重启MySQL服务以使更改生效。
- 使用SQL命令设置:也可以通过SQL命令来设置
log_slave_updates
参数。但是,请注意,这种设置方式在MySQL重启后会失效。可以使用以下命令来设置:
sql复制代码SET GLOBAL log_slave_updates = ON;
四、注意事项
- 性能影响:启用
log_slave_updates
会增加从服务器的磁盘I/O负载,因为它需要额外地记录复制事件到二进制日志。这可能会影响性能,并增加磁盘空间使用。因此,在决定是否开启此参数时,需要考虑到可能的硬件资源消耗和网络流量增加。 - 二进制日志管理:如果启用了
log_slave_updates
,应确保对从服务器的二进制日志进行管理,例如设置过期时间,以避免磁盘空间被无限占用。
综上所述,log_slave_updates
参数在MySQL主从复制中起到了关键的作用,它可以支持多级复制配置,并有助于确保数据的一致性和完整性。但是,在启用此参数时,需要考虑其对性能和资源的影响,并进行适当的配置和管理。
MASTER_AUTO_POSITION
MASTER_AUTO_POSITION
是MySQL数据库主从复制配置中的一个关键选项,特别是在基于GTID(全局事务标识符)的复制环境中。以下是对MASTER_AUTO_POSITION
的详细解释:
一、定义与作用
MASTER_AUTO_POSITION
是一个布尔参数,用于设置从服务器(Slave)在连接到主服务器(Master)时是否自动检测和应用主服务器的二进制日志(binlog)文件中的更新。
- 当
MASTER_AUTO_POSITION
设置为1
(启用)时,从服务器会自动获取并应用来自主服务器的二进制日志文件中的事务,而无需手动指定MASTER_LOG_FILE
和MASTER_LOG_POS
参数。这简化了主从复制的配置过程,并减少了人为错误的可能性。 - 当
MASTER_AUTO_POSITION
设置为0
(禁用)时,从服务器需要手动指定MASTER_LOG_FILE
和MASTER_LOG_POS
参数来定位主服务器的二进制日志文件中的特定位置,并从该位置开始复制数据。
二、工作原理
在基于GTID的复制环境中,MASTER_AUTO_POSITION
的工作原理如下:
- 从库发送已有GTID:在握手阶段,从库会向主库发送已经提交过的以及接收过的GTID集合。这些GTID集合通过查询
gtid_executed
变量和PERFORMANCE_SCHEMA.replication_connection_status
表中的RECEIVED_TRANSACTION_SET
字段得出。 - 主库发送剩余GTID事务:主库会向从库发送其二进制日志文件中所有未包含在从库发送的GTID集合中的事务。这样就保证了主库不会发送从库已经拥有的GTID的事务,从而避免了数据的重复应用。
三、配置方法
在配置主从复制时,可以通过CHANGE MASTER TO
语句来设置MASTER_AUTO_POSITION
参数。例如:
CHANGE MASTER TO MASTER_HOST='<主服务器的IP地址>', MASTER_USER='<主服务器的用户名>', MASTER_PASSWORD='<主服务器的密码>', MASTER_AUTO_POSITION=1;
请注意,将MASTER_AUTO_POSITION
设置为1
时,无需再指定MASTER_LOG_FILE
和MASTER_LOG_POS
参数。
四、注意事项
- GTID功能必须开启:
MASTER_AUTO_POSITION
参数仅在GTID功能开启时有效。因此,在配置主从复制之前,需要确保主服务器和从服务器的GTID功能都已开启。 - 避免数据丢失:如果在已经使用
MASTER_AUTO_POSITION
的复制环境中尝试手动设置MASTER_LOG_FILE
和MASTER_LOG_POS
参数,将会导致错误。此时,需要先将MASTER_AUTO_POSITION
设置为0
,然后再进行手动设置。但是,这样做可能会导致数据丢失或不一致,因此应谨慎操作。 - 监控与维护:在启用
MASTER_AUTO_POSITION
后,应定期监控主从复制的状态和性能,以确保复制过程的稳定性和可靠性。此外,还需要定期清理过期的二进制日志文件以释放磁盘空间。
综上所述,MASTER_AUTO_POSITION
是MySQL数据库主从复制配置中的一个重要选项,它简化了复制过程并减少了人为错误的可能性。但是,在配置和使用时需要注意相关的事项和限制条件以确保复制过程的正确性和稳定性。
查看gtid_mode
开启了gtid_mode
但是查不到GTID信息,可能的原因有多种。以下是一些可能的解释和排查步骤:
一、确认GTID模式是否真正开启
-
检查GTID模式设置:
使用以下SQL命令检查gtid_mode
的设置:SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
确保返回的结果中
gtid_mode
的值为ON
或ON_PERMISSIVE
。如果值为OFF
或OFF_PERMISSIVE
,则表示GTID模式未开启或处于过渡状态。 -
检查配置文件:
查看MySQL的配置文件(如my.cnf
或my.ini
),确保其中包含了gtid_mode=ON
的设置。同时,也要检查是否有其他配置可能导致GTID模式未生效,如log_bin
必须设置为启用状态。
二、检查MySQL版本和存储引擎
-
确认MySQL版本:
GTID是MySQL 5.6及以上版本引入的特性。如果MySQL版本低于5.6,则无法使用GTID。 -
检查存储引擎:
确保使用的存储引擎支持GTID。通常,InnoDB是支持GTID的,而MyISAM等不支持事务的存储引擎则不支持GTID。
三、查看GTID执行和已清除的GTID
-
查看已执行的GTID:
使用以下SQL命令查看已经执行的GTID集合:SELECT @@global.gtid_executed;
如果返回结果为空或未包含预期的GTID,则可能表示没有事务在GTID模式下提交。
-
查看已清除的GTID:
使用以下SQL命令查看已经从gtid_executed
集合中清除的GTID(通常是由于事务回滚或主从复制延迟等原因):SHOW GLOBAL VARIABLES LIKE 'gtid_purged';
如果
gtid_purged
的值非空,则可能表示一些GTID已经被清除。
四、检查复制状态和网络连接
-
检查主从复制状态:
如果MySQL实例是主从复制的一部分,确保主库和从库的复制状态正常。使用以下SQL命令在从库上检查复制状态:SHOW SLAVE STATUS \G;
查看
Slave_IO_Running
和Slave_SQL_Running
的状态是否为Yes
,以及是否有任何错误或警告信息。 -
检查网络连接:
确保主库和从库之间的网络连接正常。网络延迟或不稳定可能导致数据传输失败,从而影响GTID的复制和查询。
五、其他可能的因素
-
事务隔离级别:
某些事务隔离级别(如READ_UNCOMMITTED
)可能不会生成GTID。确保使用的事务隔离级别支持GTID。 -
权限问题:
确保有足够的权限来访问和查询GTID相关的信息。 -
服务器重启:
如果MySQL服务器在开启GTID模式后重启过,可能会导致一些GTID信息的丢失或不一致。在这种情况下,需要重新同步主从库的数据。
综上所述,如果开启了gtid_mode
但是查不到GTID信息,可以从以上几个方面进行排查和修复。如果问题仍然存在,建议联系MySQL官方或专业的数据库管理员进行进一步的诊断和处理。
参考资料
- MySQL数据库技术之双主同步架构配置[GTID模式]_mysql 双主gtid模式可以吗-CSDN博客
- MySQL数据库技术之双主同步架构配置[传统模式]_数据库双主同步跳过初始化-CSDN博客
- 《深入理解mysql主从原理 高鹏著》