如何将postgres数据库恢复为另一个数据库名称

问题描述 投票:0回答:7

我今天使用 postgres 并遇到了问题 我就这样转储数据库

 pg_dump zeus_development -U test > zeus_development.dump.out

如果我想要恢复到另一个数据库 zeus_Production

我该怎么办?

postgresql
7个回答
50
投票

简单,首先使用

template0
作为您的模板数据库创建数据库:

createdb -U test -T template0 zeus_production

然后,恢复此数据库上的转储:

psql -U test zeus_production -f /path/to/zeus_development.dump.out

恢复时,始终使用

template0
显式,因为它始终是一个空且不可修改的数据库。如果您不使用显式模板,PostgreSQL 将假定
template1
,并且如果它具有某些对象,例如转储数据库已有的表或函数,则在恢复时会出现一些错误。

尽管如此,即使您要恢复具有相同名称的数据库 (

zeus_development
),您也应该以相同的方式创建(或重新创建)它。除非您在转储时使用
-C
选项(如果使用二进制转储,则使用
-C
pg_restore
),我不建议这样做,因为这会降低灵活性(例如在不同的数据库名称上恢复)。


28
投票

PostgresSQL 文档影响了我使用自定义格式。 我已经使用它很多年了,它似乎有各种优点,但你的里程可能会有所不同。 也就是说,这对我有用:

pg_restore --no-owner --dbname postgres --create ~/Desktop/pg_dump 
psql --dbname postgres -c 'ALTER DATABASE foodog_production RENAME TO foodog_development'

序列之前不存在

foodog_development
foodog_production
数据库。

这将从转储 (

~/Desktop/pg_dump
) 中恢复数据库,这将使用转储时的名称创建数据库。重命名将数据库命名为您想要的任何名称。

如果您的用户名在两台计算机上相同,则可能不需要

--no-owner
。 就我而言,转储是按
user1
完成的,恢复是按
user2
完成的。新对象需要由
user2
拥有,并且
--no-owner
实现了这一点。


8
投票

这在 dba.stackexchange 上有一个 答案,我在这里复制:

让我们定义一些变量,以使其余部分更容易复制/粘贴

old_db=my_old_database
new_db=new_database_name
db_dump_file=backups/my_old_database.dump
user=postgres

以下假设您的备份是使用“自定义”格式创建的,如下所示:

pg_dump -U $user -F custom $old_db > "$db_dump_file"

要将

$db_dump_file
恢复为新的数据库名称
$new_db
:

dropdb   -U $user --if-exists  $new_db
createdb -U $user -T template0 $new_db

pg_restore -U $user -d $new_db "$db_dump_file"

7
投票

简单地执行以下操作不是更容易吗?

createdb -U test -T zeus_development zeus_production

5
投票

如果您的转储不包含名称,则恢复将使用

DESTINATION
中定义的数据库。
SOURCE
DESTINATION
都是 连接 URL

转储不带

--create

pg_dump \
  --clean --if-exists \
  --file ${dump_path} \
  --format=directory \
  --jobs 5 \
  --no-acl \
  --no-owner \
  ${SOURCE}

恢复无

--create

pg_restore \
  --clean --if-exists \
  --dbname=${DESTINATION} \
  --format=directory \
  --jobs=5 \
  --no-acl \
  --no-owner \
  $dump_path

2
投票

感谢@mmel 的回答。但这是我调整的,对我有用:

转储:

pg_dump \
  --file {filename}.tar \
  --format=tar \
  --no-acl \
  --no-owner \
  --no-privileges \
  -U {username} \
  -h {host} \
  -p {port} \
  {db-name}

恢复:

pg_restore \
  --format=tar \
  --no-acl \
  --no-owner \
  --no-privileges \
  -U {username} \
  -h {host} \
  -p {port} \
  {db-name}
  {same-filename-as-dump}.tar


0
投票

这是一种hacky的方法,仅当您有足够的空间和时间来使用常规.sql

格式,并且您可以安全地
sed
出您的数据库名称和用户时,该方法才有效。

$ pg_dump -U my_production_user -h localhost my_production > my_prod_dump.sql $ sed -i 's/my_production_user/my_staging_user/g' my_prod_dump.sql $ sed -i 's/my_production/my_staging/g' my_prod_dump.sql $ mv my_prod_dump.sql my_staging_dump.sql $ sudo su postgres -c psql psql> drop database my_staging; psql> create database my_staging owner my_staging_user; psql> \c my_staging; psql> \i my_staging_dump.sql
    
© www.soinside.com 2019 - 2024. All rights reserved.