定期的に取得しているダンプデータから、特定のデータを復旧するSQLを準備する必要が出てきました。
そのとき、巨大なダンプファイルから一部のデータを切り出す作業を行いましたので、備忘録として残したいと思います。
はじめに
こちらの方法は、あくまでイレギュラーな対応となります。
ダンプファイルを加工すると、データの整合性を損なう可能性がありますので、十分にご注意ください。
対象
- Macを使われている方
- 巨大なダンプファイルを操作する必要が出てきた方
- mysqldumpを使われている方
ダンプデータのサイズが、数十MB程度でしたら、中身を参照する場合などでも取り扱いが楽なのですが、数十・数百GBを超えることもあるかと思います。
ダンプ取得時点で、リストアに利用する必要なデータが解っている場合は、where句などで、ダンプするデータを絞り込むことも出来ますので、そちらの方法をおすすめいたします。
ダンプファイルを取得
mysqldump -u root -p --single-transaction sample > sample.dump
mysqldumpコマンドには、指定出来るオプションが数多く存在しますので、説明はここでは割愛させて頂きます。
ここではサンプルとして、シンプルなコマンドで取得したダンプデータを例に上げています。
ダンプファイルを分割
ダンプファイルを取得したディレクトリに移動して、ファイル分割を行います。
mkdir temp_split
split -l 100 -a 10 sample.dump temp_split/sample.dump.sql.
指定するオプション
- -l
- 1ファイルに切り出す行数
- mysqldumpコマンドで取得したデータは、バルクインサートのSQLになっていますので、「-l 1」と1行分を指定した場合も複数レコード分のデータを含んでいます。
- -a
- 接尾語の文字数
- ダンプファイルのサイズが大きい場合、接尾語の文字数が枯渇して「split: too many files」メッセージと共に処理が中断してしまいます。「-l」オプションに指定する1ファイルに切り出す行数に合わせて、大きい値を指定します。
分割実行後
しばらくすると、次のような接尾語が付与されたファイル名で、分割ファイルが生成されます。
※利用しているMacの性能や、取り扱うファイルサイズによっては、処理に時間がかかります。
分割されたファイルは、MB単位のファイルとなり、取り扱い可能なファイルサイズになっているかと思います。もし、まだ大きいサイズのファイルとなっていましたら、splitコマンドのオプションを調整して、再度分割して調整するにしてください。
mysqldumpで取得したsqlは、バルクインサートで記述されていますので、分割によって必要なデータが複数ファイルにまたがる場合も、順番リストアしていくことが可能です。
最後に
ダンプファイルのサイズが大きすぎて、取り扱いに困っている方の何かヒントの1つになりましたら幸いです。
追記: 2022/08/29
上記の方法では、SQLが中途半端なところで行分割されてしまう可能性があるとのご指摘を頂きました。
利用される際は、分割されたファイルの内容が想定されたSQLになっているか、十分に確認の上、ご利用頂くようお願いいたします。