巨大DBの一部をdump&バックアップ

レコード数の多いアプリケーションの場合、データベースの一部を切り出して取得したいケースがあります。

このような場合、一度バックアップ用のミニテーブルを作成する手順が手軽です。

PostgreSQLのバックアップ手順

  1. 件数を制限したミニテーブルを作成
    • $ psql -Usome_user some_original_db
    • some_original_db=# CREATE TABLE some_table_tmp AS SELECT * FROM some_table_orig LIMIT 300;
    • some_original_db=# \q
  2. ミニテーブルをバックアップ
    • $ pg_dump -t some_table_tmp -Usome_user some_original_db > some_dump_file.sql
  3. テーブル名をオリジナルと同名に置換(必要に応じて)
    • $ sed -i -e 's/some_table_tmp/some_table_orig/g' some_dump_file.sql
  4. 不要になったミニテーブルを削除
    • $ psql -Usome_user some_original_db
    • some_original_db=# DROP TABLE some_table_tmp;

MySQLのバックアップ手順

  1. 件数を制限したミニテーブルを作成
    • $ mysql -usome_user -p some_original_db
    • mysql> CREATE TABLE some_table_tmp AS SELECT * FROM some_table_orig LIMIT 300;
    • mysql> quit
  2. ミニテーブルをバックアップ
    • $ mysqldump -usome_user -p some_original_db some_table_tmp > some_dump_file.sql
  3. テーブル名をオリジナルと同名に置換(必要に応じて)
    • $ sed -i -e 's/some_table_tmp/some_table_orig/g' some_dump_file.sql
  4. 不要になったミニテーブルを削除
    • $ mysql -usome_user -p some_original_db
    • mysql> DROP TABLE some_table_tmp;

取得したバックアップファイルを用いて、通常のリストア手順で再構築できます。

冒頭のテーブルレプリケーションの際のSELECTは必要に応じてカスタマイズできるため、たとえば ORDER BY による新着順などのサンプリングが可能です。

また、pg_dump / mysqldumpを実行する際にテーブル名を明示的に指定することが重要です。デフォルトではDB内の全テーブルをdumpする挙動となるため、大規模なバックアップが走ってしまいます。

中馬崇尋
Chuma Takahiro