如何用pg_dump优雅导出全库架构及单表数据(避免重复内容)
优雅实现全数据库架构+单表数据的pg_dump导出
当然有更优雅的方式!你现在用两次命令拼接的问题在于,每次执行pg_dump都会生成一套完整的头部注释和全局配置语句,导致最终文件重复冗余。其实只需要一次pg_dump命令就能搞定,既保留全库架构,又只导出指定表的数据,还不会有重复内容。
最优方案:用排除+包含参数精准控制数据导出
针对你的需求,直接用pg_dump的--exclude-table-data和--include-table-data组合参数即可,完美适配PostgreSQL 9.6及以上版本(你的环境正好符合):
pg_dump mydatabase --exclude-table-data='*' --include-table-data='some_table' > db.sql
参数解释:
--exclude-table-data='*':告诉pg_dump排除所有表的数据,这样默认只会导出全库的架构(表结构、约束、索引、触发器等)--include-table-data='some_table':单独指定要导出some_table的数据,覆盖前面的排除规则
这样生成的db.sql只会有一份头部版本注释和全局SET配置,接着是完整的数据库架构,最后是some_table的插入数据,完全没有冗余重复内容。
扩展:导出多个指定表的数据
如果之后需要导出多个表的数据,只需要重复--include-table-data参数即可:
pg_dump mydatabase --exclude-table-data='*' --include-table-data='table1' --include-table-data='table2' > db.sql
备选方案:分section导出(适合复杂场景)
如果你的需求更复杂(比如需要单独调整架构或数据的导出选项),也可以分两次命令,但通过参数避免重复的头部配置:
# 第一步:导出全库架构(不含任何数据) pg_dump mydatabase --schema-only --section=pre-data --section=post-data > db.sql # 第二步:导出指定表的数据,关闭冗余头部内容 pg_dump mydatabase --data-only --table='some_table' --no-owner --no-privileges --no-comments >> db.sql
这里加上--no-owner、--no-privileges、--no-comments是为了确保第二次导出不会重复生成冗余内容,不过相比第一种一次命令的方案,还是稍显繁琐。
内容的提问来源于stack exchange,提问作者Newtang




