ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TIL 实战:用 createdb -T 模板机制快速复制本地 PostgreSQL 数据库

TIL 实战:用 createdb -T 模板机制快速复制本地 PostgreSQL 数据库 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载PostgreSQL 提供了一条足以秒杀 dump/restore 的本地数据库复制路径createdb -T模板复制。本指南以 til 仓库中的 duplicate-a-local-database 笔记为骨架讲解如何在不导出、不导入任何数据文件的情况下通过模板机制瞬间克隆出包含完整 schema 与数据的全新数据库并深入其底层原理template0/template1、所有者指定技巧以及与pg_dump方案的取舍。读完你就能用一条命令完成本地库复制并知道何时该改用 dump/restore。一条命令完成本地数据库复制当源数据库就在本机、且没有跨服务器或跨版本迁移需求时完全不需要经历dump → 新建空库 → restore三步。PostgreSQL 自带的createdb命令内置了基于模板的复制能力$ createdb -O ownername -T originaldb newdb命令执行后PostgreSQL 会在当前集群内创建一个名为newdb的新数据库其 schema 与数据全部来自originaldb。整个操作在服务端完成数据无需经过客户端中转因此对大库也几乎只受磁盘 I/O 限制。参数含义拆解-T originaldb--template指定以哪个数据库作为模板。这是本命令的核心PostgreSQL 会完整复制该库的 schema 和数据到新库。-O ownername--owner指定新数据库的所有者owner不传则默认使用执行命令的操作系统用户。newdb要创建的新数据库名称位置参数。原理一切数据库都诞生自模板这条命令之所以成立是因为 PostgreSQL 的CREATE DATABASE本质上就是从模板克隆。正如 til 仓库中的 create-database-uses-template1 笔记所记录的每次create database除非显式指定PostgreSQL 默认都会克隆template1。每个 PostgreSQL 集群启动时都自带两个模板库可通过以下查询验证select datname from pg_database where datistemplate true; datname ----------- template1 template0 (2 rows)template1默认模板createdb newdb不指定-T时实际上克隆的就是它。可以对它执行\c template1连接并修改——比如把某个扩展、函数或公共 schema 放进去之后创建的每一个新库都会自动继承。template0template1的原始备份副本无法连接、无法修改专用于在 template1 被改坏时作为恢复兜底。所以createdb -T originaldb newdb只是把默认的template1换成了你自己的库克隆逻辑完全一致区别只在于模板来源。当你不希望新库继承 template1 中的自定义内容时也可以显式用-T template0创建干净的库。-O把新库交给正确的所有者-O直接对应 SQL 语法中的CREATE DATABASE ... OWNER ...。在本地开发场景新库的所有者通常应设为当前 Unix 用户这样你现有的本地角色才能顺畅读写新库如果复制出来的库所有者是他人角色本地连接时很可能遇到权限不足的问题。如果需要先确认目标角色是否存在比如自动化脚本里先查后建til 仓库的 check-if-user-role-exists-for-database 笔记给出了可脚本化的写法psql postgres -tXAc SELECT 1 FROM pg_roles WHERE rolnamedev \ | grep -q 1 \ || createuser --interactive devcreatedb与createuser同属 PostgreSQL 客户端工具族配合使用即可在复制数据库前把角色体系准备妥当。模板复制 vs. pg_dump如何选模板复制并非万能它与 dump-and-restore-a-database 笔记中的pg_dump/pg_restore方案各有适用场景维度createdb -T模板复制pg_dump -Fcpg_restore适用场景源库与目标库同机、同集群跨服务器、跨版本、需归档备份数据通道服务端文件系统级拷贝不经客户端数据序列化到 dump 文件再反序列化额外产物无产生.dump文件典型命令createdb -O owner -T src dstpg_dump -Fc my_db my_db.dump后createdb my_new_db pg_restore -d my_new_db my_db.dump角色依赖源库内角色信息随模板保留restore 时需保证依赖角色已存在于目标集群需要重点指出的是pg_dump的 dump 文件本身不包含角色定义恢复时若目标集群缺少相应角色会失败需要先用createuser补齐而模板复制发生在同一集群内角色体系天然一致无需额外处理。另外当源库正被活跃连接占用时PostgreSQL 会拒绝以它作为模板创建新库模板克隆要求源库处于空闲一致状态。因此复制前请确保源库没有进行中的写入会话若确需拷贝正在使用的库则应退回到pg_dump方案它通过一致性快照读取数据不受活动连接影响。复制结果的独立性与其他实操提示复制出的新库完全独立newdb与originaldb只是长相一致的两个库后续对任一方的修改互不影响模板关系仅存在于创建瞬间不会形成持续同步。复制不带走连接级设置当前会话的临时配置如search_path的会话级修改不会进入新库新库继承的是源库中持久化的对象定义与数据。查看复制结果用psql的\l元命令即可列出所有数据库及其大小验证newdb是否如期出现也可参考 check-the-size-of-databases-in-a-cluster 笔记中的 SQL 查询来核对体积。集群整体迁移仍需 pg_dumpall如果目标是重装 PostgreSQL、整体搬迁整个集群含角色、权限模板复制无法胜任应改用 dump-all-databases-to-a-sql-file 笔记中的pg_dumpall并通过--exclude-databasetemplate*排除随安装自带的模板库。小结createdb -O ownername -T originaldb newdb是本地 PostgreSQL 开发中最高效的复制库手段它借力模板克隆机制在服务端一步完成 schema 与数据的全量复制省去了 dump/restore 的序列化开销与中间文件。理解 template0/template1 的分工、正确设置-O所有者、并清楚它与pg_dump的边界就能在任何想要一个一模一样的新库的场景下做出正确选择——同机克隆用-T跨机迁移用 dump/restore。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐TIL 实战用 pg_database_size() 获取 PostgreSQL 数据库磁盘占用TIL 实战用 pg_database_size 获取 PostgreSQL 数据库磁盘占用 在 PostgreSQL 日常运维中快速获知某个数据库到底占用文档教程知识库PostgreSQL 模板数据库机制CREATE DATABASE 为何默认克隆 template1PostgreSQL 模板数据库机制CREATE DATABASE 为何默认克隆 template1 导读 在 PostgreSQL 中执行 CREATE D文档教程知识库终极PostgreSQL数据复制实战pg_replicate完全指南终极PostgreSQL数据复制实战pg_replicate完全指南 pg_replicate是一个基于Rust构建的PostgreSQL数据复制工具它利用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表