代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

如何通过运行一个命令导入数据库?

  •  1
  • Tim unnamed eng  · 技术社区  · 7 年前

    我试着学习如何导入 a database 进入PostgreSQL。

    我的尝试失败了 pg_restore -C ... -d ... 要将创建新数据库和从文件导入到新数据库合并到一个命令中,请执行以下操作:

    $ sudo -u postgres pg_restore -C -d postgres dvdrental.tar 
    pg_restore: [archiver (db)] Error while PROCESSING TOC:
    pg_restore: [archiver (db)] Error from TOC entry 2194; 1262 17355 DATABASE pagila postgres
    pg_restore: [archiver (db)] could not execute query: ERROR:  invalid locale name: "English_United States.1252"
        Command was: CREATE DATABASE pagila WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252';            
    pg_restore: [archiver (db)] could not execute query: ERROR:  database "pagila" does not exist
        Command was: ALTER DATABASE pagila OWNER TO postgres;        
    pg_restore: [archiver (db)] could not reconnect to database: FATAL:  database "pagila" does not exist
    

    我的问题是:

    • 我在想为什么我的第一次尝试失败了?

    • 有没有办法只运行一个命令?

    文件上说:

    丙 --创造

    在还原到数据库之前创建数据库。如果还指定了--clean,则在 连接到它。

    甚至举个例子:

    假设我们已将名为mydb的数据库转储为自定义格式 转储文件:

    $ pg_dump -Fc mydb > db.dump
    

    要删除数据库并从转储中重新创建它,请执行以下操作:

    $ dropdb mydb
    $ pg_restore -C -d postgres db.dump
    

    -d开关中名为的数据库可以是 集群;pg_restore只使用它来发出create database mydb的命令。使用-c,数据总是还原到 出现在转储文件中的数据库名称。

    谢谢。


    更新:

    再次感谢。我找到了二进制文件 toc.dat 在垃圾堆里有

    CREATE DATABASE pagila WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252';`
    

    是否可以将其修改为 sudo -u postgres pg_restore -C -d postgres dvdrental.tar 工作?


    注意,我有一个有效的解决方案:

    在中单独创建新数据库 psql 从文件导入到新数据库:

    template1=# CREATE DATABASE dvdrental;
    CREATE DATABASE
    
    $ sudo -u postgres pg_restore -d dvdrental dvdrental.tar
    $
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Laurenz Albe    7 年前

    导入失败,因为尝试导入转储的操作系统不知道区域设置 English_United States.1252 . 操作系统不是Windows,或者Windows没有安装该区域设置。

    pg_restore -C 尝试以与在原始系统上相同的方式创建数据库,这是不可能的。显式创建数据库是可行的,因为它使用了一个存在的区域设置。

    没有办法做到这一点 CREATE DATABASE 命令成功,但存在区域设置,因此如果不可能,则必须运行两个命令来还原转储。