77 lines
2.3 KiB
Markdown
77 lines
2.3 KiB
Markdown
# MySQL 8.4 复制冲突解决指南
|
||||
|
|
|
|||
|
|
> **AI 响应规范 (MySQL 执行策略)**:
|
|||
|
|
> 1. **强制参数**: 所有 `docker exec` 命令必须包含 `-h127.0.0.1` 参数。
|
|||
|
|
> 2. **双重输出**: 涉及 SQL 操作时,必须同时输出 `Docker 执行命令` 和 `纯 SQL 脚本`。
|
|||
|
|
> 3. **默认连接**: 默认使用 `-uroot -pafe123456 -h127.0.0.1`。
|
|||
|
|
|
|||
|
|
## 1. 复制冲突解决(主键/唯一键重复)
|
|||
|
|
|
|||
|
|
### 1.1 快速定位冲突信息
|
|||
|
|
提取冲突 GTID、表、值(直接执行,自动解析错误日志):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
grep "Duplicate entry" /data/mysql/logs/mysql_error.log | perl -nle '
|
|||
|
|
if (/^(\S+).*?transaction\s+'\''([^'\'']+)'\''.*?table\s+([^\s;]+);.*?Duplicate entry\s+'\''([^'\'']+)'\''\s+for\s+key\s+'\''([^'\'']+)'\''/) {
|
|||
|
|
print "\n" . "="x50;
|
|||
|
|
print "时间: $1";
|
|||
|
|
print "GTID: $2";
|
|||
|
|
print "表名: $3";
|
|||
|
|
print "冲突值: $4 (索引: $5)";
|
|||
|
|
print "\n方案 A (删除冲突行):";
|
|||
|
|
print "DELETE FROM $3 WHERE [主键列] = \x27$4\x27;";
|
|||
|
|
print "\n方案 B (跳过此事务):";
|
|||
|
|
print "STOP REPLICA; SET GTID_NEXT=\x27$2\x27; BEGIN; COMMIT; SET GTID_NEXT=\x27AUTOMATIC\x27; START REPLICA;";
|
|||
|
|
}
|
|||
|
|
'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.2 安全修复冲突(推荐删除冲突数据)
|
|||
|
|
停止复制,临时关闭 binlog(避免删除操作同步到对端):
|
|||
|
|
|
|||
|
|
**A. Docker 执行模式 (包含 -h127.0.0.1):**
|
|||
|
|
```bash
|
|||
|
|
# 以实际冲突表和主键为例(示例:test_sync.t1 的 id=12)
|
|||
|
|
docker exec -it mysql mysql -uroot -pafe123456 -h127.0.0.1 -e "
|
|||
|
|
STOP REPLICA;
|
|||
|
|
SET sql_log_bin = OFF;
|
|||
|
|
DELETE FROM `test_sync`.`t1` WHERE `id` = 12;
|
|||
|
|
SET sql_log_bin = ON;
|
|||
|
|
START REPLICA;
|
|||
|
|
SHOW REPLICA STATUS\G;
|
|||
|
|
"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**B. 纯 SQL 模式:**
|
|||
|
|
```sql
|
|||
|
|
STOP REPLICA;
|
|||
|
|
SET sql_log_bin = OFF;
|
|||
|
|
DELETE FROM `test_sync`.`t1` WHERE `id` = 12;
|
|||
|
|
SET sql_log_bin = ON;
|
|||
|
|
START REPLICA;
|
|||
|
|
SHOW REPLICA STATUS\G;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.3 应急跳过冲突事务(仅紧急场景)
|
|||
|
|
精准跳过指定 GTID 事务(MySQL 8.0+ 推荐):
|
|||
|
|
|
|||
|
|
**A. Docker 执行模式 (包含 -h127.0.0.1):**
|
|||
|
|
```bash
|
|||
|
|
docker exec -it mysql mysql -uroot -pafe123456 -h127.0.0.1 -e "
|
|||
|
|
STOP REPLICA;
|
|||
|
|
SET GTID_NEXT = '760f0600-f896-11ef-b265-0242ac130002:6'; # 替换为实际冲突 GTID
|
|||
|
|
BEGIN; COMMIT;
|
|||
|
|
SET GTID_NEXT = 'AUTOMATIC';
|
|||
|
|
START REPLICA;
|
|||
|
|
"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**B. 纯 SQL 模式:**
|
|||
|
|
```sql
|
|||
|
|
STOP REPLICA;
|
|||
|
|
SET GTID_NEXT = '760f0600-f896-11ef-b265-0242ac130002:6';
|
|||
|
|
BEGIN; COMMIT;
|
|||
|
|
SET GTID_NEXT = 'AUTOMATIC';
|
|||
|
|
START REPLICA;
|
|||
|
|
```
|