Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t将PostgreSQL10转储导入9.6数据库_Postgresql_Version_Google Cloud Sql - Fatal编程技术网

Can';t将PostgreSQL10转储导入9.6数据库

Can';t将PostgreSQL10转储导入9.6数据库,postgresql,version,google-cloud-sql,Postgresql,Version,Google Cloud Sql,我需要以某种方式将v10转储文件转换为与9.6兼容的文件 谷歌的云SQL运行PostgreSQL 9.6版,我的数据库自创建以来一直运行在10版上 问题:当尝试将数据库导入云SQL时,我得到一个未知错误发生。死亡消息 我已经尝试过在导入到云SQL时注释我的postgis/其他扩展,但是没有用 我尝试过使用psqlmy_96_db

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

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

问题:当尝试将数据库导入云SQL时,我得到一个
未知错误发生。
死亡消息

我已经尝试过在导入到云SQL时注释我的postgis/其他扩展,但是没有用

我尝试过使用
psqlmy_96_db
,结果出现了大量类似这样的错误:

...
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数据库。输出中的许多故障之一的示例如下

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);

根据显示的错误消息判断,您必须编辑SQL转储,并从所有
CREATE SEQUENCE
语句中删除所有出现的
AS integer

CREATE SEQUENCE
AS data\u type
子句在PostgreSQL v10中是新的,较旧的服务器版本将无法理解它。

根据“Laurenz Albe”的建议,这里有一个python3片段可用于将9.x的10.x pg\u转储脚本降级:

#!/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 ')
#/usr/bin/env蟒蛇3
导入系统
#
#将pg_dump 10脚本降级为9.x
#从“创建序列”语句中删除“作为整数”
#
#用法:
#$python3 pgdump_10_to_9.pytest9.sql
#或:
#$cat test10.sql |/pgdump_10_to_9.py>test9.sql
#
#要从压缩的10 sql脚本获取压缩的9.x sql脚本,请执行以下操作:
#
#$gunzip-c test10.sql.gz |/pgdump_10_to_9.py | gzip>test9.sql.gz
#
内部\u创建\u序列=错误
对于sys.stdin.readlines()中的行:
如果在\u内部创建\u序列和row.strip().lower()=“作为整数”:
通过
其他:
打印(行,结束=“”,刷新=真)
inside\u create\u sequence=row.strip().startswith('create sequence'))

为什么没有向后兼容转储的标志?@grokpot-Huh?转储较旧的PostgreSQL服务器不需要标志。并且不允许您转储更高版本的PostgreSQL server。这很好,因为9.4服务器应该如何正确转储v10数据库?@LaurenzAlbe v10应该知道如何转储与v9.x兼容的备份IMHO@Mirko它应该如何转储旧版本中不存在的东西?只是默默地放下它们?出错?无论如何,你永远不应该降级,所以没有人觉得有足够的动力来写支持。这很难,而且会使pg_dump更加复杂。就记录而言,这也可以将转储从postgresql 10向后移植到portgresql 9.5。感谢您编写此脚本。它使转换文件变得超级简单。一个不太复杂的解决方案是使用sed,
cat test10.sql | sed'/AS integer/d'>test9.sql
您真的想到处删除“AS integer”吗?我的目的是在“创建序列”发生后立即删除该行。我可以确认该脚本也可以用于将PostgreSQL 11降级到9.6!感谢您的分享。如果您正在处理Rails db/structure.sql文件,下面是一个Ruby脚本,它可以处理一些额外的不兼容性: