在pgAdmin中将整个数据库(其结构和数据)复制到新数据库的正确方法是什么?在PostgreSQL中创建数据库副本
回答
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,但pgdump
为您提供了SQL中的数据库转储。你只需要通过相同的名称创建一个数据库,并做
psql mydatabase < my dump
恢复所有表及其数据和所有访问权限的。
谢谢,我需要创建从另一台服务器转储,似乎这有助于:http://www.postgresql.org/docs/8.3/interactive/backup-dump。html#备份 - 转储 - 恢复 – egaga 2009-05-18 11:33:11
你甚至可以执行`pg_dump -U postgres sourcedb | PSQL -U Postgres的newdb`虽然这种技术的效率可能有问题(因为你可能最终上下文读取和写入操作之间切换) – 2010-06-07 17:19:55
你甚至可以从远程计算机通过ssh让您的转储:`SSH DBSERVER pg_dump的DBNAME | psql NEWDB` ...或`pg_dump DBNAME | ssh otherserver pgsql NEWDB` ...当然需要处理权限和身份验证,但是要处理它们。 – ghoti 2012-08-15 15:52:15
在pgAdmin的,你可以从你的原始数据库进行备份,然后只需创建一个新的数据库,并从刚创建的备份还原:
- 右键单击源数据库,备份...并转储到文件。
- 右键单击新建对象,新建数据库...并命名目标。
- 右键单击新数据库,恢复...并选择您的文件。
将整个数据库(其结构和数据)复制到pgAdmin中的新数据库的正确方法是什么?
答:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
屡试不爽。
的PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
对于那些仍然有兴趣,我想出了一个bash脚本,它(或多或少)笔者想要的东西。我不得不在生产系统上做一个日常的商业数据库副本,这个脚本似乎有诀窍。请记住更改数据库名称/用户/密码值。
#!/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"
使用pgAdmin,断开您要用作模板的数据库。然后你选择它作为创建新数据库的模板,这样可以避免使用已经存在的错误。
试试这个:
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
克隆与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;
它会杀死到源中的所有连接数据库避免错误
ERROR: source database "SOURCE_DB" is being accessed by other users
我把这个方法与上面的例子一起拼凑起来。我正在研究一个“负载不足”的服务器,当我尝试@zbyszek的方法时出错。我也是在“仅限命令行”解决方案之后。
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
my user is "postgres"
nohup psql exampledbclone_01 < example-01.sql
在生产环境中,原始数据库处于流量下,我只是简单地使用:
pg_dump production-db | psql test-db
要创建数据库转储
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
要resote数据库转储
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
首先,sudo
作为数据库用户:
sudo su postgres
转到PostgreSQL的命令行:
psql
创建新的数据库,给予的权利和退出:
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
- 1. 在iPhone中创建数据库副本
- 2. 在家里创建数据库副本
- 3. 在SQLite数据库中创建Oracle数据库表的副本
- 4. PostgreSQL如何创建数据库或模式的副本?
- 5. createEditableCopyOfDatabaseIfNeeded创建数据库的空副本!
- 6. 无法在Postgresql中创建数据库
- 7. 在SQL Server 2008 R2中创建一次性数据库副本
- 8. 在连接上创建PostgreSQL数据库
- 9. 如何创建数据库的副本,包括Windows中的表(数据库)
- 10. 在Bluehost共享Postgresql数据库中创建PostgreSql的基本类型
- 11. 如何在PostgreSQL中创建表的副本?
- 12. Django模型创建数据副本
- 13. 在Postgresql中使用副本?
- 14. 创建副本
- 15. 运行ddl脚本来创建数据库或创建模板数据库的副本
- 16. 面料的PostgreSQL数据库创建
- 17. 创建PostgreSQL数据库编程
- 18. Heroku PostgreSQL用户和数据库创建
- 19. 使用symfony从postgreSQL创建数据库
- 20. 创建PostgreSQL数据库使用CakePHP 3
- 21. 的Rails:创建我的PostgreSQL数据库
- 22. Postgresql创建存储数据库链接
- 23. PostgreSQL数据库未被创建
- 24. 如何批量创建PostgreSQL数据库?
- 25. 如何创建和维护SQL Server数据库副本
- 26. 创建数据库唯一模式的副本
- 27. sp_rda_reauthorize_db不创建远程数据库副本
- 28. 动态创建测试数据库副本
- 29. 如何创建生产SQL数据库的副本?
- 30. 在unity3d中创建本地数据库
请注意,originaldb需要处于空闲状态(无写入事务)才能工作。 – synecdoche 2010-05-19 23:51:39
在pgAdmin3,在对象浏览器(左)窗格中,我可以选择`Servers` - > *(我的服务器)* - >`Databases`,右键单击数据库,并选择 “新建数据库”。其中一个选项是模板,用于创建数据库的SQL是等效的。它比同一台服务器上的转储/恢复速度快得多。 – jwhitlock 2011-06-17 15:19:09
@Nathan Keller我把这个标记为正确的答案,因为它有更多的upvotes,并被要求标记。但我没有证实这一点,因为我没有时间。 – egaga 2011-10-02 17:05:07