在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
命令将输出移动到文件并保护服务器断开连接的命令 ):
-
nohup pg_dump exampledb > example-01.sql
-
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的备份中恢复:
- 右键单击源数据库,备份…并转储到文件。
- 右键单击“新build对象”,“新build数据库…”并命名目标。
- 右键单击新数据库,恢复…并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
- 你如何在一个简单的PostgreSQL脚本中使用variables?
- 如何在PostgreSQL中UPSERT(MERGE,INSERT … ON DUPLICATE UPDATE)?
- 在Ubuntu上为Ruby on Rails安装PostgreSQL
- fe_sendauth:没有提供密码
- primefaces更新..在Postgres中select
- 如何彻底清除并重新安装Ubuntu上的postgresql?
- 如何在Postgres中使用Blob数据types
- Postgresql SQL GROUP BY具有任意精度的时间间隔(小至毫秒)
- 我应该在PostgreSQL数据库中select哪种时间戳types?