网易首页 > 网易号 > 正文 申请入驻

Git for Data: 瞬间克隆PG数据库/实例

0
分享至

每个程序员都用过git clone。敲下回车,几秒钟后,一个完整的代码仓库就躺在硬盘上了。

但数据库呢?

想给测试环境搞一份生产数据的副本?传统方案是pg_dump+pg_restore。一个 100GB 的库,喝杯咖啡回来可能还没完。想做并行测试?再等一轮。想给 AI Agent 一个可以随便折腾的沙盒?那得准备好足够的磁盘和耐心。

最近一堆数据库公司都在卷 "Git for Data",理由是:有了数据版本控制,Agent 就可以放心在数据库里乱搞,坏了随时回滚。

但这玩意,PostgreSQL 其实早就有了。

只不过PostgreSQL 18 把它提升到了一个新阶段一个 100GB 的数据库,克隆时间从"分钟级"变成了200 毫秒。不是快了一点,是快了几百倍。更神奇的是,克隆完的数据库不占用额外存储空间。1TB、10TB 的库?一样是 200 毫秒,一样零额外开销。

这不是魔法,是写时复制(Copy-on-Write)技术终于被 PostgreSQL 原生支持了。 今天我们就来聊聊这个特性,以及它对整个"数据版本控制"生态意味着什么。

写时复制:为什么能这么快?

PostgreSQL 18 新增了一个参数file_copy_method,可选值为copy(传统字节拷贝)和clone(基于 reflink 的瞬间克隆)。

设置file_copy_method = clone后执行:

CREATE DATABASE db_clone TEMPLATE db STRATEGY FILE_COPY;

PostgreSQL 会调用操作系统的reflink接口。Linux 上是FICLONEioctl,macOS 上是copyfile()

关键来了:文件系统不会真的复制数据

它只是创建一组新的元数据指针,指向相同的物理磁盘块。就像你在文件管理器里创建了一个"快捷方式",但这个快捷方式可以独立修改。

没有数据移动,只有元数据操作。所以无论数据库是 1GB 还是 1TB,克隆时间都是常数级的 —— 在现代 NVMe SSD 上,老冯测试 120GB 的库复制大约 200 毫秒。797G 的数据复制大概 569 毫秒左右。

写时复制:为什么不占空间?

克隆后,源库和新库共享所有物理存储。当任意一方修改某个数据页时,文件系统才会把这个页复制出来单独存储:

这意味着:存储开销 = 实际变更量,而不是完整副本。

你可以同时跑 10 个克隆库做并行测试,只要它们不大量写入,存储几乎不增长。对测试环境来说,这是巨大的福音。

不过,不是所有文件系统都支持 reflink。好消息是,大多数现代 Linux 发行版已经默认启用:


如果你用的是 EL 8/9/10、Debian 11/12/13、Ubuntu 20.04/22.04/24.04 等主流发行版,默认的 XFS 都已经支持并启用 reflink。

还在用 CentOS 7.9 和 ext4?那确实就没办法了,早点升级吧。

关键限制:模板库不能有连接

这个功能虽然好,有一个绕不开的限制:克隆时,模板数据库不能有任何活动连接。 原因很直接:PostgreSQL 需要确保克隆时数据处于一致状态。如果有连接在跑,可能产生写入,数据就不一致了。

这个限制其实一直都有。以前它很致命 —— 你不可能让生产库停机几分钟等复制完成。但现在克隆只要亚秒级常数时间,这个限制的杀伤力大大降低了。 百毫秒级别的闪断,对于很多场景是可以接受的,特别是那些 AI Agent 使用的库——它们没那么娇气。这就带来了许多新鲜的可能性。

实操的话,要想实际把这个数据库克隆出来,你需要先终止所有连接,在两条紧挨着 SQL 语句里执行:

psql <-EOF
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'prod';
CREATE DATABASE dev TEMPLATE prod STRATEGY FILE_COPY;
EOF

请注意,这俩语句不能分开执行,但不能放在同一个事务里执行(CREATE DATABASE不能在事务块内运行)。 所以你需要用 psql stdin 的方式来执行,用psql -c会自动包事务,反而会失败。

