恢复PostgreSQL数据库时创建SEQUENCE时出错

时间:2018-03-10 11:18:40

标签: postgresql postgresql-9.6 pg-restore

UserX 有以下授权:

CREATE ROLE "UserX" LOGIN PASSWORD 'pass';
CREATE DATABASE "DBX" WITH OWNER="UserX" ENCODING='UTF8' TABLESPACE=pg_default CONNECTION LIMIT=-1;
GRANT CONNECT ON DATABASE "DBX" TO "UserX";
GRANT USAGE ON SCHEMA public TO "UserX";
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO "UserX";
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO "UserX";
ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO "UserX";

尝试将其转储还原到其他数据库时出现以下错误:

pg_restore: creating SEQUENCE "public.tblX_Id_seq"
pg_restore: [archiver (db)] Error from TOC entry 218; 1259 438745 SEQUENCE tblX_Id_seq UserX
pg_restore: [archiver (db)] could not execute query: ERROR:  syntax error at or near "AS"
LINE 2:     AS integer
            ^
    Command was: CREATE SEQUENCE "tblX_Id_seq"
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACH...
pg_restore: [archiver (db)] could not execute query: ERROR:  relation "tblX_Id_seq" does not exist
    Command was: ALTER TABLE "tblX_Id_seq" OWNER TO "UserX";


pg_restore: creating SEQUENCE OWNED BY "public.tblX_Id_seq"
pg_restore: [archiver (db)] Error from TOC entry 3569; 0 0 SEQUENCE OWNED BY tblX_Id_seq UserX
pg_restore: [archiver (db)] could not execute query: ERROR:  relation "tblX_Id_seq" does not exist
    Command was: ALTER SEQUENCE "tblX_Id_seq" OWNED BY "tblX"."Id";

...

pg_restore: creating DEFAULT "public.tblX Id"
pg_restore: [archiver (db)] Error from TOC entry 2995; 2604 438750 DEFAULT tblX Id UserX
pg_restore: [archiver (db)] could not execute query: ERROR:  relation "tblX_Id_seq" does not exist
    Command was: ALTER TABLE ONLY "tblX" ALTER COLUMN "Id" SET DEFAULT nextval('"tblX_Id_seq"'::regclass);

...

pg_restore: executing SEQUENCE SET tblX_Id_seq
pg_restore: [archiver (db)] Error from TOC entry 3607; 0 0 SEQUENCE SET tblX_Id_seq UserX
pg_restore: [archiver (db)] could not execute query: ERROR:  relation "tblX_Id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('"tblX_Id_seq"', 1573, true);
                                 ^
    Command was: SELECT pg_catalog.setval('"tblX_Id_seq"', 1573, true);

有关我做错的任何建议吗?

3 个答案:

答案 0 :(得分:8)

您正尝试将v10数据库中的转储恢复为较早版本的PostgreSQL(CREATE SEQUENCE ... AS是v10中的新功能)。

不支持,不起作用。您可以使用pg_restore创建SQL脚本并手动编辑它。或者升级目标数据库。

答案 1 :(得分:2)

我记下了这些笔记:

  

支持所有压缩数据库

     

pg_dump -U {usuario} -h {host} -W {数据库} | gzip -c> archivo.gz

     

从BACK GZIP恢复

     

gunzip -c {archivo.gz} | psql -h {host} -U postgres {数据库}

     

从v10到g9.x的GZIP备份还原

     

gunzip -c {archivo.gz} | sed -e'/ AS整数/ d'| psql -U postgres -h {host} -W {database}

答案 2 :(得分:1)

我得到了将数据库从高版本还原到低版本的解决方案。 如果在恢复数据库时出现序列错误,只需将 dump.sql 文件中的 As integer 删除并恢复即可解决序列错误。

例如:

 CREATE SEQUENCE "tblX_Id_seq"
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACH...

删除 AS 整数

CREATE SEQUENCE "tblX_Id_seq"
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACH...