如何在同一个数据库集群中复制 Postgres 数据库?

Sij*_*tha 4 postgresql replication

我想复制 Postgres 数据库而不使用pg_dump. 源数据库和目标数据库都在同一台机器上(测试和生产服务器)。

我想创建master_db_copy生产服务器的精确副本master_db

我从命令行尝试过:

pg_dump -vO master_db | gzip > master_db
gunzip -cV master_db.sql.gz | psql master_db_copy
Run Code Online (Sandbox Code Playgroud)

有更好/更快的方法吗?

Erw*_*ter 8

在同一数据库集群中复制完整数据库的最快方法是CREATE DATABASE使用TEMPLATE. 这只是在文件级别复制整个数据库。

CREATE DATABASE master_db_copy TEMPLATE master_db;
Run Code Online (Sandbox Code Playgroud)

您必须是模板的超级用户或所有者(master_db在示例中) - 除非它在pg_database.datistemplate.

并且模板不能与它有并发连接。专用模板数据库通过设置pg_database.datallowconn. 您可能会使用pg_terminate_backend()来关闭连接。看:

手册:

pg_database每个数据库都存在两个有用的标志:列 datistemplatedatallowconn. datistemplate可以设置为指示数据库旨在作为CREATE DATABASE. 如果设置了此标志,则任何具有CREATEDB权限的用户都可以克隆数据库;如果未设置,则只有超级用户和数据库所有者才能克隆它。如果datallowconn为 false,则不允许与该数据库建立新连接(但现有会话不会简单地通过设置标志 false 来终止)。 datistemplate = true. [...]