一个简单的PostgreSQL数据库间迁移步骤

434 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

1.禁止业务连接数据库

客户停止所有连接至10.1.1.1的应用程序。(或修改Postgresql数据库的pg_hba.conf文件,禁止所有IP地址连接数据库)
禁止所有IP地址连接数据库的方法是在pg_hba.conf文件的前端添加如下条目,0.0.0.0是所有客户端ip,reject是拒绝:

host all all 0.0.0.0/0 reject

应用程序停止之后,使用 ps -ef |grep postgres命令观察是否还有IP访问数据库。

2.使用如下命令从源端数据库导出数据和全局对象

这里建议将元数据信息和其他数据信息分开导出。比如角色、数据库和表空间这些属于全局信息,全局信息只能通过pg_dumpall进行导出。 通过pg_dumpall备份角色和表空间。

pg_dumpall -h localhost -U postgres --port=5866 -f backup.sql --globals-only  --clean –verbose

pg_dump相对于pg_dumpall更加高效。所以通过pg_dump导出某个数据库的数据,例如导出test数据库:

pg_dump --host localhost --port 5866 --username "postgres" --format custom --file "/xxxx/yyy/backup.dmp" "test"

如需导出多个数据库的数据,修改数据库名,多次导出多个库。
也可以使用pg_dumpall的方式,将所有数据全部导出,效率低下,不建议。
注:不建议使用pg_dumpall,因为该方式只能导出SQL文本,恢复极其耗时,而且无法开启并行。

3.打开目标端数据库,恢复全局对象并开始导入数据。

将bakcup.sql文件中涉及到全局信息的SQL语句拷贝并在目标数据库中运行,例如:

CREATE ROLE test LOGIN ENCRYPTED PASSWORD 'md52cc18edfxxxxxxxxx4610288ab1f1ca9' SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION;

恢复数据:

pg_restore -h localhost -p 5866 -U highgo -d highgo --create --verbose --format custom "/xxxx/yyy/backup.dmp "
  1. 导入完成后,psql进入数据库查看是否导入成功。 5.连接应用系统进行测试确保无误后正式恢复完毕。