1. 迁移环境与准备工作
1.1 系统环境确认
在进行HGDB企业版到安全版的迁移前,需要确保目标环境满足以下条件:
- 操作系统:CentOS/RHEL 7.x(x86_64架构)
- 数据库版本:HGDB安全版6.0+
- 存储空间:至少为原数据库大小的2倍
- 内存:建议不低于8GB
重要提示:生产环境迁移前务必在测试环境验证完整流程,建议选择业务低峰期进行操作。
1.2 工具准备清单
需要提前准备好以下工具包:
- HGDB安全版安装介质
- 原企业版的pg_dump工具(版本需与企业版一致)
- 网络连通性测试工具(ping/telnet)
- 磁盘性能测试工具(dd/fio)
1.3 权限与账户配置
安全版相比企业版有更严格的权限控制,需要特别注意:
- 备份账户:需在企业版中具有SELECT权限
- 恢复账户:需在安全版中具有CREATEDB和CREATE ROLE权限
- 网络策略:开放5866端口(默认端口)的TCP访问
2. 备份策略设计与实施
2.1 备份类型选择指南
根据业务需求选择适合的备份方式:
| 备份类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 全量备份(Fc) | 首次迁移/完整恢复 | 数据完整 | 耗时较长 |
| 纯SQL备份(Fp) | 跨版本迁移 | 可读性强 | 恢复速度慢 |
| 模式级备份 | 部分业务迁移 | 针对性强 | 依赖关系需手动处理 |
2.2 实战备份命令详解
2.2.1 全库备份最佳实践
推荐使用custom格式(-Fc)进行备份:
pg_dump -h 192.168.65.10 -p 5866 -U backup_user \ -Fc -v -Z 6 --exclude-schema='temp*' \ -f /backup/hgdb_full_$(date +%Y%m%d).backup \ highgo_prod参数说明:
-Z 6:采用压缩级别6(平衡速度与压缩率)--exclude-schema:排除临时模式$(date +%Y%m%d):自动添加日期标签
2.2.2 大型数据库备份优化
对于超过100GB的数据库,建议:
- 使用并行备份(企业版5.6+支持):
pg_dump -j 4 -Fd -f /backup/hgdb_parallel highgo_prod - 拆分备份文件:
pg_dump -Fc -f /backup/hgdb_part1.backup -n schema1 highgo_prod pg_dump -Fc -f /backup/hgdb_part2.backup -n schema2 highgo_prod
2.3 备份验证步骤
- 检查备份文件完整性:
pg_restore -l /backup/hgdb_full.backup | head -20 - 验证备份日志:
grep -A 10 "Dumping database" /var/log/pg_dump.log - 采样检查关键表:
pg_restore -t important_table -a /backup/hgdb_full.backup | wc -l
3. 安全版恢复全流程
3.1 预恢复环境配置
- 初始化安全版数据库:
initdb -D /data/hgdb_secure -A md5 -W - 调整安全参数(pg_hba.conf):
host all all 192.168.65.0/24 md5 - 优化恢复性能(postgresql.conf):
shared_buffers = 4GB maintenance_work_mem = 1GB max_wal_size = 8GB
3.2 分步恢复实战
3.2.1 结构恢复(先导步骤)
pg_restore -h 127.0.0.1 -p 5866 -U sysdba \ -C -d postgres -j 4 --schema-only \ /backup/hgdb_full.backup3.2.2 数据恢复(核心步骤)
pg_restore -h 127.0.0.1 -p 5866 -U sysdba \ -d highgo_secure -j 4 --data-only \ /backup/hgdb_full.backup3.2.3 权限修复(安全版特殊处理)
-- 批量修正对象所有者 DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT schemaname, tablename FROM pg_tables WHERE tableowner != 'sysdba' LOOP EXECUTE 'ALTER TABLE ' || quote_ident(r.schemaname) || '.' || quote_ident(r.tablename) || ' OWNER TO sysdba'; END LOOP; END $$;3.3 恢复后验证
- 数据一致性检查:
SELECT schemaname, relname, pg_size_pretty(pg_total_relation_size(quote_ident(schemaname)||'.'||quote_ident(relname))) FROM pg_stat_user_tables ORDER BY pg_total_relation_size(quote_ident(schemaname)||'.'||quote_ident(relname)) DESC LIMIT 20; - 安全策略检查:
psql -U sysdba -c "\dp" - 性能基准测试:
pgbench -i -s 100 highgo_secure pgbench -c 10 -j 2 -T 60 highgo_secure
4. 迁移问题全解
4.1 常见错误与解决方案
| 错误现象 | 原因分析 | 解决方案 |
|---|---|---|
| 权限拒绝(ERROR: permission denied) | 安全版强制访问控制 | 提前在安全版创建同名角色 |
| 版本不兼容(ERROR: unrecognized configuration parameter) | 参数差异 | 手动调整postgresql.conf |
| 数据校验失败 | 字符集不一致 | 恢复前设置client_encoding=UTF8 |
| 性能下降明显 | 安全审计开销 | 调整security_audit参数 |
4.2 性能优化技巧
- 临时关闭审计提升恢复速度:
ALTER SYSTEM SET security_audit.enable = off; SELECT pg_reload_conf(); - 并行恢复设置:
pg_restore -j 8 ... - WAL优化配置:
wal_level = minimal full_page_writes = off
4.3 安全策略迁移要点
- 角色权限迁移脚本:
-- 导出企业版权限 \o /tmp/roles.sql SELECT 'CREATE ROLE ' || rolname || ' WITH ' || CASE WHEN rolcanlogin THEN 'LOGIN ' ELSE 'NOLOGIN ' END || 'PASSWORD ''' || rolpassword || ''';' FROM pg_shadow; \o - 行级安全策略迁移:
-- 导出RLS策略 SELECT pg_get_ruledef(oid) FROM pg_rewrite WHERE ev_class = 'mytable'::regclass;
5. 生产环境迁移checklist
5.1 迁移前检查项
- [ ] 验证备份文件完整性(checksum比对)
- [ ] 确认安全版磁盘空间充足(df -h)
- [ ] 停用企业版连接池(pgBouncer/Haproxy)
- [ ] 获取业务方停机时间窗口确认
5.2 迁移中监控要点
- 实时监控恢复进度:
watch -n 5 'ps aux | grep pg_restore' - 资源使用监控:
dstat -cmdn --disk-util - 错误日志跟踪:
tail -f /var/log/hgdb/postgresql-*.log
5.3 迁移后验证流程
- 关键业务表记录数比对:
SELECT '企业版', COUNT(*) FROM enterprise.tbl UNION ALL SELECT '安全版', COUNT(*) FROM secure.tbl; - 应用连接测试:
for i in {1..10}; do psql -h secure_host -c "SELECT 1"; done - 性能基准回归测试:
compare_bench.sh enterprise.log secure.log
在实际迁移过程中,我发现安全版对特殊字符的处理更为严格,建议在迁移前使用\df命令检查所有函数定义,特别关注涉及加密和网络相关的函数。对于大型分区表,采用按分区并行恢复的策略可以显著缩短停机时间——先恢复主表结构,然后并行恢复各个分区数据。