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


当前回答

使用pgAdmin,断开要用作模板的数据库。然后选择它作为创建新数据库的模板,这样可以避免出现已在使用中的错误。

其他回答

如果要复制整个模式,可以使用以下命令生成pg_dump:

pg_dump-h database.host.com-d数据库名-n schema_name-U数据库用户--密码

当您想要导入该转储时,可以使用:

psql“host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”-f sql_dump_to_import.sql

有关连接字符串的详细信息:https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-连接字符串

或者只需将其组合成一行:

pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”

在文档中,不鼓励将createdb或CREATE DATABASE与模板一起使用:

尽管可以通过以下方式复制模板1以外的数据库将其名称指定为模板,这还不是通用“复制数据库”功能。主要限制是没有其他会话可以连接到模板数据库它正在被复制。如果有任何其他连接,CREATE DATABASE将失败启动时存在;否则,将创建到模板的新连接数据库被锁定,直到CREATE database完成。

pg_dump或pg_dumpall是复制数据库和所有数据的好方法。如果您使用的是类似于pgAdmin的GUI,则在执行备份命令时,会在后台调用这些命令。复制到新数据库分两个阶段完成:备份和恢复

pg_dumpall保存PostgreSQL集群上的所有数据库。这种方法的缺点是,您最终会得到一个可能非常大的文本文件,其中包含创建数据库和填充数据所需的SQL。这种方法的优点是您可以免费获得集群的所有角色(权限)。要转储所有数据库,请从超级用户帐户执行此操作

pg_dumpall > db.out

和恢复

psql -f db.out postgres

pgdump有一些压缩选项,可以为您提供更小的文件。我有一个生产数据库,每天使用cron作业备份两次

pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase

其中compress是压缩级别(0到9),create告诉pgdump添加命令以创建数据库。使用还原(或移动到新群集)

pg_restore -d newdb db.dump

其中newdb是要使用的数据库的名称。

其他需要考虑的事情

PostgreSQL使用ROLES管理权限。pg_dump不会复制这些文件。此外,我们还没有处理postgresql.conf和pg_hba.conf中的设置(如果要将数据库移动到另一个服务器)。您必须自己计算conf设置。但我刚刚发现了一个备份角色的技巧。角色是在集群级别管理的,您可以使用--Roles only命令行开关要求pg_dumpall仅备份角色。

对于那些仍然感兴趣的人,我提出了一个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"

不知道pgAdmin,但pgdump为您提供了SQL中数据库的转储。您只需要使用相同的名称创建数据库

psql mydatabase < my dump

以恢复所有表及其数据和所有访问权限。

要使用postgres克隆现有数据库,您可以这样做

/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();

/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;

IT将终止与源数据库的所有连接,以避免错误

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