MySql8.0主从复制跳过错误sql
在 MySQL 8.0 中,主从复制时可以通过以下几种方式跳过错误的 SQL 语句:
1. 使用 sql_slave_skip_counter 跳过错误
如果从库(从节点)在复制过程中遇到错误,可以使用 sql_slave_skip_counter 参数跳过指定数量的事件。
示例
假设从库在复制时遇到错误,可以按照以下步骤跳过错误:
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1; -- 跳过一个事件
START SLAVE;
sql_slave_skip_counter的值表示跳过的事件数量。通常设置为1,表示跳过一个事件。
2. 使用 slave_exec_mode 设置幂等模式
在从库上设置 slave_exec_mode 为 IDEMPOTENT,可以使从库在遇到错误时自动跳过错误的事件。
示例
STOP SLAVE;
SET GLOBAL slave_exec_mode = 'IDEMPOTENT';
START SLAVE;
- 幂等模式:在这种模式下,从库会尝试跳过错误的事件,而不是停止复制。
3. 基于 GTID 跳过错误事务
如果主从复制使用了 GTID(全局事务标识符),可以通过设置 GTID 来跳过特定的事务。
示例
假设从库遇到错误,可以通过以下步骤跳过错误的事务:
STOP SLAVE;
SET @@SESSION.GTID_NEXT= '错误的GTID'; -- 替换为实际的 GTID
BEGIN; COMMIT;
SET SESSION GTID_NEXT = AUTOMATIC;
START SLAVE;
GTID:全局事务标识符,用于唯一标识每个事务。需要从错误日志中获取具体的 GTID。
4. 在配置文件中设置跳过错误
可以在 MySQL 的配置文件中设置 slave-skip-errors 参数,以跳过指定的错误代码。
示例
在 MySQL 配置文件(如 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)中添加以下内容:
[mysqld]
slave-skip-errors = 1032,1062,1452
1032:表示删除不存在的记录。1062:表示主键冲突。1452:表示外键约束错误。
注意事项
- 谨慎使用:跳过错误可能会导致数据不一致,因此在使用这些方法之前,需要确保跳过错误不会影响数据的完整性和一致性。
- GTID 复制:如果使用 GTID 复制,建议优先使用 GTID 相关的命令来跳过错误。
通过以上方法,你可以根据实际情况选择合适的方式跳过主从复制中的错误 SQL 语句。
在 MySQL 8.0 中,查询 GTID(全局事务标识符)信息可以通过多种方式完成。GTID 是用于唯一标识每个事务的全局唯一标识符,主要用于主从复制中跟踪事务的执行情况。以下是查询 GTID 的几种常见方法:
查询当前 GTID
1. 查询当前 GTID 执行状态
在从库(从节点)上,可以通过查询 SHOW SLAVE STATUS\G 来获取当前的 GTID 执行状态。
示例
SHOW SLAVE STATUS\G
在输出中,查找以下字段:
Executed_Gtid_Set:表示从库已经执行的 GTID 集合。Retrieved_Gtid_Set:表示从库已经从主库获取但尚未执行的 GTID 集合。Auto_Position:表示是否启用了 GTID 自动定位功能。
2. 查询主库的 GTID 状态
在主库(主节点)上,可以通过查询 SHOW MASTER STATUS\G 来获取当前的 GTID 状态。
示例
SHOW MASTER STATUS\G
在输出中,查找以下字段:
File:当前二进制日志文件名。Position:当前二进制日志位置。Binlog_Do_DB:正在记录的数据库。Binlog_Ignore_DB:忽略记录的数据库。Executed_Gtid_Set:主库已经执行的 GTID 集合。
3. 查询 GTID 模式是否启用
可以通过查询系统变量来确认 GTID 模式是否启用。
示例
SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
输出示例:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | ON |
+---------------+-------+
ON:表示 GTID 模式已启用。OFF:表示 GTID 模式未启用。
4. 查询 GTID 状态的详细信息
可以通过查询 performance_schema.global_status 表来获取更详细的 GTID 状态信息。
示例
SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME LIKE 'GTID%';
输出示例:
+--------------------------+-------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+--------------------------+-------------------+
| GTID_EXECUTED | 0-1-1, 0-1-2 |
| GTID_EXECUTED_NUMBER | 2 |
| GTID_NEXT | AUTOMATIC |
| GTID_NEXT_LIST | |
| GTID_OWNED | |
| GTID_OWNED_DEFAULT | |
| GTID_PURGED | 0-1-1 |
+--------------------------+-------------------+
5. 查询 GTID 的执行历史
可以通过查询 mysql.gtid_executed 表来获取 GTID 的执行历史。
示例
SELECT * FROM mysql.gtid_executed;
输出示例:
+----------------+------------+
| source_uuid | interval |
+----------------+------------+
| 00000000-0000-0000-0000-000000000000 | 0-1-1:0-1-2 |
+----------------+------------+
source_uuid:表示生成 GTID 的服务器的 UUID。interval:表示 GTID 的范围。
6. 查询 GTID 的当前状态
可以通过查询 mysql.gtid_slave_pos 表来获取从库的 GTID 当前状态。
示例
SELECT * FROM mysql.gtid_slave_pos;
输出示例:
+----------------+------------+
| source_uuid | interval |
+----------------+------------+
| 00000000-0000-0000-0000-000000000000 | 0-1-1:0-1-2 |
+----------------+------------+
source_uuid:表示生成 GTID 的服务器的 UUID。interval:表示 GTID 的范围。
总结
- 查询从库的 GTID 状态:使用
SHOW SLAVE STATUS\G。 - 查询主库的 GTID 状态:使用
SHOW MASTER STATUS\G。 - 确认 GTID 模式是否启用:查询
gtid_mode系统变量。 - 查询 GTID 的详细状态:查询
performance_schema.global_status表。 - 查询 GTID 的执行历史:查询
mysql.gtid_executed表。 - 查询 GTID 的当前状态:查询
mysql.gtid_slave_pos表。
通过这些方法,你可以全面了解 MySQL 中 GTID 的状态和执行情况。
1503





