我今天使用postgres 并遇到了问题 我以那种方式转储数据库
pg_dump zeus_development -U test > zeus_development.dump.out
如果我想恢复到另一个数据库zeus_production
该怎么办?我该怎么办?
答案 0 :(得分:20)
简单,首先使用template0
作为template database创建数据库:
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
),我不建议这样做,因为这样会减少灵活性(例如恢复不同数据库名称)。
答案 1 :(得分:8)
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
才能实现此目标。
答案 2 :(得分:1)
简单地执行以下操作是否更容易?
createdb -U test -T zeus_development zeus_production
答案 3 :(得分:0)
它有一个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"
答案 4 :(得分:0)
这是一种 hacky 的实现方式,如果您有足够的时间和空间使用常规$ npm outdated -g
Package Current Wanted Latest Location
eslint 6.7.0 6.8.0 6.8.0 global
generator-wombytes-cpp 0.2.0 0.2.0 0.3.0 global
n 6.1.0 6.2.0 6.2.0 global
格式,并且可以安全地.sql
列出您的数据库名称和用户。
sed