Tidb是一個支持ACID的分布式數據庫,當你導入一個非常大的數據集時,這時候產生的事務相當嚴重,並且Tidb本身對事物的大小也是有一個嚴格的控制。
有事務大小的限制主要在於 TiKV 的實現用了一致性協議。對於任何一個分布式數據庫,如果你要用一致性協議去做這種復制,肯定要避免非常大的事務。所以這個問題不是 TiDB 的問題。
那大概就會報這樣的錯誤:
9500:Transaction too large
意思就是說由於分布式事務要做兩階段提交,並且底層還需要做 Raft 復制,如果一個事務非常大,會使得提交過程非常慢,並且會卡住下面的 Raft 復制流程。為了避免系統出現被卡住的情況,我們對事務的大小做了限制,這是tidb官方解釋。
- 單條 KV entry 不超過 6MB
- KV entry 的總條數不超過 30w
- KV entry 的總大小不超過 100MB
解決方法就是:
set @@tidb_batch_insert =ON set @@tidb_batch_delete = ON
把這兩項打開就行了。
事實上,最好的解決方法就是使用limit來進行導入數據,你可以選擇編寫一個循環來執行。
給大家看看tidb官方的說明方法

