Skip to content

Commit

Permalink
sql statement: fix SQL syntax error (#14600) (#14604)
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-chi-bot authored Jul 24, 2023
1 parent 43e6fb5 commit 04461d1
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
14 changes: 7 additions & 7 deletions dm/dm-safe-mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ summary: 介绍 DM safe mode 作用和原理

安全模式 (safe mode) 是 DM 在进行增量同步时候的一种运行模式,在安全模式中,DM 增量同步组件在同步 binlog event 时,将把所有 `INSERT``UPDATE` 操作强制进行改写后再在下游执行。

安全模式的目的是在增量同步过程中,同一条 binlog event 能够在下游被重复同步且保证幂等性,从而确保增量同步能够“安全”进行。
安全模式的目的是在增量同步过程中,同一条 binlog event 能够在下游被重复同步且保证幂等性,从而确保增量同步能够“安全”进行。

DM 从 checkpoint 恢复数据同步任务后,可能重复执行某些 binlog 事件而导致下述问题:

Expand All @@ -28,20 +28,20 @@ DM 从 checkpoint 恢复数据同步任务后,可能重复执行某些 binlog

比如,假设一张表 `dummydb.dummytbl` 的主键是 `id`,在这张表中重复执行下面的 SQL 语句:

```
```sql
INSERT INTO dummydb.dummytbl (id, int_value, str_value) VALUES (123, 999, 'abc');
UPDATE dummydb.dummytbl SET int_value = 888999 WHERE int_value = 999 # 假设没有其他 int_value = 999的数据
UPDATE dummydb.dummytbl SET id = 999 WHERE id = 888 # 更新主键操作
UPDATE dummydb.dummytbl SET int_value = 888999 WHERE int_value = 999; # 假设没有其他 int_value = 999的数据
UPDATE dummydb.dummytbl SET id = 999 WHERE id = 888; # 更新主键操作
```

启用安全模式后,上述 SQL 语句再次在下游执行时,会被改写为下面的 SQL 语句:

```
```sql
REPLACE INTO dummydb.dummytbl (id, int_value, str_value) VALUES (123, 999, 'abc');
DELETE FROM dummydb.dummytbl WHERE id = 123;
REPLACE INTO dummydb.dummytbl (id, int_value, str_value) VALUES (123, 888999, 'abc')
REPLACE INTO dummydb.dummytbl (id, int_value, str_value) VALUES (123, 888999, 'abc');
DELETE FROM dummydb.dummytbl WHERE id = 888;
REPLACE INTO dummydb.dummytbl (id, int_value, str_value) VALUES (999, 888888, 'abc888');
REPLACE INTO dummydb.dummytbl (id, int_value, str_value) VALUES (999, 888888, 'abc888');
```

上述语句中,`UPDATE` 被改写为 `DELETE` + `REPLACE`,而不是 `DELETE` + `INSERT`。如果这里使用 `INSERT`,那么 `id = 999` 的记录在已经存在的情况下重复插入时,数据库会报错主键冲突。因此这里使用了 `REPLACE`,新的记录会替换之前已经插入的记录。
Expand Down
2 changes: 1 addition & 1 deletion sql-statements/sql-statement-create-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ SELECT * FROM t ORDER BY lower(col1);
{{< copyable "sql" >}}

```sql
SELECT max(lower(col1)) FROM t
SELECT max(lower(col1)) FROM t;
SELECT min(col1) FROM t GROUP BY lower(col1);
```

Expand Down

0 comments on commit 04461d1

Please sign in to comment.