我今天使用 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
和 foodog_production
数据库。
这将从转储 (
~/Desktop/pg_dump
) 中恢复数据库,这将使用转储时的名称创建数据库。重命名将数据库命名为您想要的任何名称。
如果您的用户名在两台计算机上相同,则可能不需要
--no-owner
。 就我而言,转储是按 user1
完成的,恢复是按 user2
完成的。新对象需要由 user2
拥有,并且 --no-owner
实现了这一点。
这在 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"
简单地执行以下操作不是更容易吗?
createdb -U test -T zeus_development zeus_production
如果您的转储不包含名称,则恢复将使用
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
感谢@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
这是一种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