我今天使用 postgres 遇到问题我以这种方式转储数据库
pg_dump zeus_development -U test > zeus_development.dump.out
如果我想恢复到另一个数据库 zeus_production
我该怎么办?
我今天使用 postgres 遇到问题我以这种方式转储数据库
pg_dump zeus_development -U test > zeus_development.dump.out
如果我想恢复到另一个数据库 zeus_production
我该怎么办?
很简单,首先使用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
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
nor数据库。foodog_production
这将从转储 ( ) 中恢复数据库,~/Desktop/pg_dump
这将使用它被转储的名称创建它。重命名将数据库命名为您想要的任何名称。
如果您的--no-owner
用户名在两台机器上相同,则可能不需要。在我的情况下,转储完成为user1
,恢复完成为user2
. 新对象需要拥有user2
并--no-owner
实现这一点。
简单地执行以下操作不是更容易吗?
createdb -U test -T zeus_development zeus_production
这在 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"
这是一种很老套的方法,只有当你有足够的空间和时间来使用常规.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