2009-05-18 158 views

回答

840

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

请注意,originaldb需要处于空闲状态(无写入事务)才能工作。 – synecdoche 2010-05-19 23:51:39

+51

在pgAdmin3,在对象浏览器(左)窗格中,我可以选择`Servers` - > *(我的服务器)* - >`Databases`,右键单击数据库,并选择 “新建数据库”。其中一个选项是模板,用于创建数据库的SQL是等效的。它比同一台服务器上的转储/恢复速度快得多。 – jwhitlock 2011-06-17 15:19:09

+0

@Nathan Keller我把这个标记为正确的答案,因为它有更多的upvotes,并被要求标记。但我没有证实这一点,因为我没有时间。 – egaga 2011-10-02 17:05:07

44

不知道pgAdmin,但pgdump为您提供了SQL中的数据库转储。你只需要通过相同的名称创建一个数据库,并做

psql mydatabase < my dump 

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

+0

谢谢,我需要创建从另一台服务器转储,似乎这有助于:http://www.postgresql.org/docs/8.3/interactive/backup-dump。html#备份 - 转储 - 恢复 – egaga 2009-05-18 11:33:11

+16

你甚至可以执行`pg_dump -U postgres sourcedb | PSQL -U Postgres的newdb`虽然这种技术的效率可能有问题(因为你可能最终上下文读取和写入操作之间切换) – 2010-06-07 17:19:55

+1

你甚至可以从远程计算机通过ssh让您的转储:`SSH DBSERVER pg_dump的DBNAME | psql NEWDB` ...或`pg_dump DBNAME | ssh otherserver pgsql NEWDB` ...当然需要处理权限和身份验证,但是要处理它们。 – ghoti 2012-08-15 15:52:15

9

在pgAdmin的,你可以从你的原始数据库进行备份,然后只需创建一个新的数据库,并从刚创建的备份还原:

  1. 右键单击源数据库,备份...并转储到文件。
  2. 右键单击新建对象,新建数据库...并命名目标。
  3. 右键单击新数据库,恢复...并选择您的文件。
236

甲命令行版本的Bell's answer

createdb -O ownername -T originaldb newdb 

这应该下数据库主的特权运行,通常Postgres的。

8

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

答:

CREATE DATABASE newdb WITH TEMPLATE originaldb; 

屡试不爽。

5

的PostgreSQL 9.1.2:

$ CREATEDB new_db_name -T orig_db_name -O db_user; 
3

对于那些仍然有兴趣,我想出了一个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" 
2

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

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

-2

试试这个:

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

87

克隆与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 
11

我把这个方法与上面的例子一起拼凑起来。我正在研究一个“负载不足”的服务器,当我尝试@zbyszek的方法时出错。我也是在“仅限命令行”解决方案之后。

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

    my user is "postgres"

  3. nohup psql exampledbclone_01 < example-01.sql

39

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

pg_dump production-db | psql test-db 
2

要创建数据库转储

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 
10

首先,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