同僚から、Herokuのpg:backupsの定期バックアップファイルをpg_restoreでリストアしようとしたら、
pg_restore: [archiver] unsupported version (1.13) in file header
でコケるという話がチャットワークで流れてきたので調査してみました。
pg_dumpでできるデータが変わったらしい
ググると、stackoverflowにすでに上がってました。
どうも、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したらダメのようです。
解決策
解決策は、
- ローカルのpostgresql-clientを最新にする
- Herokuの定期バックアップファイルを使わずにpg:pullする
になるかと思いますが、2は暫定的な措置にしか過ぎません。postgresql-clientのバージョンアップができるのであれば、早めにしたほうがよさそうです。