问题
I need to somehow convert a v10 dump file into one which is 9.6 compatible
Google's Cloud SQL runs PostgreSQL version 9.6 and my database has been running on version 10 since its creation.
THE ISSUE: When trying to import the database into Cloud SQL, I get the an unknown error has occurred.
message of death.
I have already tried commenting out my postgis / other extensions when importing to Cloud SQL but, to no avail.
I have tried using using psql my_96_db < my_10.sql
and get tons of errors like this:
...
CREATE TABLE
ERROR: syntax error at or near "AS"
LINE 2: AS integer
^
ERROR: relation "authentication_phonecontact_id_seq" does not exist
CREATE TABLE
...
I have tried using postgres 9.6's pg_restore on my v10 pg_dump -Fc
command, but it will not successfully import into a 9.6 database. An example of one of the many failures in the output is
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);
回答1:
Judging from the error messages you show, you'll have to edit the SQL dump and remove all occurrences of AS integer
from all CREATE SEQUENCE
statements.
The AS data_type
clause of CREATE SEQUENCE
is new in PostgreSQL v10, and older server versions will not understand it.
回答2:
Following @"Laurenz Albe" suggestion, here's a python3 snippet can be used to downgrade a 10.x pg_dump script for 9.x:
#!/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 ')
来源:https://stackoverflow.com/questions/49547602/cant-import-postgresql10-dump-into-9-6-database