尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PostgreSQL 使用 pg_dump 导出重建数据表的完整 DDL:`-t` 与 `--schema-only` 实战指南

PostgreSQL 使用 pg_dump 导出重建数据表的完整 DDL:`-t` 与 `--schema-only` 实战指南 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本文介绍如何借助 PostgreSQL 自带的pg_dump命令行工具仅导出某个表及其序列、约束、索引的完整结构定义DDL到 SQL 文件从而在无需迁移任何数据的前提下随时重建该表。读完本文你将掌握-t表筛选与--schema-only纯结构导出两个核心参数的组合用法并能将产物直接交给pg_restore或手工执行以还原表结构同时了解其与全库导出、自定义格式备份等相邻场景的关系。一、场景与思路只要骨架不要血肉日常开发中我们经常需要把一张表的结构带到另一个环境从生产库复制一张表的定义到本地调试、为迁移脚本生成建表语句、或者在升级前把关键表的结构留存备档。直接create table手工重写既不现实也容易遗漏索引与约束。pg_dump的-t和--schema-only组合正是为这种仅复制结构的需求而生它只产出create table、create sequence、create index等 DDL 命令完全跳过insert/copy等数据语句从本源上避免了create table as这类方案只复制列和数据类型、丢掉约束与索引的缺陷。二、核心参数-t与--schema-only围绕本场景需要掌握两个主要参数参数作用说明-t/--table指定要导出的表可多次使用也支持通配模式详见下文多表导出--schema-only等价-s只导出结构、排除数据输出的 SQL 中不含任何行数据--schema-only排除数据的关键开关pg_dump默认会连同数据一起导出SQL 格式下数据以copy语句呈现。加上--schema-only后dump 产物中只包含创建对象所需的 DDL不包含任何insert或copy数据行这正是重建表结构场景的前提。-t精确锁定目标表-t后面可以跟表名可带 schema 前缀也可以使用类似 psql 的通配模式。需要说明的是-t的匹配规则遵循 PostgreSQL 的 psql pattern 语法*匹配任意字符序列?匹配单个字符|表示或。因此-t users会精确锁定名为users的表而模式写法则需要更谨慎地评估会包含什么、不会包含什么。三、核心命令导出单张表的完整结构$ pg_dump -t users --schema-only my_database users.schema.sql运行上述命令即可生成users.schema.sql文件。除标准的 shell 重定向写法外也可以直接使用pg_dump自带的-f参数指定输出文件$ pg_dump -t users --schema-only -f users.schema.sql my_database两种写法等价按习惯任选其一。生成的users.schema.sql中包含一系列 SQL 命令它们会完成以下全部工作建表创建users表及其所有列包括列的默认值、not null约束等属性序列为serial自增主键列创建并关联对应的序列create sequencesetval相关设置确保序列与表中已有的最大 ID 对齐外键添加该表定义中涉及的外键约束索引创建表上的全部索引。也就是说这份文件完整还原了表的结构 DNA不丢默认值、不丢约束、不丢索引这正是它与create table dupe_table as table users with no data之类轻量复制方案的本质区别。序列为何会单独出现在 PostgreSQL 中serial/bigserial并非真正的数据类型而是语法糖系统会隐式创建一个序列对象并把列默认值设为nextval(...)。因此表结构的重建必然涉及序列对象的创建与绑定pg_dump --schema-only会妥善处理这一依赖链。值得一提的是PostgreSQL 社区已建议新应用改用generated always as identity的标识列而非serial相关讨论可参考本仓库的 generate-modern-primary-key-columns.md。四、重建这张表两种还原方式拿到users.schema.sql之后重建该表有两条路可走方式一交给pg_restore由于--schema-only产出的 SQL 中不含数据可以放心地把它当作还原脚本$ pg_restore -d my_new_database users.schema.sql方式二直接手工执行因为文件本身就是纯 SQL 文本也可以直接交给psql执行或打开文件在交互式会话中分步运行$ psql -d my_new_database -f users.schema.sql两种方式对同一份文件皆适用这也是 SQL 格式 dump 相比自定义二进制格式更方便的一点——文件可读、可审计、可挑选执行。五、与相邻场景的关联与辨析多表导出-t的重复使用与模式写法-t可以多次出现把多张表一次性导出$ pg_dump -t users -t users_roles -t roles --schema-only my_database roles.schema.sql也可以改用模式匹配一次性覆盖一组表$ pg_dump -t users*|roles --schema-only my_database roles.schema.sql模式写法的好处是简洁代价是需要你清楚知道匹配规则会命中哪些对象适合数据模型边界清晰、命名规律的场景。相关细节可参见本仓库的 include-multiple-tables-in-a-pg-dump.md。全库与全集群导出需要整库含数据备份时用pg_dump配合-Fc自定义格式生成压缩的二进制 dump再用pg_restore还原具体流程见 dump-and-restore-a-database.md需要把整个实例下所有数据库连同角色等全局对象一起导出时用pg_dumpall配合--exclude-database排除模板库详见 dump-all-databases-to-a-sql-file.md。表级复制结构的其他方案若不依赖pg_dump还可以用create table ... (like ...)配合including defaults / including indexes / including constraints选项在库内复制表结构参见 create-a-table-from-the-structure-of-another.md。与pg_dump方案相比它适用于库内复制而非跨环境导出。六、注意事项对象归属与角色依赖dump 出的表结构可能依赖某个数据库角色。在目标环境还原前需确认该角色已存在必要时用createuser创建否则还原会因角色缺失而失败。目标库需存在直接执行还原脚本前先确认目标数据库已创建可用createdb my_new_database完成。权限与版本pg_dump随 PostgreSQL 一同安装须使用与目标集群版本匹配或兼容的客户端版本部分较新的参数与输出格式细节以当前 PostgreSQL 官方pg_dump文档为准。-t不导出依赖它的外部对象-t只包含所指定表的定义与该表存在引用关系的其他表如被引用的父表、扩展类型不会被一并导出跨库重建时需自行补充前置对象。七、扩展阅读除本文覆盖的两个参数外pg_dump还提供了大量参数用于精细控制导出范围例如-n按 schema 导出、--exclude-table排除表、--clean还原前先 drop 已存在对象等完整的参数清单可查阅 PostgreSQL 官方文档的pg_dump页面。本仓库的 postgres/ 目录还收录了 dump 与 restore、全库导出、结构复制、序列与标识列等大量相邻主题的实战笔记可作为系统掌握 PostgreSQL 备份与结构管理的持续参考。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐TIL项目使用pg_dump导出PostgreSQL表结构DDL语句TIL项目使用pg_dump导出PostgreSQL表结构DDL语句 前言 在数据库开发和维护过程中我们经常需要获取表结构的定义语句DDL。Postgr文档教程知识库用 pg_dump 一次导出多张表-t 参数的多种玩法TIL 实战笔记用 pg_dump 一次导出多张表 t 参数的多种玩法TIL 实战笔记 PostgreSQL 自带的 pg_dump 是数据库备份与迁移的主力工具而它的文档教程知识库PostgreSQL数据导入导出终极指南pg_dump、pg_restore与CSV处理技巧PostgreSQL数据导入导出终极指南pg_dump、pg_restore与CSV处理技巧 PostgreSQL作为最受欢迎的开源关系型数据库其强大的数据文档知识库数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表