如何在一个单一操作中从生产中克隆测试数据库?

时间:2012-04-11 12:01:36

标签: postgresql templates database-connection postgresql-9.1

我正在寻找一个基本的脚本/命令,它将创建一个实时数据库的副本(让它们在同一服务器上命名为mydbmydb_test)。

要求

  • 即使mydb_test已经存在并且有记录
  • ,它也必须运行
  • 即使mydbmydb_test确实存在连接
  • ,它也必须正常工作
  • 必要时必须清理可能存在的数据库

提示:

    如果您有现有连接,则无法使用
  • drop database

4 个答案:

答案 0 :(得分:6)

创建现有(实时)数据库的完整副本的最简单,最快捷的方法是使用CREATE DATABASE with a TEMPLATE

CREATE DATABASE mydb_test TEMPLATE mydb;

但是,有一个重要限制违反了您的第二个要求:模板(源)数据库无法与其建立额外的连接。 I quote the manual:

  

可以创建其他模板数据库,实际上是一个   可以通过将其名称指定为集群来复制集群中的任何数据库   CREATE DATABASE的模板。但是,重要的是要理解   这不是(还)用作通用的“COPY DATABASE”   设施。主要限制是没有其他会话可以   在复制时连接到源数据库。 CREATE DATABASE   如果在启动时存在任何其他连接,则会失败;中   复制操作,防止与源数据库的新连接。

如果您拥有pg_terminate_backend()所需的权限,则可以终止与模板数据库的所有会话 要暂时禁止重新连接,请revoke the CONNECT privilege(以及稍后GRANT)。

REVOKE CONNECT ON DATABASE mydb FROM PUBLIC;

-- while connected to another DB - like the default maintenance DB "postgres"
SELECT pg_terminate_backend(pid)
FROM   pg_stat_activity
WHERE  datname = 'mydb'                    -- name of prospective template db
AND    pid <> pg_backend_pid();            -- don't kill your own session

CREATE DATABASE mydb_test TEMPLATE mydb;

GRANT CONNECT ON DATABASE mydb TO PUBLIC;  -- only if they had it before

之前的版本 Postgres 9.2中使用procpid代替pid


如果您无法承担终止并发会话的费用,请将pg_dump的输出设置为psql,就像其他答案已经建议的那样。

答案 1 :(得分:2)

由于你没有说在数据库中删除 objects 是一个问题,我认为使用pg_dump选项运行--clean会做你想要的。您可以将pg_dump的输出通过管道传输到psql中。

答案 2 :(得分:2)

这就是我要找的东西,但我必须自己编译:P

我只希望我知道一种方法来保持同一个用户而不必将其放在脚本中。


#!/bin/bash
DB_SRC=conf
DB_DST=conf_test
DB_OWNER=confuser

T="$(date +%s)"

psql -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname='$DB_DST';" || { echo "disconnect users failed"; exit 1; }
psql -c "drop database if exists $DB_DST;" || { echo "drop failed"; exit 1; }
psql -c "create database $DB_DST owner confuser;" || { echo "create failed"; exit 1; }
pg_dump $DB_SRC|psql $DB_DST || { echo "dump/restore failed"; exit 1; }

T="$(($(date +%s)-T))"
echo "Time in seconds: ${T}"

答案 3 :(得分:0)

您是否在此处Hot StandbyStreaming Replication进行了调查?