PostgreSQL 18 新增GUC file_copy_method = COPY/CLONE( 支持 COW ) , 在创建数据库或移动表空间时, 可以充分利用底层存储的能力, 例如ZFS可以使用cow技术, 快速实现文件拷贝(实际上是共享数据块, 未来发生写时再复制被修改的块).
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=f78ca6f3ebbbff8c675c34b8ee61047223073866
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.
这个补丁引入了一个新的配置项 file_copy_method,用于控制数据库文件复制的方式。
核心内容:
file_copy_method 设置: 允许用户选择文件复制的方式。COPY (默认值): 使用传统的读取-写入循环来复制文件内容。CLONE: 使用系统提供的克隆文件功能,例如 Linux/FreeBSD 上的 copy_file_range 和 macOS 上的 copyfile。copydir() 函数的调用者,目前主要是 CREATE DATABASE ... STRATEGY=FILE_COPY 和 ALTER DATABASE ... SET TABLESPACE = ... 这两个命令。CLONE 的优势: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 = ...: 将数据库的表空间移动到新的位置,通常也需要复制文件。CLONE 方式可以更好地利用 COW 文件系统的优势。copy_file_range (Linux, FreeBSD) 和 copyfile (macOS): 操作系统提供的系统调用,用于高效地复制文件,通常比传统的读取-写入循环更快。总而言之,这是一个性能优化补丁,通过利用操作系统提供的文件克隆功能,可以显著提高数据库的创建和迁移速度,尤其是在处理大型数据库时。