sing-ui/docs/tidb-serializable-isolation.md

54 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TiDB 目标库Error 8048 isolation level 'SERIALIZABLE' is not supported
## 现象
目标库为 TiDB 时sling 数据迁移在每个 stream 的写入阶段失败:
```
writing to target database [mode: truncate]
created table `test_demo`.`crm_orders_tmp`
execution failed
Error 8048 (HY000): The isolation level 'SERIALIZABLE' is not supported.
Set tidb_skip_isolation_level_check=1 to skip this error
```
## 原因
TiDB 不支持 `SERIALIZABLE` 隔离级别TiDB 默认使用乐观锁/快照隔离。sling
在目标端开启事务时请求了 `SERIALIZABLE`TiDB 默认会直接报错拒绝。
TiDB 提供了兼容开关 `tidb_skip_isolation_level_check=1`:设置后跳过隔离级别
检查,按 TiDB 实际支持的级别执行。对"测试环境 → 本地 dev 库"的全量数据灌入
场景,这是安全的。
## 解决:连接参数
在 sling-ui 中编辑 TiDB 目标连接,在「连接参数」中加一行:
```
tidb_skip_isolation_level_check=1
```
### 工作原理
连接参数会被拼进连接 URL 的 query string例如
```
mysql://user:pass@tidb-host:4000/dbname?tidb_skip_isolation_level_check=1
```
sling 底层使用 go-sql-driver/mysql会把未识别的 DSN 参数作为 session 变量
在连接建立时执行 `SET <key>=<value>`(本项目内置的 `foreign_key_checks=0`
也是同一机制。Atlas 的连接 URL 同样会带上这些参数。
已实测验证:对普通 MySQL 设置该参数会报 `Error 1193: Unknown system
variable`,证明参数确实被 SET 为 session 变量TiDB 上该变量存在,即达到
预期效果。
## 备注
- 该参数只对 TiDB 有效,不要给普通 MySQL/MariaDB 连接设置。
- 若希望对整个 TiDB 实例生效(所有客户端),也可以在 TiDB 上执行
`SET GLOBAL tidb_skip_isolation_level_check=1;`,但用连接参数的方式
影响面最小,推荐。