PostgreSQL 如何只导出表结构(schema)而不导数据?
pg_dump --schema-only 导出全部结构;-t 表名 限定指定表,-n 限定模式。反向用 --data-only 只导数据。本文给出常用组合与恢复注意事项。
核心命令: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 只读元数据应该很快;慢多半是锁等待(长事务占着表),换个低峰期。