MySQL 主从复制是一种常见的数据库备份和读写分离解决方案。然而,由于各种原因,可能会导致主从复制中出现错误。这时,我们可以使用跳过报错的方式来强制使主从复制继续进行,本文将介绍跳过报错的完整攻略。
跳过报错的方式
在 MySQL 主从复制中,跳过报错的方式有两种:跳过单个 SQL 语句和跳过多个 SQL 语句。
跳过单个 SQL 语句
如果主库中某个 SQL 语句不能被从库正确执行,从库将会停止复制,此时我们可以使用 SQL_SKIP_COUNTER 选项继续复制。
具体步骤如下:
- 在从库上查看出错语句的具体信息,使用 SHOW SLAVE STATUS 命令,找到 Last_Error 字段,或者查看从库错误日志。
- 在主库上通过 mysqlbinlog 工具查看复制的二进制日志,找到出错语句的位置。
- 在从库上使用 STOP SLAVE 命令停止复制。
- 在从库上使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 命令跳过一个语句。如果需要跳过多个语句,将 1 替换成需要跳过的语句数量即可。
- 在从库上使用 START SLAVE 命令恢复复制。
这样就可以解决单个 SQL 语句的错误。
跳过多个 SQL 语句
如果多个 SQL 语句出错,可以使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER 命令跳过多个 SQL 语句。
具体步骤如下:
- 在从库上查看出错语句的具体信息,使用 SHOW SLAVE STATUS 命令,找到 Last_Error 字段,或者查看从库错误日志。
- 在主库上通过 mysqlbinlog 工具查看复制的二进制日志,找到出错语句的位置。
- 在从库上使用 STOP SLAVE 命令停止复制。
- 在从库上使用 mysql 命令行客户端连接主库,使用 SELECT @@GLOBAL.gtid_executed; 命令查看主库 GTID(全局事务标识符)。
- 在从库上使用 SET GLOBAL gtid_slave_pos='master_uuid:executed_gtid_set' 命令设置 GTID 复制位置,其中 master_uuid 是主库的 UUID,可以在主库上使用 SELECT @@server_uuid; 命令查看,executed_gtid_set 是在主库上使用 SELECT @@GLOBAL.gtid_executed; 命令查看到的 GTID,设置时需要将 UUID 和 GTID 使用逗号隔开。
- 在从库上使用 START SLAVE 命令恢复复制。
这样就可以解决多个 SQL 语句的错误。
示例说明
下面是两个关于跳过报错的示例说明:
示例1:跳过单个 SQL 语句
假设主库执行 SQL 语句:
CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
当从库执行该语句时,报错了,出错信息为:
ERROR 1060 (42S21): Duplicate column name 'id'
这时,我们可以跳过该语句,在从库上执行以下命令即可:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
这样就可以跳过报错语句继续复制。
示例2:跳过多个 SQL 语句
假设主库执行了多个 SQL 语句,从库在执行第二个语句时报错,出错信息为:
ERROR 1054 (42S22): Unknown column 'test' in 'field list'
此时我们可以使用以下步骤跳过多个语句。
首先,在从库上执行以下命令:
STOP SLAVE;
然后,在主库上使用 mysqlbinlog 工具查看复制的二进制日志,找到出错语句的位置,假设位置为 320,复制的 SQL 语句如下:
INSERT INTO `test` (`name`) VALUES ('hello');
INSERT INTO `test` (`test`) VALUES ('world');
执行以下命令跳过多个语句:
mysql> SET GLOBAL gtid_slave_pos='bb9f4463-7b89-11ea-9b33-0242ac1c0002:1-320';
mysql> START SLAVE;
这样,就可以跳过多个语句继续复制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql 主从复制如何跳过报错 - Python技术站