在 postgres 中恢复 sql 文件时退出代码 1

Posted

技术标签:

【中文标题】在 postgres 中恢复 sql 文件时退出代码 1【英文标题】:EXIT CODE 1 when restore sql file in postgres 【发布时间】:2021-05-20 22:54:36 【问题描述】:

我有一个手动生成的 SQL 文件。我使用下面的代码来创建它。

conn = psycopg2.connect(host=t_host, port=t_port, dbname=t_dbname, user=t_name_user, password=t_password)
cursor = conn.cursor()

table_name='product'  
with open("table_dump.sql","w+") as f:
    create_query ="""CREATE TABLE public.decima
                    (
                        product_name character varying(200) COLLATE pg_catalog."default",
                        product_owner character varying(20) COLLATE pg_catalog."default",
                        trigger_operation character varying(4) COLLATE pg_catalog."default",
                        name character varying(250) COLLATE pg_catalog."default" NOT NULL,
                        CONSTRAINT product_pkey PRIMARY KEY (name)
                    )

                    TABLESPACE pg_default;"""
    f.write('%s \n' % (create_query))  
    #select table query
    cursor.execute("SELECT * FROM %s" % (table_name)) 
    column_names = []
    columns_descr = cursor.description
    for c in columns_descr:
        column_names.append(c[0])
    #insert query (insert data)
    insert_prefix = 'INSERT INTO %s (%s) VALUES ' % (table_name, ', '.join(column_names))
    rows = cursor.fetchall()
    for row in rows:
        row_data = []
        for rd in row:
            if rd is None:
                row_data.append('NULL')
            elif isinstance(rd, datetime.datetime):
                row_data.append("'%s'" % (rd.strftime('%Y-%m-%d %H:%M:%S') ))
            else:
                row_data.append(repr(rd))
        f.write('%s (%s);\n' % (insert_prefix, ', '.join(row_data)))  

当我使用“table_dump.sql”恢复db时,出现了退出代码。但是我将此文件作为查询执行,然后我的数据库仍然被创建并照常工作。 那么如何解决这个问题。谢谢你。 这是我试图恢复的方式 这是错误的详细信息

【问题讨论】:

可以使用表名作为占位符值吗? 请展示生成文件的样例、恢复文件的方式以及来自 PostgreSQL 的错误消息的文字引用。 @tadman 什么是占位符值?能多聊聊吗? @LaurenzAlbe 根据您的建议,我添加了一些图片,希望它足够清晰 哦,我看到你稍后使用占位符,而% 更早使用。如果您使用占位符,请注意,不需要引号。他们可能会破坏您的查询。 【参考方案1】:

还原选项不适用于 sql 格式的文件。 (我不知道为什么 PgAdmin4 在文件选择器中提供“sql”作为扩展名,这可能是一个错误)。恢复选项适用于 pg_dump 可以生成的非普通文件格式。

您使用的是旧版本的 PgAdmin4,它会丢失来自 pg_restore 的错误消息。如果您将其升级到最新版本,您将看到错误消息pg_restore: error: input file does not appear to be a valid archive

但是问题是什么?您说将其作为脚本运行是有效的。那就这样做吧。

【讨论】:

实际上我们可以将它作为脚本运行,但它比使用恢复需要更多时间。谢谢你的回答。 ((=【参考方案2】:

选择“自定义或 tar”格式并在其他字段中浏览文件名。 然后您可以在浏览窗口中选择 sql。 也许您选择格式作为“目录”。那是我犯了同样的错误。

【讨论】:

【参考方案3】:

这可能不是一个解决方案,但就我而言,当我尝试在 pgAdmin 4 中一个一个地恢复架构时遇到了同样的问题。但是当我检查所有数据时。看起来这是一个在执行结束时显示的错误。

您可以使用下面的查询来检查源数据库的大小以及您要还原它的当前目标。

SELECT schema_name, 
       pg_size_pretty(sum(table_size)::bigint),
       (sum(table_size) / pg_database_size(current_database())) * 100
FROM (
  SELECT pg_catalog.pg_namespace.nspname as schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) as table_size
  FROM   pg_catalog.pg_class
     JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name
ORDER BY schema_name

【讨论】:

以上是关于在 postgres 中恢复 sql 文件时退出代码 1的主要内容,如果未能解决你的问题,请参考以下文章

postgres 基本使用

使用 Postgres JDBC 恢复数据库中的 postgres 备份数据(数据库名称包含空格)

REstore只触发postgres

[转帖]PG的简单备份恢复 找时间进行测试

postgres 导出单个表的语句

Postgres 连续归档和时间点恢复 (PITR)