我今天使用postgres时遇到了一个问题,我以这种方式转储数据库
pg_dump zeus_development -U test > zeus_development.dump.out
如果我想还原到另一个数据库zeus_production,该怎么办我能怎么办?
zpqajqem1#
很简单,首先使用template0作为template database创建数据库:
template0
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),我不推荐这样做,因为这样会给你带来更少的灵活性(比如在不同的数据库名称上恢复)。
template1
zeus_development
-C
pg_restore
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_development或foodog_production数据库。这将从转储文件(~/Desktop/pg_dump)中恢复数据库,它将使用转储文件的名称创建数据库。重命名将DB命名为您想要的任何名称。如果您的用户名在两台机器上相同,则可能不需要--no-owner。在我的示例中,转储是作为user1完成的,恢复是作为user2完成的。新对象需要由user2拥有,--no-owner可以实现这一点。
foodog_development
foodog_production
~/Desktop/pg_dump
--no-owner
user1
user2
0ejtzxu13#
简单地做以下事情不是更容易吗?
createdb -U test -T zeus_development zeus_production
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:
$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"
q1qsirdb5#
这里有一个hacky的方法,* 只有 * 当你有足够的空间和时间使用常规的.sql,并且你可以安全地使用sed输出你的数据库名和用户时,这个方法才有效。
.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
ctehm74n6#
如果转储文件不包括名称,则还原将使用DESTINATION中定义的DB。SOURCE和DESTINATION都是连接URL。不使用--create的转储
DESTINATION
SOURCE
--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
6条答案
按热度按时间zpqajqem1#
很简单,首先使用
template0
作为template database创建数据库:然后,恢复此数据库上的转储:
恢复时,请使用
template0
explicit,因为它总是一个空的且不可修改的数据库。如果不使用explicit模板,PostgreSQL将假定template1
,如果它包含一些对象,如转储的数据库已经包含的表或函数,则在恢复时会出现一些错误。尽管如此,即使你在一个同名的数据库(
zeus_development
)上恢复,你也应该用同样的方法创建(或重新创建)它,除非你在转储时使用了-C
选项(或者如果使用二进制转储,使用pg_restore
的-C
),我不推荐这样做,因为这样会给你带来更少的灵活性(比如在不同的数据库名称上恢复)。jjhzyzn02#
PostgresSQL文档影响了我使用自定义格式。我已经使用它很多年了,它似乎有很多优点,但你的里程可能会有所不同。也就是说,以下是对我有效的方法:
在序列之前不存在
foodog_development
或foodog_production
数据库。这将从转储文件(
~/Desktop/pg_dump
)中恢复数据库,它将使用转储文件的名称创建数据库。重命名将DB命名为您想要的任何名称。如果您的用户名在两台机器上相同,则可能不需要
--no-owner
。在我的示例中,转储是作为user1
完成的,恢复是作为user2
完成的。新对象需要由user2
拥有,--no-owner
可以实现这一点。0ejtzxu13#
简单地做以下事情不是更容易吗?
cgyqldqp4#
它有一个answer on dba.stackexchange,我在这里复制它:
让我们定义几个变量,使其余的更容易复制/粘贴
下面假设您的备份是使用如下所示的“自定义”格式创建的:
要将
$db_dump_file
恢复为新的数据库名称$new_db
:q1qsirdb5#
这里有一个hacky的方法,* 只有 * 当你有足够的空间和时间使用常规的
.sql
,并且你可以安全地使用sed
输出你的数据库名和用户时,这个方法才有效。ctehm74n6#
如果转储文件不包括名称,则还原将使用
DESTINATION
中定义的DB。SOURCE
和DESTINATION
都是连接URL。不使用
--create
的转储不使用
--create
进行恢复