Pigsty 中的优化

在 Pigsty 4.0 中,添加了对 PG18 这种克隆机制的支持:

比如,你已经有了一个meta数据库,现在想创建一个meta_dev的克隆库用于测试, 只需要在pg_databases里添加一条记录,指定templatestrategy: FILE_COPY即可。 然后执行:bin/pgsql-db pg-meta meta_dev,Pigsty 会帮你自动处理好所有细节。


当然其实这里的细节还是不少的,比如,你要确保file_copy_method被正确设置为clone才有这个特性,这个 Pigsty 创建的集群全都已经针对 PG18+ 都配置好了。 如果你要克隆的数据库就是管理数据库postgres本身怎么办 (克隆的时候不允许连接)。再比如,克隆数据库之前要先终止所有连接,这些都帮你自动搞定了。

还有没有其他手段?

当然,即使是 200ms 的不可用时间,有时候对于比较严格的生产环境依然是不可接受的。 而且如果你的 PG 版本不是最新的 18,也没法用这个特性。

Pigsty 提供了两种更强大的克隆方式,场景稍微不太一样:

实例级克隆:pg-fork

实例级别的克隆思路和 PG18 的 CoW 类似,都需要你的文件系统支持 reflink(XFS/Btrfs/ZFS)。 之前生产环境的文件系统老冯一直都强烈推荐用 xfs,现在也是很多地方都默认,这个要求并不难满足。

用了 xfs 之后,你可以使用cp --reflink=auto来克隆整个 PGDATA 目录,从而克隆一个完全独立的 PostgreSQL 实例。 这个过程也是瞬间完成的,和数据库大小无关,而且克隆出来的不占用实际存储,除非你开始往里面写数据,才会触发 CoW。

postgres@vonng-aimax:/pg$ du -sh data
797G data
postgres@vonng-aimax:/pg$ time cp -r data data2

real 0m0.586s
user 0m0.014s
sys 0m0.569s

当然,实际上细节要比这个复杂,你如果直接这么复制,大概率得到的是一个数据状态不一致的脏实例,启动不了。 所以还要配合 PostgreSQL 的原子备份 API 来确保数据一致性 —— 核心就是这一行:

psql <CHECKPOINT;
SELECT pg_backup_start('pgfork', true);
\! rm -rf /pg/data2 && cp -r --reflink=auto /pg/data /pg/data2
SELECT * FROM pg_backup_stop(false);
EOF

当然实际上各种边界情况要复杂一些,比如克隆出来的实例如果你要拉起来,不能挤占原来实例的端口, 不能写脏原来生产实例的日志/WAL归档,诸如此类细节。所以 Pigsty v4 就提供了一个傻瓜式的克隆脚本pg-fork来解决这个问题。

pg-fork 1 # 克隆一个 1 号实例,/pg/data1 ,监听 15432 端口

实例级别克隆的好处是,克隆出来的是一个完全独立的 PostgreSQL 实例,同样不占用额外存储空间,同样是瞬间完成的。 但是它不需要你关闭原始模板数据库的连接,所以不会影响生产环境的可用性。 最多就是拉起来的时候吃掉点内存,但这种时候你就发现 PG 的双缓冲其实也有好处了。 默认配置 25% 的 Sharedbuffer,你可以很轻松的再拉起一两个实例。


更妙的是,这种克隆出来的实例,还可以通过pg-pitr脚本,利用基于 pgBackRest 的备份,做时间点恢复(PITR)。 而且这个时间点恢复也是增量进行的,所以速度也很快。

这种机制最直接的应用场景就是,误删数据了,但是删的又不多,不至于全库回档。 那么这种情况下,就可以使用pg-fork脚本,瞬间克隆出一个和生产库一模一样的副本, 然后原地 pg-pitr 增量回滚到几分钟前,拉起来,把误删的数据查出来再写回去。

集群级别的克隆

当然,还有一种集群层面的克隆,利用的技术也是类似的,通过使用一个集中式的备份仓库,你可以从任意一个集群的备份中恢复到备份保留期限内的任意时间点。


