PostgreSQL服务器能否创建数据一致的双数据库?求实现方法
PostgreSQL 拆分工作与培训数据库的解决方案
方法一:用模板库快速初始化(适合一次性创建)
- 先清理原数据库的活跃连接,不然没法用模板创建:
\c postgres SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '你的原数据库名'; - 直接基于原库克隆出两个新库:
CREATE DATABASE work_db WITH TEMPLATE 你的原数据库名; CREATE DATABASE training_db WITH TEMPLATE 你的原数据库名; - 提醒: 创建期间原库会被锁定,挑业务低峰期操作;大库用这个方法比备份恢复快很多,因为是文件级复制。
方法二:pg_dump + pg_restore 备份恢复(更灵活)
- 先导出原库的完整备份:
说明:pg_dump -U 你的用户名 -d 你的原数据库名 -F c -f original_db.dump-F c是自定义压缩格式,恢复速度快;要纯SQL脚本的话换-F p。 - 分别恢复到两个新库:
# 先建空库 createdb -U 你的用户名 work_db createdb -U 你的用户名 training_db # 恢复到工作库 pg_restore -U 你的用户名 -d work_db original_db.dump # 恢复到培训库 pg_restore -U 你的用户名 -d training_db original_db.dump - 优势: 备份时可以过滤数据(比如用
-t指定要同步的表,--exclude-table排除不需要的),适合后续要调整培训库数据的情况;而且不用长时间锁定原库。
后续数据同步(可选)
如果之后需要保持两个库和工作库数据一致,可选这两种方式:
- 定时备份恢复:写个脚本定时跑pg_dump+pg_restore,适合培训库不需要实时同步的场景。
- 逻辑复制:工作库建发布,培训库建订阅,实现增量同步,适合近实时需求:
注意: 逻辑复制需要PostgreSQL 10及以上版本,而且所有要同步的表必须有主键或唯一索引。-- 在工作库创建发布(同步所有表) CREATE PUBLICATION work_pub FOR ALL TABLES; -- 在培训库创建订阅 CREATE SUBSCRIPTION training_sub CONNECTION 'dbname=work_db user=你的用户名' PUBLICATION work_pub;
内容的提问来源于stack exchange,提问作者millilerato
相关产品推荐
相关产品推荐

