PostgreSQL使用pg_dump导出时如何排除COMMENT ON DATABASE语句
解决方案
PostgreSQL 9.6版本原生pg_dump没有单独排除数据库级COMMENT语句的参数,可通过以下两种无数据损坏风险的方案解决问题:
方案一:使用官方归档+元数据过滤(最安全,推荐)
基于pg_dump自定义归档格式和pg_restore的列表过滤能力实现,完全通过PostgreSQL官方工具操作,不会触碰业务数据内容,不存在文本过滤的误删风险:
- 替换原sql格式导出命令,使用自定义归档格式导出备份:
pg_dump --no-owner --clean --blobs --no-privileges -U dbuser -F c old_dbname -f bkpfile.dump
- 可以选择生成纯净sql文件后导入,或直接过滤后导入新库:
- 生成无数据库级COMMENT的sql备份文件:
pg_restore -L <(pg_restore -l bkpfile.dump | grep -v 'COMMENT - DATABASE') bkpfile.dump > clean_bkp.sql
- 直接导入新数据库,无需生成中间文件:
pg_restore --no-owner --no-privileges -U dbuser2 -d new_dbname -L <(pg_restore -l bkpfile.dump | grep -v 'COMMENT - DATABASE') bkpfile.dump
方案二:使用高版本pg_dump工具
PostgreSQL的pg_dump工具向后兼容低版本数据库实例,可安装PostgreSQL 10及以上版本的客户端工具,使用新增的--no-comments参数导出,自动排除所有COMMENT语句:
pg_dump --no-owner --clean --blobs --no-privileges --no-comments -U dbuser old_dbname -f bkpfile.sql
如果需要保留表、字段等非数据库级的COMMENT,建议优先使用方案一。
应急方案
如果只能使用9.6版本pg_dump且必须导出sql格式,可使用严格匹配行首的规则过滤,尽可能降低误判风险:
grep -v '^COMMENT ON DATABASE' bkpfile.sql > clean_bkp.sql
该方案仍存在极低概率误删业务数据中匹配内容的可能,仅作临时应急使用。
内容的提问来源于stack exchange,提问作者gusto2
相关产品推荐
相关产品推荐

