MySQLのデータをダンプして、別のMySQLサーバーに移す機会が合ったので、MySQL Shellの機能を使ったところインポート時に度々エラーで止まってしまったため備忘録として記録。 8スレッドで並行処理をしていたところ、70%くらい終わったところで下記エラーが頻発
scheme@tablename@17.tsv.zst: MySQL Error 1205 (HY000): Lock wait timeout exceeded; try restarting transaction: LOAD DATA LOCAL INFILE ~~~~
なんぞロックする要素なんかあるのか?と思っていたものの、スレッドが一つでも止まると一旦各スレッドの処理が完了すると全てが止まってしまうので放置できなくて困る。 というわけでエラーが起きるのは決まって特定のテーブルだったので、それらの共通項目を洗い出してみる。
- 200万レコード以上あるでかいテーブル
- 複合ユニークインデックスがある
なんとなく察せられる。 ノリノリで8スレッドで走らせていたが
- 終盤はでかいテーブルだけが残るので、同一テーブルに複数スレッドで処理をしようとする
- 複合ユニークインデックスがあるので、各スレッドは同一テーブルの別のスレッドの処理が終わるまで待つ必要がある
- タイムアウトする
というオチ。 なので、該当するようなテーブルが存在する場合は
- エラーが出るまでは複数スレッドで並行処理
- エラーが出始めたらスレッド数を減らす or 諦めて1にする
- 放置する
という形で対応しました。