首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL 18 preview - file_copy_method = COPY/CLONE( 支持 COW )

PostgreSQL 18 preview - file_copy_method = COPY/CLONE( 支持 COW )

作者头像
用户4035096
发布2026-07-09 18:11:15
发布2026-07-09 18:11:15
30
举报

PostgreSQL 18 preview - file_copy_method = COPY/CLONE( 支持 COW )

PostgreSQL 18 新增GUC file_copy_method = COPY/CLONE( 支持 COW ) , 在创建数据库或移动表空间时, 可以充分利用底层存储的能力, 例如ZFS可以使用cow技术, 快速实现文件拷贝(实际上是共享数据块, 未来发生写时再复制被修改的块).

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=f78ca6f3ebbbff8c675c34b8ee61047223073866

代码语言:javascript
复制
Introduce file_copy_method setting.  
author Thomas Munro <tmunro@postgresql.org>   
Tue, 8 Apr 2025 08:52:47 +0000 (20:52 +1200)  
committer Thomas Munro <tmunro@postgresql.org>   
Tue, 8 Apr 2025 09:35:38 +0000 (21:35 +1200)  
commit f78ca6f3ebbbff8c675c34b8ee61047223073866  
tree c3543200c7b119226fb6b1266db6dfd463b02267 tree  
parent 042a66291b04f473cbc72f95f07438abd75ae3a9 commit | diff  
Introduce file_copy_method setting.  

It can be set to either COPY (the default) or CLONE if the system  
supports it.  CLONE causes callers of copydir(), currently CREATE  
DATABASE ... STRATEGY=FILE_COPY and ALTER DATABASE ... SET TABLESPACE =  
..., to use copy_file_range (Linux, FreeBSD) or copyfile (macOS) to copy  
files instead of a read-write loop over the contents.  

CLONE gives the kernel the opportunity to share block ranges on  
copy-on-write file systems and push copying down to storage on others,  
depending on configuration.  On some systems CLONE can be used to clone
large databases quickly with CREATE DATABASE ... TEMPLATE=source
STRATEGY=FILE_COPY.  

Other operating systems could be supported; patches welcome.  

Co-authored-by: Nazir Bilal Yavuz <byavuz81@gmail.com>  
Reviewed-by: Robert Haas <robertmhaas@gmail.com>  
Reviewed-by: Ranier Vilela <ranier.vf@gmail.com>  
Discussion: https://postgr.es/m/CA%2BhUKGLM%2Bt%2BSwBU-cHeMUXJCOgBxSHLGZutV5zCwY4qrCcE02w%40mail.gmail.com  

file_copy_method (enum)

Specifies the method used to copy files. Possible values are COPY (default) and CLONE (if operating support is available).

This parameter affects:

CREATE DATABASE ... STRATEGY=FILE_COPY

ALTER DATABASE ... SET TABLESPACE ...

CLONE uses the copy_file_range() (Linux, FreeBSD) or copyfile (macOS) system calls, giving the kernel the opportunity to share disk blocks or push work down to lower layers on some file systems.

AI 解读

这个补丁引入了一个新的配置项 file_copy_method,用于控制数据库文件复制的方式。

核心内容:

  • 引入 file_copy_method 设置: 允许用户选择文件复制的方式。
  • 两种可选值:
    • COPY (默认值): 使用传统的读取-写入循环来复制文件内容。
    • CLONE: 使用系统提供的克隆文件功能,例如 Linux/FreeBSD 上的 copy_file_range 和 macOS 上的 copyfile
  • 影响范围: 这个设置会影响 copydir() 函数的调用者,目前主要是 CREATE DATABASE ... STRATEGY=FILE_COPYALTER DATABASE ... SET TABLESPACE = ... 这两个命令。
  • CLONE 的优势:
    • Copy-on-Write (COW) 文件系统优化: 允许内核在 COW 文件系统上共享块范围,避免实际的数据复制,从而提高效率。
    • 存储层面的优化: 在某些存储配置下,可以将复制操作下推到存储层,进一步提高性能。
    • 快速克隆大型数据库: 使用 CREATE DATABASE ... TEMPLATE=source STRATEGY=FILE_COPY 命令时,CLONE 方式可以显著加快大型数据库的克隆速度。
  • 扩展性: 鼓励开发者为其他操作系统添加对 CLONE 方式的支持。

总结:

这个补丁旨在通过引入 file_copy_method 设置,允许用户利用操作系统提供的文件克隆功能来优化数据库文件复制操作。 CLONE 方式在支持的操作系统和文件系统上,可以显著提高数据库的创建和迁移速度,尤其是在处理大型数据库时。 该补丁鼓励社区为更多操作系统添加支持,以进一步扩展其适用范围。

更详细的解释:

  • copydir() 函数: 这是一个内部函数,用于复制目录及其内容。
  • CREATE DATABASE ... STRATEGY=FILE_COPY 创建一个新的数据库,通过复制现有数据库的文件来实现。 STRATEGY=FILE_COPY 指定使用文件复制的方式。
  • ALTER DATABASE ... SET TABLESPACE = ... 将数据库的表空间移动到新的位置,通常也需要复制文件。
  • Copy-on-Write (COW): 一种优化技术,允许文件系统共享数据块,直到其中一个文件需要修改时才进行实际的复制。 CLONE 方式可以更好地利用 COW 文件系统的优势。
  • copy_file_range (Linux, FreeBSD) 和 copyfile (macOS): 操作系统提供的系统调用,用于高效地复制文件,通常比传统的读取-写入循环更快。

总而言之,这是一个性能优化补丁,通过利用操作系统提供的文件克隆功能,可以显著提高数据库的创建和迁移速度,尤其是在处理大型数据库时。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 digoal德哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PostgreSQL 18 preview - file_copy_method = COPY/CLONE( 支持 COW )
  • AI 解读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档