【问题澄清】
使用 ogg 将数据从 oracle 导入 tidb 集群报错
05-12T11:11:51.646+0800 WARNING OGG-01004 Oracle GoldenGate Delivery for MySQL, repsc.prm: Aborted grouped transaction on tidb.tt, Database error 1105 ([SQL error 1105]INSERT INTO tidb.tt (xxxx,xxx,xxx,xxx). 2020-05-12T11:11:51.646+0800 WARNING OGG-01003 Oracle GoldenGate Delivery for MySQL, repsc.prm: Repositioning to rba 48399267 in seqno 356. 2020-05-12T11:11:55.941+0800 WARNING OGG-01154 Oracle GoldenGate Delivery for MySQL, repsc.prm: SQL error 1105 mapping tidb.tt to tidb.tt [SQL error 1105]INSERT INTOtidb.tt` (xxxxxxx,xx,x,x,x,x. 2020-05-12T11:11:55.942+0800 ERROR OGG-01296 Oracle GoldenGate Delivery for MySQL, repsc.prm: Error mapping from tidb.tt to tidb.tt. 2020-05-12T11:11:55.943+0800 ERROR OGG-01668 Oracle GoldenGate Delivery for MySQL, repsc.prm: PROCESS ABENDING.
... tidb.log ...
[err="statement count 5001 exceeds the transaction limitation, autocommit = false\
github.com/pingcap/tidb/session.checkStmtLimit\
\tgithub.com/pingcap/tidb@/session/tidb.go:199\
github.com/pingcap/tidb/session.finishStmt\
\t
github.com/pingcap/tidb@/session/tidb.go:188\
github.com/pingcap/tidb/session.runStmt\
\t
github.com/pingcap/tidb@/session/tidb.go:257\
github.com/pingcap/tidb/session.(*session).ExecutePreparedStmt\
\t
github.com/pingcap/tidb@/session/session.go:1241\
github.com/pingcap/tidb/server.(*TiDBStatement).Execute\
\t
github.com/pingcap/tidb@/server/driver_tidb.go:75\
github.com/pingcap/tidb/server.(*clientConn).handleStmtExecute\
\t
github.com/pingcap/tidb@/server/conn_stmt.go:182\
github.com/pingcap/tidb/server.(*clientConn).dispatch\
\t
github.com/pingcap/tidb@/server/conn.go:926\
github.com/pingcap/tidb/server.(*clientConn).Run\
\t
github.com/pingcap/tidb@/server/conn.go:666\
github.com/pingcap/tidb/server.(*Server).onConn\
\t
github.com/pingcap/tidb@/server/server.go:440\
runtime.goexit\
\t
runtime/asm_amd64.s:1357\
INSERT INTO tidb.tt
......
【解决思路】
- ogg 中报错可以看出,是下游插入数据时出现了问题,但是并无有效信息指出具体原因为何。
- 检查报错时间点 tidb.log 中是否包含重要的报错信息
【解决方案】
- 调整 tidb 参数:
stmt-count-limit
,或者减小单个事务包含的 SQL 语句。
【注意事项】
- 通常建议减小事务,控制在5000 条以内。 如果改大,可能会引起其他限制,比如单个事务总的大小超过 100M。
【延伸】
关于事务限制相关报错和典型案例:
-
单个事务包含的 SQL 语句不超过 5000 条(默认)
- log 信息:statement count 5001 exceeds the transaction limitation, autocommit = false
- ogg 从 oracle 将数据同步到 TiDB,报错:Database error 1105 ([SQL error 1105]INSERT INTO tidb.tt (xxxx,xxx,xxx,xxx)
-
单条 KV entry 不超过 6MB
- log 信息:[fatal] Error 1118: entry too large, the max entry size is 6291456, the size of data is 8463778
- tidb-lightning 导入数据 kv 超过 6M
-
KV entry 的总条数(length)不超过 30w
- log 信息:ERROR 8004 (HY000): transaction too large, len:300001
- Update 字段时候 transaction too large, len:300002
-
KV entry 的总大小(size)不超过 100MB(3.0 无可调节参数,4.0 在 tidb 配置文件中加入 txn-total-size-limit 参数)
- log 信息:ERROR 8004 (HY000): transaction too large, size:104857600
【参考案例】
【涉及知识点】
- 代码中关于 kv event 中报错的定义
tidb/kv/memdb_buffer.go at e9653675dd3b996b47647fde7e623afaaaf4317c · pingcap/tidb · GitHub
tidb/errno/errname.go at 2efab88a59499ea3934c8c1eba7b695cf24b9d29 · pingcap/tidb · GitHub
- txn-total-size-limit
- 《tidb in action》 中关于 ogg 从 oracle 迁移数据至 tidb 案例