【问题标题】:Error in creating SEQUENCEs when restoring the PostgreSQL database恢复 PostgreSQL 数据库时创建 SEQUENCE 时出错
【发布时间】:2018-03-10 11:18:39
【问题描述】:

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

对我做错了什么有什么建议吗?

【问题讨论】:

    标签: postgresql postgresql-9.6 pg-restore


    【解决方案1】:

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

    这不受支持且无法使用。您可以使用pg_restore 创建一个 SQL 脚本并手动编辑它。或者升级目标数据库。

    【讨论】:

    • 事实证明这并不难,至少对于我的特定用例而言。我得到了:pg_restore -F c --clean --if-exists dumpfile | sed -e '/AS integer/d' > loadme.sql 显然你的运气取决于对任何 10.x 特定功能的使用,但如果你不是......
    • 对,这就是为什么最好采用受支持的方式并使用 v10 中的 pg_dump 转储要加载到 v10 中的旧数据库。
    【解决方案2】:

    我已经记下了这些笔记:

    支持所有压缩数据库

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

    从 GZIP 恢复

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

    从 v10 到 v9.x 的 GZIP 备份恢复

    gunzip -c {archivo.gz} | sed -e '/AS 整数/d' | psql -U postgres -h {主机} -W {数据库}

    【讨论】:

    • 欢迎来到 StackOverflow。请注意,这是一个国际论坛,问题和答案应该用英文写成。
    • 发誓真的拯救了我的一天。真的很感激。
    【解决方案3】:

    我得到了将数据库从较高版本恢复到较低版本的解决方案。 如果在恢复数据库过程中出现序列错误,只需从 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...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多