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


当前回答

以下是仅使用pgadmin4 GUI(通过备份和恢复)在数据库上创建复制的整个过程

Postgres附带Pgadmin4。如果你使用macOS,你可以按CMD+SPACE并键入pgadmin4来运行它。这将在chrome中打开一个浏览器选项卡。


复制步骤

1.创建备份

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

2.为文件命名。

如测试12345。单击备份。这将创建一个二进制文件转储,它不是.sql格式

3.查看下载位置

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

4.查找下载文件的位置

在本例中,它是/users/vincenttang

5.从pgadmin还原备份

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

通过右键单击数据库->“还原”来执行此操作

6.选择文件查找器

确保手动选择文件位置,不要将文件拖放到pgadmin中的上传器字段。因为您将遇到错误权限。相反,找到您刚刚创建的文件:

7.查找所述文件

您可能需要将右下角的筛选器更改为“所有文件”。此后,从步骤4查找文件。现在点击右下角的“选择”按钮确认

8.还原所述文件

您将再次看到此页面,其中选择了文件的位置。继续并恢复它

9.成功

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

10.如果不成功:

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

执行此代码块:

DROP SCHEMA public CASCADE; CREATE SCHEMA public;

现在再次尝试步骤5至9,应该会成功

编辑-一些附加说明。如果您在上传过程中遇到错误,在还原过程中出现类似“archiver header 1.14 unsupported version”的内容,请更新PGADMIN4

其他回答

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

psql mydatabase < my dump

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

第4页管理:

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

右键单击“断开DB”

2.在旧数据库旁边创建新数据库:

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

点击create,然后左键单击新数据库以重新连接。

如果要复制整个模式,可以使用以下命令生成pg_dump:

pg_dump-h database.host.com-d数据库名-n schema_name-U数据库用户--密码

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

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-连接字符串

或者只需将其组合成一行:

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”

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

对于那些仍然感兴趣的人,我提出了一个bash脚本,它(或多或少)满足了作者的需求。我必须在生产系统上制作一份每日业务数据库副本,这个脚本似乎很有用。请记住更改数据库名称/user/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"