在PostgreSQL中创build一个数据库的副本

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

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

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(); 

贝尔的答案的命令行版本:

 createdb -O ownername -T originaldb newdb 

这应该在数据库主人的权限下运行,通常是postgres。

要用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 

不知道pgAdmin,但是pgdump为您提供了SQL中的数据库转储。 你只需要用同样的名字创build一个数据库,然后就可以了

 psql mydatabase < my dump 

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

在原始数据库处于stream量下的生产环境中,我简单地使用:

 pg_dump production-db | psql test-db 

我把这个方法和上面的例子结合起来。 我正在做一个“负载不足”的服务器,当我试图从@zbyszek的方法时,得到了错误。 我也是在“仅命令行”解决scheme之后。

createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users

下面是对我有用的(用nohup命令将输出移动到文件并保护服务器断开连接的命令 ):

  1. nohup pg_dump exampledb > example-01.sql
  2. createdb -O postgres exampledbclone_01

我的用户是“postgres”

  • nohup psql exampledbclone_01 < example-01.sql
  • 首先, sudo作为数据库用户:

     sudo su postgres 

    转到PostgreSQL命令行:

     psql 

    创build新的数据库,授予权限并退出:

     CREATE DATABASE new_database_name; GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user; \d 

    从旧数据库复制结构和数据到新数据库:

     pg_dump old_database_name | psql new_database_name 

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

    回答:

     CREATE DATABASE newdb WITH TEMPLATE originaldb; 

    尝试和testing。

    在pgAdmin中,您可以从原始数据库进行备份,然后只需创build一个新的数据库并从刚刚创build的备份中恢复:

    1. 右键单击源数据库,备份…并转储到文件。
    2. 右键单击“新build对象”,“新build数据库…”并命名目标。
    3. 右键单击新数据库,恢复…并select您的文件。

    PostgreSQL 9.1.2:

     $ CREATEDB new_db_name -T orig_db_name -O db_user; 

    对于那些仍然感兴趣的人,我想出了一个bash脚本,它或多或less地符合作者的想法。 我不得不在生产系统上做一个日常的业务数据库拷贝,这个脚本似乎是做的。 请记住更改数据库名称/用户/密码值。

     #!/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" 

    如果数据库有打开的连接,这个脚本可能会有所帮助。 我使用它从每天晚上的实时数据库备份中创build一个testing数据库。 这假设你有一个生产数据库的.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" 

    创build数据库转储

     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,断开你想用作模板的数据库。 然后select它作为创build新数据库的模板,这样可以避免出现已经使用的错误。

    尝试这个:

     CREATE DATABASE newdb WITH ENCODING='UTF8' OWNER=owner TEMPLATE=templatedb LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' CONNECTION LIMIT=-1; 

    gl XD