Embulk
ご存知Embulk
(http://www.embulk.org/)ですが、Fluentd
(http://www.fluentd.org/)とともにとても便利なプロダクトですよね。データベースの実質的なレプリケーションもこれで柔軟に行えたりします。プラグインにもよりますが、オプション指定も豊富にできて、様々な形で必要なデータを扱えます。
Embulk でレジューム実行する
MySQL の Input plugin に実装されている*1機能として、それまでに読み出した場所を記憶してくれて、次回以降はその続きから読んでくれるといういわゆるレジューム機能があります*2。
MySQL の Input plugin ではこの機能を有効にするためにincremental
をtrue
にしてあげればいいです。……が、いくらこの設定をしても、毎回毎回最初から読み出してしまいます。数十万単位のレコードなら良いですが、数百万単位以上のレコードになるとこれはとてもツラいです。
きっとどこか設定が間違っているんだろうなと思って調べていたところ、救世主となる記事を見つけました。
結論から言えば、Embulk の実行時に -o(--output)オプションを指定する必要があります。このオプションを指定すると、Embulk の実行が終わった際に、指定の場所に次回実行に用いることができる.yml
ファイルが生成されます。
この.yml
ファイルの中にはレジュームに必要となるlast_record
というキーがちゃんと記録されています。次回に Embulk を実行するときにこのファイルを設定ファイルとして指定してあげれば無事レジュームしてくれるということです。
-r(--resume-state)オプションもあり
GitHub のドキュメントにあるのでこちらは有名かと思いますが、-r(--resume-state)オプションを用いればトランザクションに失敗した際のレジュームファイルが生成されます。こちらも指定してあげれば取得漏れがあった際に役立つことでしょう。
追記
実行ログを見ていたら、思いっ切り-o
オプションはdeprecated
でした。代わりに-c
を使いましょうとのことです……が-c
だとlast_record
しか記録されない.yml
が出てくるような……。