【发布时间】:2010-10-22 23:09:16
【问题描述】:
有没有一种简单的方法可以在 PostgreSQL 8.1 中创建数据库或模式的副本?
我正在测试一些软件,它对数据库中的特定架构进行了大量更新,我想制作一个副本,以便与原始版本进行一些比较。
【问题讨论】:
标签: sql database postgresql
有没有一种简单的方法可以在 PostgreSQL 8.1 中创建数据库或模式的副本?
我正在测试一些软件,它对数据库中的特定架构进行了大量更新,我想制作一个副本,以便与原始版本进行一些比较。
【问题讨论】:
标签: sql database postgresql
如果它在同一台服务器上,您只需使用带有 TEMPLATE 参数的 CREATE DATABASE 命令。例如:
CREATE DATABASE newdb WITH TEMPLATE olddb;
【讨论】:
$ createdb -T olddb newdb
OWNER设置新的数据库所有者:CREATE DATABASE newdb WITH TEMPLATE olddb OWNER new_db_user;
pg_dump 与 --schema-only 选项。
【讨论】:
如果您必须将架构从本地数据库复制到远程数据库,您可以使用以下两个选项之一。
选项 A
将架构从本地数据库复制到转储文件。
pg_dump -U postgres -Cs database > dump_file
将转储文件从本地服务器复制到远程服务器。
scp localuser@localhost:dump_file remoteuser@remotehost:dump_file
连接到远程服务器。
ssh remoteuser@remotehost
将模式从转储文件复制到远程数据库。
psql -U postgres database < dump_file
选项 B
直接将模式从本地数据库复制到远程数据库,而不使用中间文件。
pg_dump -h localhost -U postgres -Cs database | psql -h remotehost -U postgres database
如果您想了解有关使用pg_dump 复制数据库的选项的更多信息,此blog post 可能会对您有所帮助。
【讨论】:
db_name 不存在。有没有办法在不创建数据库的情况下从架构中恢复。
这可以通过运行以下命令来完成:
CREATE DATABASE [Database to create] WITH TEMPLATE [Database to copy] OWNER [Your username];
填写您的数据库名称和用户名后,这将创建指定数据库的副本。只要您要复制的数据库没有其他活动连接,这将起作用。如果还有其他活动连接,您可以先使用此命令临时终止连接:
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '[Database to copy]'
AND pid <> pg_backend_pid();
我为 Chartio 的数据学校写的一篇好文章更深入地介绍了如何做到这一点,可以在这里找到: https://dataschool.com/learn/how-to-create-a-copy-of-a-database-in-postgresql-using-psql
【讨论】:
这里是一些examples 的备份和恢复链接。您可以使用备份恢复到不同的服务器或其他任何东西
【讨论】: