patorashのブログ

方向性はまだない

Herokuのpg:backupsのデータがリストアできない現象が発生した

同僚から、Herokuのpg:backupsの定期バックアップファイルをpg_restoreでリストアしようとしたら、

pg_restore: [archiver] unsupported version (1.13) in file header

でコケるという話がチャットワークで流れてきたので調査してみました。

pg_dumpでできるデータが変わったらしい

ググると、stackoverflowにすでに上がってました。

stackoverflow.com

どうも、PostgreSQLのバージョンが上がってセキュリティパッチが当たったらしいです。 リストアするには、pg_restoreをしようとした環境のpostgresql-clientを最新に更新しろ、ということのようです(現時点では、10.3, 9.6.8, 9.5.12, 9.4.17, 9.3.22が各バージョンでの最新)。

PosgreSQLのバージョンは最新ではないのだが?

Herokuで使っているPostgreSQLのバージョンはまだ最新のものにしていないのだけれど、どうしてこういうことが起きるのか?と思ったのですが、これはどうもHeroku側の定期バックアップを実行するpostgresql-clientのバージョンが最新になっている、ということのようでした。pg_dumpの結果はpostgresql-clientのバージョンに依存するので、冷静に考えたら、今回はサーバのマイナーバージョンはほぼ関係ありません。

heroku pg:pull ならOK

試しに、postgresql-clientのバージョンが9.5.4の環境で、heroku pg:pullを行ってみました。

$ dropdb project_development
$ heroku pg:pull DATABASE project_development --app project

この場合、ローカルのpostgresql-clientによってpg_dump, pg_restoreが実行されるので、問題なくリストアされました。

heroku pg:backups:download だとNG

次に、herokuの定期バックアップをダウンロードしてきて、pg_restoreを実行してみました。

$ dropdb project_development
$ createdb project_development --encoding=UTF8 --locale=C --template=template0
$ heroku pg:backups:download --app project
Getting backup from ⬢ project... done, #1129
Downloading latest.dump... ████████████████████████▏  100% 00:00 189.25MB

$ pg_restore -d project_development latest.dump
pg_restore: [archiver] unsupported version (1.13) in file header

エラーが再現しました。やはり、pg_dumpを実行したpostgresql-clientのバージョンが最新の状態で、古いpostgresql-clientでpg_restoreしたらダメのようです。

解決策

解決策は、

  1. ローカルのpostgresql-clientを最新にする
  2. Herokuの定期バックアップファイルを使わずにpg:pullする

になるかと思いますが、2は暫定的な措置にしか過ぎません。postgresql-clientのバージョンアップができるのであれば、早めにしたほうがよさそうです。