8

如何将 Postgresql 数据库导出到可以在其他数据库中执行的 SQL 中pgAdmin

  • 导出为备份文件,版本不同时不起作用
  • 导出为 SQL 文件,尝试在不同的服务器上运行时不执行pgAdmin

我尝试导出一个数据库,pgAdmin III但是当我尝试在其他中执行 SQL 时,pgAdmin它会在 SQL 中引发错误,当我尝试“恢复”备份文件时,它说版本不同,它无法执行导入/恢复。

那么是否有一种“安全”的方式将数据库导出到可以在pgAdminSQL 编辑器中简单执行的标准 SQL 中,而不管它是哪个版本?

4

2 回答 2

8

不要尝试为此使用 PgAdmin-III。如果可能,请直接使用pg_dump和。pg_restore

使用pg_dump来自目标服务器的版本转储源服务器。因此,如果您从(例如)8.4 升级到 9.2,您将使用 9.2pg_dump来创建转储。如果您创建-Fc自定义格式转储(推荐),您可以使用pg_restore它来将其应用到新的数据库服务器。如果您进行了常规 SQL 转储,则可以使用psql.

请参阅升级 PostgreSQL 集群的手册

现在,如果您尝试降级,那将是一团糟。

您将很难创建适用于任何PostgreSQL 版本的 SQL 转储。假设您创建了一个使用WITH查询的 VIEW。这在恢复到 PostgreSQL 8.3 时不起作用,因为它不支持WITH. 还有很多其他的例子。如果您必须支持旧 PostgreSQL 版本,请在您仍然支持的最旧版本上进行开发,然后导出它的转储以供新版本加载。您不能在新版本上进行明智的开发并为旧版本导出,如果根本无法正常工作。

更麻烦的是,在旧版本上开发并不总是给你在新版本上工作的代码。在引入对新规范特性的支持时,偶尔会添加新关键字。有时会以影响用户代码的方式解决问题。例如,如果您要在(古老且不受支持的)8.2 上进行开发,那么在 8.3 及更高版本上对文本进行隐式转换会遇到很多问题。

最好的办法是测试所有支持的版本。考虑使用 Jenkins CI 之类的工具设置自动化测试。是的,这很痛苦,但随着时间的推移,软件的价格会有所提高。如果 Pg 保持完美的向后和向前兼容性,它永远不会改进。

于 2013-05-28T08:29:53.070 回答
3

使用 pg_dump 和 psql 导出/导入

1.设置PGPASSWORD

export PGPASSWORD='123123123';

2.使用 pg_dump 导出数据库

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/opt/db.out 是转储路径。你可以自己指定。

3.然后再次设置你另一个主机的PGPASSWORD。如果主机相同或密码相同,则不需要。

4.在您的另一台主机上导入数据库

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out

如果用户名不同,则在 db.out 文件中查找并替换为您的本地用户名。并确保用户名被替换而不是数据。

如果您仍想使用 PGAdmin,请参阅下面的步骤。

使用 PGAdmin 导出数据库:

选择数据库并单击导出。

  1. 文件选项
    • 为您的本地目录命名数据库文件名
    • 选择格式 - 普通
  2. 忽略转储选项 #1
  3. 转储选项 #2
    • 查看Use Insert Commands
  4. 对象
    • 如果您不想要任何表格,请取消选中表格

使用 PGAdmin 导入数据库:

  1. 创建新数据库。
  2. 通过保留选定的数据库,单击Menu->Plugins->PSQL Console
  3. 键入以下命令以导入数据库

    \i /path/to/db.sql
    

如果要分别导出 Schema 和 Data。

导出架构

  1. 文件选项
    • 在您的本地目录中命名架构文件
    • 选择格式 - 普通
  2. 转储选项 #1
    • 查看Only Schema
    • 勾选Blobs(默认勾选)

导出数据

  1. 文件选项
    • 命名本地目录中的数据文件
    • 选择格式 - 普通
  2. 转储选项 #1
    • 查看Only Data
    • 勾选Blobs(默认勾选)
  3. 转储选项 #2
    • 查看Use Insert Commands
    • 勾选Verbose messages(默认勾选)

注意:根据数据库大小导出/导入需要时间,而使用 PGAdmin 会增加一些时间。

于 2016-08-26T13:28:46.727 回答