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


当前回答

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

答覆:

CREATE DATABASE newdb WITH TEMPLATE originaldb;

经过尝试和测试。

其他回答

第4页管理:

1.选择要复制的数据库并断开连接

右键单击“断开DB”

2.在旧数据库旁边创建新数据库:

给它起个名字。在“定义”选项卡中,选择第一个表格作为模板(下拉菜单)

点击create,然后左键单击新数据库以重新连接。

创建数据库转储

cd /var/lib/pgsql/
pg_dump database_name> database_name.out

重新记录数据库转储

psql -d template1
CREATE DATABASE database_name WITH  ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8' TEMPLATE template0;
CREATE USER  role_name WITH PASSWORD 'password';
ALTER DATABASE database_name OWNER TO role_name;
ALTER USER role_name CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE database_name to role_name;


CTR+D(logout from pgsql console)
cd /var/lib/pgsql/

psql -d database_name -f database_name.out

在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;

如果数据库具有打开的连接,则此脚本可能会有所帮助。我每天晚上都用这个从实时生产数据库的备份中创建一个测试数据库。这假设您有一个来自生产数据库的.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"

在文档中,不鼓励将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仅备份角色。