web-dev-qa-db-fra.com

Impossible d'importer le vidage PostgreSQL10 dans la base de données 9.6

Je dois en quelque sorte convertir un fichier de vidage v10 en un fichier compatible 9.6

Cloud SQL de Google exécute PostgreSQL version 9.6 et ma base de données fonctionne sur la version 10 depuis sa création.

THE ISSUE: Lorsque j'essaie d'importer la base de données dans Cloud SQL, j'obtiens le an unknown error has occurred. message de mort.

J'ai déjà essayé de commenter mes postgis/autres extensions lors de l'importation dans Cloud SQL mais en vain.

J'ai essayé d'utiliser psql my_96_db < my_10.sql et obtenez des tonnes d'erreurs comme celle-ci:

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

J'ai essayé d'utiliser pg_restore de postgres 9.6 sur ma v10 pg_dump -Fc, mais il ne réussira pas à importer dans une base de données 9.6. Un exemple d'une des nombreuses défaillances de la sortie est

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

À en juger par les messages d'erreur que vous affichez, vous devrez modifier le vidage SQL et supprimer toutes les occurrences de AS integer de tous CREATE SEQUENCE déclarations.

Le AS data_type clause de CREATE SEQUENCE est nouveau dans PostgreSQL v10, et les anciennes versions de serveur ne le comprendront pas.

23
Laurenz Albe

Suite à la suggestion de @ "Laurenz Albe", voici un extrait python3 qui peut être utilisé pour rétrograder un script pg_dump 10.x pour 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 ')
5
Mario Orlandi