我正在字符串将数据库从生产机器备份到备用机器。
我的生产机器是debian(未指定版本(发行版
我的备用机器是ubuntu 20.10发行版
在互联网上读了一些之后,以下是我能够完成的
- pg_dump-h 123.123.123.123-p 5432 my_db>my_db.bak->检查
- psql<createDatebase.sql->选中此项,创建一个简单的删除/创建数据库mydb所有者mydbbackup
- psql<my_db.back->检查
到目前为止很好
- 与我的sqlworkbench连接到db->检查
- 使用导入的表->嗯,不检查
问题在于表和序列的所有权。导入时,postgres是它们的所有者,但我希望my_db_backup作为所有者。
作为一种变通方法,我尝试了
- 将表xxx所有者更改为my_db_backup;->检查每张表
- 更改序列(如果存在(xxx OWNER TO my_db_backup->它需要很长时间,却无法完成
最后阶段(更改所有权(的命令是psql<finalize.sql
finalize.sql是
connect my_db;
ALTER TABLE xxx OWNER TO my_db_backup;
ALTER SEQUENCE IF EXISTS seq_xxx OWNER TO my_db_backup; -- this takes forever
我错过了什么?
我更喜欢直接与正确的所有者导入,而不是在之后更改所有者,但只要我可以更改my_db 中的所有对象,这仍然是可以接受的
tnx的帮助
我终于能够用不同的用户完成导入,如下所示
psql -U my_db_backup < my_db.bak
为了避免询问密码,我不得不像这个一样在pg_hba.conf中输入
local my_db my_db_backup trust
为了避免在pg_dump过程中请求密码,我不得不在我的生产机器中添加这个条目
host my_db postgres 456.456.456.456/32 trust
其中456.456.456.456 id为备用机器的ip。
我还必须稍微更改一下pg_dump,以避免不同用户导入时出现错误
pg_dump -h 123.123.123.123 -p 5432 --no-owner --no-acl my_db > my_db.bak
所以完整的脚本看起来像
pg_dump -h 123.123.123.123 -p 5432 --no-owner --no-acl my_db > my_db.bak
psql < createDatabase.sql
psql -U my_db_backup < my_db.bak
编辑:要让脚本对任何用户都可用,需要做一些事情
pg_dump -h 123.123.123.123 -p 5432 -U postgres --no-owner --no-acl -w my_db > my_db.bak
psql -U postgres < createDatabase.sql
psql -U my_db_backup < my_db.bak
只需要添加-U postgres,因为pg_dump试图以当前用户身份登录,所以如果您以root用户身份运行脚本,例如,root用户pg_dump和psql将尝试以root用户的身份登录,但显然会失败。
另一个是-w选项,它是使pg_dump不要求密码所必需的。