这种方式的集群克隆不用消耗原本生产集群的任何资源,云上的各种 “PITR” 其实就是这种方式,给你拉起一套新的集群,恢复到指定时间点。但是这种方式的速度就慢多了,毕竟要把数据从备份仓库里拉出来,恢复到新的集群上,时间和数据量成正比。


这种方式是最传统的 PITR ,因为没有那种 “瞬间克隆” 的效果,就不展开介绍了。

应用场景

三种克隆方式,各有适用场景,也很好理解,连接串五要素里面,去掉用户名和密码, 有三个要素可以修改:

修改数据库名,就是 Database 克隆

修改端口号,就是实例级克隆

修改主机IP,就是集群级克隆


虽然已经有了pg-fork这种实例级的 “瞬间克隆” 技术,而且没有数据库模版克隆要求几百毫秒停机时间的限制。 但这种操作要求你必须拥有数据库服务器的文件系统访问权限。而且你克隆出来的实例也仅限于在同一台机器上运行 —— 从库上是没有的。

数据库克隆有一个独特的优点,就是这个操作是 “完全在数据库客户端连接” 内完成的,也就是可以通过纯 SQL 来完成,不需要服务器访问权限。 这就意味着,你可以在任何能连接到数据库的地方,执行这个克隆操作,唯一的代价就是 200ms 左右的断连时间。

这就打开了一扇新的大门:

AI Agent 场景:给 Agent 只开一个数据库连接的权限,每次需要"乱搞"的时候,让它自己克隆一个沙盒出来。搞烂了就 DROP,没有任何代价。10 个 Agent 并行跑,存储开销几乎为零。

CI/CD 场景:以前数据库发布胆战心惊。现在用极低成本克隆出一堆测试库跑集成测试,DDL 迁移在真实数据上验证完再上生产,心里有底多了。

开发环境:每个开发者一个完整的数据库副本,数据和生产一模一样,存储成本趋近于零。改坏了?重新克隆一个,200 毫秒的事。

"Git for Data" 这个概念被吹了好几年,各种创业公司融了不少钱。但 PostgreSQL 用一个简单直接的方式给出了自己的答案:不需要额外的中间层,不需要复杂的架构,利用现代文件系统已有的能力,在数据库内核层面原生支持

几百毫秒,没有额外存储,一条 SQL 搞定。

有时候,最好的方案就是最简单的方案。

点一个关注 ⭐️,精彩不迷路

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
每吃一次,大脑萎缩就快一步?劝告:6种食物或是老年痴呆“催化剂”

每吃一次,大脑萎缩就快一步?劝告:6种食物或是老年痴呆“催化剂”

今日养生之道
2026-01-11 11:29:46
太猛了!合川女孩杀猪请人帮忙,直接坐了30桌,道路封闭文旅控场

太猛了!合川女孩杀猪请人帮忙,直接坐了30桌,道路封闭文旅控场

鋭娱之乐
2026-01-12 08:21:44
气坏了!澳大利亚球迷:我们甚至输给中国男足,这是最残酷的现实

气坏了!澳大利亚球迷:我们甚至输给中国男足,这是最残酷的现实

国足风云
2026-01-12 08:44:34
俄方爆料!“美军一开始就没打算让任何人活下来”

俄方爆料!“美军一开始就没打算让任何人活下来”

浙江之声
2026-01-11 18:23:51
给孩子发压岁钱,记得:2数不发,3人不给,4事不做,开心过年,这可不是迷信

给孩子发压岁钱,记得:2数不发,3人不给,4事不做,开心过年,这可不是迷信

美食格物
2026-01-11 16:24:12
特斯拉中国又推出新优惠方案,这也太夸张了!

特斯拉中国又推出新优惠方案,这也太夸张了!

XCiOS俱乐部
2026-01-11 11:19:46
输球又输人!皇马决赛最惨之人:阿隆索亲手将他打入冷宫

输球又输人!皇马决赛最惨之人:阿隆索亲手将他打入冷宫

澜归序
2026-01-12 05:35:15
马斯克抛出2026年九大“疯狂”预言:科技狂飙下的未来图景

马斯克抛出2026年九大“疯狂”预言:科技狂飙下的未来图景

