web-dev-qa-db-ja.com

PostgreSQL10ダンプを9.6データベースにインポートできません

v10ダンプファイルを9.6互換のファイルに変換する必要があります

GoogleのCloud SQLはPostgreSQLバージョン9.6を実行し、データベースは作成以来バージョン10で実行されています。

問題:Cloud SQLにデータベースをインポートしようとすると、an unknown error has occurred.という死のメッセージが表示されます。

Cloud SQLにインポートするときにpostgis /その他の拡張機能をコメントアウトしましたが、役に立ちませんでした。

psql my_96_db < my_10.sqlを使用してみましたが、次のようなエラーが大量に発生しました。

...
CREATE TABLE
ERROR:  syntax error at or near "AS"
LINE 2:     AS integer
            ^
ERROR:  relation "authentication_phonecontact_id_seq" does not exist
CREATE TABLE
...

V10 pg_dump -Fcコマンドでpostgres 9.6のpg_restoreを使用しようとしましたが、9.6データベースに正常にインポートできません。出力の多くの失敗の1つは次のとおりです。

pg_restore: [archiver (db)] could not execute query: ERROR:  relation "public.authentication_referral_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('public.authentication_referral_id_...
                                 ^
    Command was: SELECT pg_catalog.setval('public.authentication_referral_id_seq', 1, false);
11
flaviojohnson

表示されるエラーメッセージから判断すると、SQLダンプを編集し、すべてのAS integerステートメントからCREATE SEQUENCEの出現をすべて削除する必要があります。

AS data_typeCREATE SEQUENCE句はPostgreSQL v10で新しく追加され、古いバージョンのサーバーでは理解できません。

23
Laurenz Albe

@ "Laurenz Albe"の提案に続いて、9.x用の10.x pg_dumpスクリプトをダウングレードするために使用できるpython3スニペットがあります。

#!/usr/bin/env python3
import sys

#
#  Downgrades pg_dump 10 script to 9.x
#  removing 'AS integer' from 'CREATE SEQUENCE' statement
#
#  Usage:
#       $ python3 pgdump_10_to_9.py < test10.sql > test9.sql
#  or:
#       $ cat test10.sql | ./pgdump_10_to_9.py > test9.sql
#
#  To obtain a compressed 9.x sql script from a compressed 10 sql script:
#
#       $ gunzip -c test10.sql.gz | ./pgdump_10_to_9.py | gzip > test9.sql.gz
#

inside_create_sequence = False
for row in sys.stdin.readlines():

    if inside_create_sequence and row.strip().lower() == 'as integer':
        pass
    else:
        print(row, end='', flush=True)

    inside_create_sequence = row.strip().startswith('CREATE SEQUENCE ')
5
Mario Orlandi