在PostgreSQL中创建数据库的副本

时间:2009-05-18 07:00:18

标签: postgresql

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

19 个答案:

答案 0 :(得分:1012)

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

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

答案 1 :(得分:281)

命令行版本Bell's answer

createdb -O ownername -T originaldb newdb

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

答案 2 :(得分:103)

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

答案 3 :(得分:66)

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

pg_dump production-db | psql test-db

答案 4 :(得分:47)

不了解pgAdmin,但是pgdump为您提供了SQL中数据库的转储。您只需要使用相同的名称创建数据库并执行

psql mydatabase < my dump

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

答案 5 :(得分:19)

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

答案 6 :(得分:16)

我将这种方法与上面的例子拼凑在一起。我正在负责#34;负载#34;当我从@zbyszek尝试接近时,服务器并得到了错误。我也只是在&#34;命令行之后&#34;解。

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

      

    我的用户是&#34; postgres&#34;

  3.   
  4. nohup psql exampledbclone_01 < example-01.sql
  5.   

答案 7 :(得分:12)

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

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

答案 8 :(得分:10)

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

答案:

CREATE DATABASE newdb WITH TEMPLATE originaldb;

尝试并测试过。

答案 9 :(得分:7)

PostgreSQL 9.1.2:

$ CREATEDB new_db_name -T orig_db_name -O db_user;

答案 10 :(得分:5)

对于那些仍然感兴趣的人,我提出了一个bash脚本(或多或少)做了作者想要的东西。我不得不在生产系统上制作日常业务数据库副本,这个脚本似乎可以解决问题。请记住更改数据库名称/用户/ pw值。

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

答案 11 :(得分:5)

创建数据库转储

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

答案 12 :(得分:3)

documentation开始,不鼓励使用createdbCREATE DATABASE模板:

  

虽然可以复制除template1之外的数据库   指定其名称作为模板,这不是(还)作为一个   通用“COPY DATABASE”设施。主要限制是   没有其他会话可以连接到模板数据库   它被复制了。如果有任何其他连接,CREATE DATABASE将失败   它开始时存在;否则,与模板的新连接   数据库被锁定,直到CREATE DATABASE完成。

pg_dumppg_dumpall是复制数据库和所有数据的好方法。如果您使用的是像pgAdmin这样的GUI,则在执行备份命令时会在后台调用这些命令。复制到新数据库分两个阶段完成:备份和还原

pg_dumpall保存PostgreSQL集群上的所有数据库。这种方法的缺点是最终会得到一个可能非常大的文本文件,其中包含创建数据库和填充数据所需的SQL。此方法的优点是您可以免费获得群集的所有角色(权限)。要转储所有数据库,请从超级用户帐户

执行此操作
pg_dumpall > db.out

并恢复

psql -f db.out postgres

pg_dump有一些压缩选项可以为您提供更小的文件。我有一个生产数据库,我每天使用

进行两次cron作业备份
pg_dump --create --format=custom --compress=5 ==file=db.dump mydatabase

其中compress是压缩级别(0到9),create告诉pg_dump添加命令来创建数据库。使用

还原(或移动到新群集)
pg_restore -d newdb db.dump

其中newdb是您要使用的数据库的名称。

要考虑的其他事项

PostgreSQL使用ROLES来管理权限。这些不会被pg_dump复制。此外,我们还没有处理 postgresql.conf pg_hba.conf 中的设置(如果您将数据库移动到另一台服务器)。你必须自己弄清楚conf设置。但是我发现了一个用于备份角色的技巧。角色在群集级别进行管理,您可以要求pg_dumpall仅使用--roles-only命令行开关备份角色。

答案 13 :(得分: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"

答案 14 :(得分:1)

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

答案 15 :(得分:1)

这是仅使用pgadmin4 GUI(通过备份和还原)在数据库上创建副本的整个过程

Postgres随附Pgadmin4。如果使用macOS,则可以按CMD + SPACE并键入pgadmin4来运行它。这将在Chrome中打开一个浏览器标签。


复制步骤

1。创建备份

通过右键单击数据库->“备份”来完成此操作

enter image description here

2。给文件起一个名字。

类似于test12345。单击备份。这将创建一个二进制文件转储,它不是.sql格式

enter image description here

3。查看下载位置

屏幕的右下角应该有一个弹出窗口。点击“更多详细信息”页面,查看备份下载到的位置

enter image description here

4。找到下载文件的位置

在这种情况下,它是/users/vincenttang

enter image description here

5。从pgadmin恢复备份

假设您正确执行了步骤1到步骤4,您将拥有一个还原二进制文件。有时您的同事希望在其本地计算机上使用您的还原文件。说过有人去pgadmin并恢复

通过右键单击数据库->“恢复”来完成此操作

enter image description here

6。选择文件查找器

确保手动选择文件位置,请勿将文件拖放到pgadmin的上载器字段中。因为您会遇到错误权限。而是找到您刚刚创建的文件:

enter image description here

7。找到所说的文件

您可能必须将右下角的过滤器更改为“所有文件”。此后,从第4步中找到文件。现在,点击右下角的“选择”按钮进行确认

enter image description here

8。恢复所说的文件

您将再次看到此页面,其中包含选定文件的位置。继续并还原它

enter image description here

9。成功

如果一切正常,则右下角应弹出一个指示恢复成功的指示器。您可以导航到表以查看每个表上的数据是否已正确还原。

10。如果不成功:

如果步骤9失败,请尝试删除数据库上的旧公共模式。转到“查询工具”

enter image description here

执行此代码块:

DROP SCHEMA public CASCADE; CREATE SCHEMA public;

enter image description here

现在再次尝试步骤5到9,应该可以解决

答案 16 :(得分:0)

如果要复制整个架构,则可以使用以下命令进行pg_dump:

pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password

当您要导入该转储时,可以使用:

psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql

有关连接字符串的更多信息:https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING

或仅将其组合在一个衬纸中:

pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”

答案 17 :(得分:0)

  1. 在pgAdmin中打开主窗口,然后打开另一个查询工具窗口
  2. 在pgAdmin的主窗口中,

断开要用作模板的“模板化”数据库的连接。

  1. 转到“查询工具”窗口

按如下所示运行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;

答案 18 :(得分:0)

pgAdmin4:

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

右键 “断开数据库连接”

2。在旧数据库旁边创建一个新数据库:

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

点击创建,然后在新数据库上单击鼠标左键以重新连接。