PostgreSQL传统上使用shell命令来实现持续WAL存档,这是必不可少的备用复制备份和稳定。在过去,我们的博客低效率的设计以及一些备份工具如PgBackRest解决这个问题。PostgreSQL的社区,它是一个著名的问题,很多过去发生的讨论一样。

也不幸的PostgreSQL文档给出了一个不安全的命令字符串,雇佣的组合测试cp命令为例:

尽管文档提到它作为一个例子来解释archive_command执行shell脚本/命令,我们总是看到许多用户复制这种方法,落入陷阱,这个文档和跑到存档的问题。

好消息是,PostgreSQL 15想出了一系列的特性来解决问题与WAL存档。PostgreSQL现在可以做WAL存档使用可加载模块。请参考以下提交id实现细节:ef1eefd7 https://git.postgresql.org/gitweb/?p=postgresql.git; h = 5获取详细信息。使用存档模块/库的能力在这个地区是一项革命性的一步。

指定archive_library

可以执行指定archive_library当系统启动并运行。只发送一个信号SIGHUP之后得到配置重载::

一定要留意PostgreSQL日志因为任何问题将不会显示在psql会话,但它会出现在PostgreSQL日志:

我们可以把图书馆规范如果我们想使用shell命令在PostgreSQL 14岁或以上。

并确保没有archive_library规范有效。

在这个阶段,PostgreSQL将使用普通archive_command对WAL存档。你可以指定相同的。

因此,总的说来,archive_command会被认为只有在吗archive_library规范是空的。

basic_archive:样品归档库

PostgreSQL 15提供了一个简单的示例归档库参考体系结构,它是普通发布版的一部分模块。如果contrib模块已经存在,我们可以指定archive_library:

但是这个库需要进一步输入对归档文件的位置。可以指定使用的特定于模块的参数basic_archive.archive_directory

否则,我们可以开始看到消息在PostgreSQL日志如下:

你可以参考官方文档也。

然而,这个存档库将被加载的文档的过程,而不是常规会话的后台进程。所以任何试图设置参数或看到可以给你错误的参数。

但是日常会话可以加载库,如果他们想要的。

这是两个重要的观察结果:

1)加载库到特定的会话,而是一个像shared_preload_libraries可能使用其他方法,但并不是明智的

2)的特定于模块的设置可能不会出现在pg_settings除非在会话模块加载。

如果有多个归档库可用,我们可以从一个库切换到另一个系统时的生活。但是文档过程将重新启动在幕后,和指定的新图书馆将由新文档加载过程。消息可能出现在PostgreSQL日志:

如果尝试归档的细胞膜basic_arhive失败,会有相应的错误在PostgreSQL日志条目。

人仔细观察上面的错误消息可能想知道这文件:archtemp.00000001000000000000007B.2323.1669289071330,提到的错误消息,。这个名字看起来并不定期WAL段文件。出现这种情况,是因为basic_archive模块首先创建一个临时文件的目的地有了这样的一个名字,然后fsync文件,然后将文件到最终的名字。这是确保更好的保护在崩溃。

当文档被终止的信号(除了SIGTERM,用作服务器关闭的一部分)或者一个错误的shell退出状态大于125(如命令未找到),文档过程中止和邮政局长就重启。在这种情况下,失败将被记录pg- - - - - -统计- - - - - -存储服务器视图。错误归档库执行也可以监控使用raybet雷竞技竞猜在线官网pg- - - - - -统计- - - - - -存储服务器

利用basic_archive

basic_archive模块是几乎一样的shell命令:

但在一个更好的方式。我们已经讨论过的一个优点:

它创建一个临时文件,fsync和经久地搬到最后存档文件复制的目的地。这耐用性cp不能提供。这样可以大大减少的机会,一个破碎的文件归档的目的地会导致存档数据库失败,有时甚至可恢复性。

另一个重要功能的优势basic_archive是,它有一个内置的功能比较文件在源(pg_wal)和存档的目的地相同的文件存在。比较文件和验证的内容完全相同,并报告回文档“成功”,以便存储服务器进程可以继续下一个WAL段。这也减少了存档失败的机会。因为如果文件归档模块,但是服务器崩溃之前记录,PostgreSQL将尝试归档同样的细胞膜部分。新样品basic_archive模块默默地成功第二次尝试,如果文件复制和有相同的内容。

此外,basic_archive模块有一个自定义异常处理程序。这允许存储服务器把错误当作一个正常的失败,避免再次重新启动文档。

潜在的风险/使用归档库的问题

自归档模块加载到PostgreSQL,不像shell命令执行的archive_command,他们可以访问服务器资源。所以请注意,避免模块从未知的来源和渠道,不够可信赖的,因为他们拥有的风险。

模块的作者也必须记住,归档的回调都在其瞬时记忆上下文中运行。如果模块需要palloc ()需要坚持了一段时间,这样做将需要memorycontext不同。有人可能会参考基础开发人员文档和base_archive的来源源代码

示例模块:basic_archive可能会离开archtemp。*文件在归档目录如果有事故或由于其他奇怪的失败案例。如果这样的事情发生,用户可能需要再次开始前清洗PostgreSQL。

可以预计在未来什么

我们可以看到一个光明的未来与所有这些改进,作为默认archive_command可以成为另一个档案模块在未来版本的PostgreSQL。

我希望basic_archive或新模块将产生像压缩,因为更多的功能和配置选项压缩的PostgreSQL WAL档案正变得越来越重要

我希望PostgreSQL支持供应商开发更多强大的库和添加到PostgreSQL的生态系统。

数据库即服务(DBaaS)供应商将是最大的受益者之一,因为他们将有一个非常具体的地点和方法WAL存档,一个模块可以处理更有效的方式。

我希望备份工具和方法演变。现在备份工具可以留在恶魔模式,等待消息的PostgreSQL文档。walg_archive是在这个方向上一个例子。

我认为这是好的期待restore_libary也支持在未来PostgreSQL。

由于社区

特别感谢内森博萨尔特,在改善细胞膜的主要角色存档在PostgreSQL 15中,和其他像罗伯特·哈斯为积极参与从一开始到最后的提交。

感谢许多人都参与了讨论和评论,即朱利安Rouhaud,安德烈鲍罗廷罗伯特•哈斯斯蒂芬·弗罗斯特,马格努斯Hagander,大卫·斯蒂尔藤井正雄,迈克尔•Paquier Alvaro Herrera,汤姆·莱恩Benoit Lobreau,彼得•Eisentraut Bharath Rupireddy, Kyotaro Horiguchi,伊恩·劳伦斯•巴维克和许多其他人。

高兴看到PostgreSQL 15开始解决许多领域的低效率,从删除数据收集器在异步I / O和进步。

订阅
通知的
客人

0评论
内联反馈
查看所有评论