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

dsf9zpds  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(6)|浏览(265)

我今天使用postgres时遇到了一个问题,我以这种方式转储数据库

pg_dump zeus_development -U test > zeus_development.dump.out

如果我想还原到另一个数据库zeus_production,该怎么办
我能怎么办?

zpqajqem

zpqajqem1#

很简单,首先使用template0作为template database创建数据库:

createdb -U test -T template0 zeus_production

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

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

恢复时,请使用template0 explicit,因为它总是一个空的且不可修改的数据库。如果不使用explicit模板,PostgreSQL将假定template1,如果它包含一些对象,如转储的数据库已经包含的表或函数,则在恢复时会出现一些错误。
尽管如此,即使你在一个同名的数据库(zeus_development)上恢复,你也应该用同样的方法创建(或重新创建)它,除非你在转储时使用了-C选项(或者如果使用二进制转储,使用pg_restore-C),我不推荐这样做,因为这样会给你带来更少的灵活性(比如在不同的数据库名称上恢复)。

jjhzyzn0

jjhzyzn02#

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

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

在序列之前不存在foodog_developmentfoodog_production数据库。
这将从转储文件(~/Desktop/pg_dump)中恢复数据库,它将使用转储文件的名称创建数据库。重命名将DB命名为您想要的任何名称。
如果您的用户名在两台机器上相同,则可能不需要--no-owner。在我的示例中,转储是作为user1完成的,恢复是作为user2完成的。新对象需要由user2拥有,--no-owner可以实现这一点。

0ejtzxu1

0ejtzxu13#

简单地做以下事情不是更容易吗?

createdb -U test -T zeus_development zeus_production
cgyqldqp

cgyqldqp4#

它有一个answer on 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"
q1qsirdb

q1qsirdb5#

这里有一个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
ctehm74n

ctehm74n6#

如果转储文件不包括名称,则还原将使用DESTINATION中定义的DB。SOURCEDESTINATION都是连接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

相关问题