在pgAdmin中将整个数据库(其结构和数据)复制到新数据库的正确方法是什么?


当前回答

Postgres允许在创建新数据库时使用服务器上的任何现有数据库作为模板。我不确定pgAdmin是否为您提供了创建数据库对话框上的选项,但如果没有,您应该能够在查询窗口中执行以下操作:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

不过,您可能会得到:

ERROR:  source database "originaldb" is being accessed by other users

要断开所有其他用户与数据库的连接,可以使用以下查询:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();

其他回答

新版本的pgAdmin(绝对是4.30)支持从模板创建新数据库。您只需要填充新的数据库名称和现有的模板数据库。

在pgAdmin中打开主窗口,然后打开另一个查询工具窗口在pgAdmin的主窗口中,

断开要用作模板的“模板化”数据库。

转到查询工具窗口

运行2个查询,如下所示

SELECT pg_terminate_backend(pg_stat_activity.pid) 
    FROM pg_stat_activity 
    WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid(); 

(上面的SQL语句将终止与TemplateDB的所有活动会话,然后您现在可以选择它作为模板来创建新的TargetDB数据库,这样可以避免出现已在使用的错误。)

CREATE DATABASE 'TargetDB'
  WITH TEMPLATE='TemplateDB'
       CONNECTION LIMIT=-1;

对于那些仍然感兴趣的人,我提出了一个bash脚本,它(或多或少)满足了作者的需求。我必须在生产系统上制作一份每日业务数据库副本,这个脚本似乎很有用。请记住更改数据库名称/user/pw值。

#!/bin/bash

if [ 1 -ne $# ]
then
  echo "Usage `basename $0` {tar.gz database file}"
  exit 65;
fi

if [ -f "$1" ]
then
  EXTRACTED=`tar -xzvf $1`
  echo "using database archive: $EXTRACTED";
else
  echo "file $1 does not exist"
  exit 1
fi


PGUSER=dbuser
PGPASSWORD=dbpw
export PGUSER PGPASSWORD

datestr=`date +%Y%m%d`


dbname="dbcpy_$datestr"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;"
dropdbcmp="DROP DATABASE $dbname"

echo "creating database $dbname"
psql -c "$createdbcmd"

rc=$?
if [[ $rc != 0 ]] ; then
  rm -rf "$EXTRACTED"
  echo "error occured while creating database $dbname ($rc)"
  exit $rc
fi


echo "loading data into database"
psql $dbname < $EXTRACTED > /dev/null

rc=$?

rm -rf "$EXTRACTED"

if [[ $rc != 0 ]] ; then
  psql -c "$dropdbcmd"
  echo "error occured while loading data to database $dbname ($rc)"
  exit $rc
fi


echo "finished OK"

如果数据库具有打开的连接,则此脚本可能会有所帮助。我每天晚上都用这个从实时生产数据库的备份中创建一个测试数据库。这假设您有一个来自生产数据库的.SQL备份文件(我在webmin中执行此操作)。

#!/bin/sh

dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"

dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "

export PGPASSWORD=MyPassword



echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"

echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"

echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"

PostgreSQL 9.1.2:

$ CREATEDB new_db_name -T orig_db_name -O db_user;