代码之家  ›  专栏  ›  技术社区  ›  flaviojohnson

无法将PostgreSQL10转储导入9.6数据库

  •  16
  • flaviojohnson  · 技术社区  · 6 年前

    我需要以某种方式将v10转储文件转换为兼容9.6的文件

    谷歌的云SQL运行PostgreSQL 9.6版,而我的数据库自创建以来一直运行在10版上。

    问题 :尝试将数据库导入云SQL时,我得到 an unknown error has occurred. 死亡信息。

    我已经尝试过在导入到云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上使用postgres 9.6的pg\U还原 pg_dump -Fc 命令,但它不会成功导入到9.6数据库中。输出中的众多故障之一的示例是

    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);
    
    2 回复  |  直到 6 年前
        1
  •  28
  •   Laurenz Albe    6 年前

    根据显示的错误消息判断,您必须编辑SQL转储并删除所有出现的 AS integer 来自所有 CREATE SEQUENCE 声明。

    这个 AS data_type 第条,共条 创建序列 在PostgreSQL v10中是新的,较旧的服务器版本将无法理解它。

        2
  •  12
  •   Mario Orlandi    5 年前

    根据@“Laurenz Albe”的建议,这里有一个python3片段可以用来降级10。9的x pg\u转储脚本。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 ')