娱乐督察中
2026-01-11 13:48:02
一个怪现象:父爱亏欠的女儿,长大后总在垃圾堆里找糖;父爱缺席的儿子,学不会责任和担当

一个怪现象:父爱亏欠的女儿,长大后总在垃圾堆里找糖;父爱缺席的儿子,学不会责任和担当

二胎妈妈圈
2026-01-11 21:49:04
吴谨言越来越有女人味了,黑色丝袜搭配金色连衣裙尽显靓姐风采!

吴谨言越来越有女人味了,黑色丝袜搭配金色连衣裙尽显靓姐风采!

说不尽的人心
2026-01-12 10:42:08
北京“两会”时间确定

北京“两会”时间确定

新京报北京知道
2026-01-12 10:29:54
满屏荷尔蒙!网飞这一脱,又爆了

满屏荷尔蒙!网飞这一脱,又爆了

来看美剧
2026-01-11 19:15:03
字母31+8+11难救主,小哈达威替补5记三分,超级残阵掘金力克雄鹿

字母31+8+11难救主,小哈达威替补5记三分,超级残阵掘金力克雄鹿

钉钉陌上花开
2026-01-12 11:30:15
中美日26年GDP预测出炉:美31万亿,日跌破4.5万亿,中国令人意外

中美日26年GDP预测出炉:美31万亿,日跌破4.5万亿,中国令人意外

史智文道
2026-01-11 19:41:47
老乡也垫?戈贝尔垫脚文班被吹罚一级恶意犯规+技术犯规

老乡也垫?戈贝尔垫脚文班被吹罚一级恶意犯规+技术犯规

懂球帝
2026-01-12 10:58:31
领导突然问你“要不要考虑去别的岗位”,千万不要说“我考虑下”,高情商这么回,反客为主!

领导突然问你“要不要考虑去别的岗位”,千万不要说“我考虑下”,高情商这么回,反客为主!

二胡的岁月如歌
2026-01-03 18:02:12
消失的150万契丹人找到了?DNA比对结果一出,原来就在我们身边

消失的150万契丹人找到了?DNA比对结果一出,原来就在我们身边

近史博览
2025-12-24 11:01:01
勇士即将获得小波特?或与国王篮网组三方交易:库明加离队倒计时

勇士即将获得小波特?或与国王篮网组三方交易:库明加离队倒计时

罗说NBA
2026-01-12 06:42:24
73.6个亿现金,直接打到了华为和中兴的账上,这绝对是下了血本了

73.6个亿现金,直接打到了华为和中兴的账上,这绝对是下了血本了

狸花小咪
2025-11-27 19:04:03
帅T网红爆染爱滋「背长满藤壶颗粒」! 友目睹恐怖画面:以为蚂蚁在爬

帅T网红爆染爱滋「背长满藤壶颗粒」! 友目睹恐怖画面:以为蚂蚁在爬

ETtoday星光云
2026-01-12 10:06:26
2026-01-12 11:39:00
老冯云数 incentive-icons
老冯云数
数据库老司机,云计算泥石流,PostgreSQL大法师
75文章数 28关注度
往期回顾 全部

科技要闻

小米二手车价大跳水:SU7半年跌5万元

头条要闻

媒体:美国"不演了" 特朗普直白表态震惊世界

头条要闻

媒体:美国"不演了" 特朗普直白表态震惊世界

体育要闻

聪明的球员,不是教练教出来的

娱乐要闻

闫学晶:脱离群众太久 忘了自己的根

财经要闻

揭秘“稳赚不赔”的代工项目骗局

汽车要闻

"家轿之王"变帅了 东风日产全新轩逸量产下线

态度原创

亲子
艺术
时尚
旅游
教育

亲子要闻

人财两空!广东宝妈梁海燕去世,因羊水栓塞导致,十天花费超50万

艺术要闻

画完这组画,他抑郁了,后来自杀了

普通人就该照搬这些穿搭!衣服不用买太贵,自然耐看又舒适

旅游要闻

属马、姓马游客免费!2026全国景区免票福利汇总第二波!

教育要闻

22分钟只能背十个单词,高二英语50分,如何提高背单词效率?

无障碍浏览 进入关怀版