PostgreSQLのダンプツール(pg_dump)、リストアツール(pg_restore)を使おうと思ったら
データがでかいと、ローカルPCにダンプファイル作れない!!と困った。
それなら、AWS-S3にダンプファイル作ればよくないか?と思ったら出来たので、やり方を書きます。
前提
AWS CLIを使うことが前提です。
ダンプ pg_dump
pg_dump -h ホスト -d データベース名 -U ユーザー -a -v -Fc | aws s3 cp - s3://BUCKET名/ダンプファイル名
データがかなりでっかい(ファイルサイズが50G超えると)と
An error occurred (InvalidArgument) when calling the UploadPart operation: Part number must be an integer between 1 and 10000, inclusive
と、エラーになります!!
このエラーが発生したときは --expected-size オプションを指定します。
S3のcliはマルチパートアップロードっていう方法でアップロードします。
速くアップロードするためにファルを分割してパラレルアップロードするようなイメージです。
しかし、分割数は最大で10000までと決まっています。
なので、事前にアップロードするファイルサイズを--expected-sizeで指定しておくと、分割数を10000個以内になるように、うまいぐあいに分割してくれます。
なので、100Gのファイルをアップロードする場合は
100 * 1024 * 1024 * 1024 = 107,374,182,400を指定すればOKです。
--expected-size
pg_dump -h ホスト -d データベース名 -U ユーザー -a -v -Fc | aws s3 cp - s3://BUCKET名/ダンプファイル名 --expected-size 107374182400
リストア pg_restore
aws s3 cp s3://BUCKET名/ダンプファイル名 - | pg_restore -h ホスト -d データベース名 -U ユーザー -a -Fc -v
ダンプファイルの一部のテーブルだけrestoreしたい場合
aws s3 cp s3://BUCKET名/ダンプファイル名 - | pg_restore -h ホスト -d データベース名 -U ユーザー -a -Fc -v -t リストアしたいテーブル名
と-tでテーブル指定しますが、この場合
[Errno 32] Broken pipe
とエラーが発生します。
ですが、これは無視してもOKです。
エラーになる理由は
-t指定して一部のテーブルだけをリストアする場合、そのテーブルのリストアが完了するとpg_restoreコマンドは終了します。
ですが、まだダンプファイルには続きがある場合、s3のcliコマンドはファイルのダウンロードを続けます。
この時、続けようとしたが「|」先のpg_resotreコマンドが終わっているので「|」がおかしい。となっただけので、リストア自体には問題ありません。