PostgreSQL 如何只导出表结构(schema)而不导数据?

pg_dump --schema-only 导出全部结构;-t 表名 限定指定表,-n 限定模式。反向用 --data-only 只导数据。本文给出常用组合与恢复注意事项。

最佳实践
PostgreSQL 如何只导出表结构(schema)而不导数据?封面

核心命令:pg_dump --schema-only 数据库名 > schema.sql 导出整个库的 DDL(建表、索引、约束、函数等);加 -t 表名 限定单表,-n 模式名 限定某个 schema。恢复用 psql 库名 -f schema.sql

常用组合

# 整库结构
pg_dump --schema-only mydb > schema.sql

# 指定表(可多个 -t,支持通配)
pg_dump --schema-only -t orders -t 'order_*' mydb > tables.sql

# 指定 schema(命名空间)
pg_dump --schema-only -n public mydb > public_schema.sql

# 只要数据(反过来)
pg_dump --data-only -t orders mydb > orders_data.sql

实用附加选项

pg_dump --schema-only \
  --no-owner \            # 不带 ALTER ... OWNER TO,换环境恢复不报错
  --no-privileges \       # 不带 GRANT/REVOKE
  --exclude-table=logs    # 排除某表
  mydb > schema.sql

跨环境恢复时 --no-owner --no-privileges 几乎是标配——目标库没有同名角色也能恢复。

恢复到新库

createdb mydb_copy
psql mydb_copy -f schema.sql

相关需求

  • 对比两个库结构差异:各导一份 schema-only 然后 diff
  • 纳入版本管理:schema.sql 进 git,结构变更可追溯
  • 导出单个函数/视图定义pg_get_functiondef()pg_views 查询更精准

观测云对照

结构变更要有感知。 表结构变更后应用报错类问题,可在观测云把错误日志时间与 DDL 变更时间对照;生产库的变更审计日志同样值得采集。

常见问题(FAQ)

Q:--schema-only 会导出序列(sequence)吗?
A:会导出序列定义,但当前值不带;数据恢复后序列值不对会导致主键冲突,用 SELECT setval('seq', (SELECT max(id) FROM 表)) 修正。

Q:能导出成 custom 格式再挑着恢复吗?
A:可以,pg_dump -Fc 生成自定义格式,pg_restore --schema-only 恢复结构,还能 -t 挑表。

Q:导出很慢?
A:schema-only 只读元数据应该很快;慢多半是锁等待(长事务占着表),换个低峰期。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台