PostgreSQL传统上使用shell命令来实现持续WAL存档,这是必不可少的备用复制备份和稳定。在过去,我们的博客低效率的设计以及一些备份工具如PgBackRest解决这个问题。PostgreSQL的社区,它是一个著名的问题,很多过去发生的讨论一样。
也不幸的PostgreSQL文档给出了一个不安全的命令字符串,雇佣的组合测试和cp命令为例:
|
1
|
archive_command
=
“测试!f - f / mnt /服务器/ archivedir / % & & cp % p / mnt /服务器/ archivedir / % f '
|
尽管文档提到它作为一个例子来解释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之后得到配置重载::
|
1
2
3
4
5
6
|
postgres
=
#改变系统设置archive_library = <图书馆>”;
postgres
=
#选择pg_reload_conf ();
pg_reload_conf
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
t
(
1
行
)
|
一定要留意PostgreSQL日志因为任何问题将不会显示在psql会话,但它会出现在PostgreSQL日志:
|
1
2
3
|
2022年
- - - - - -
11
- - - - - -
24
05年
:
07年
:
27.618
UTC
(
788年
]
日志
:
收到了
SIGHUP
,
重新加载
配置
文件
2022年
- - - - - -
11
- - - - - -
24
05年
:
07年
:
27.619
UTC
(
788年
]
日志
:
参数
“archive_library”
改变了
来
“壳”
2022年
- - - - - -
11
- - - - - -
24
05年
:
07年
:
27.620
UTC
(
1274年
]
致命的
:
可以
不
访问
文件
“壳”
:
没有
这样的
文件
或
目录
|
我们可以把图书馆规范如果我们想使用shell命令在PostgreSQL 14岁或以上。
|
1
2
3
|
改变
系统
集
archive_library
=
”
;
或
改变
系统
重置
存档
_图书馆
;
|
并确保没有archive_library规范有效。
|
1
2
3
4
5
|
postgres
=
#显示archive_library;
archive_library
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
(
1
行
)
|
在这个阶段,PostgreSQL将使用普通archive_command对WAL存档。你可以指定相同的。
|
1
|
改变
系统
集
archive_command
=
“< shell命令>”
;
|
因此,总的说来,archive_command会被认为只有在吗archive_library规范是空的。
basic_archive:样品归档库
PostgreSQL 15提供了一个简单的示例归档库参考体系结构,它是普通发布版的一部分模块。如果contrib模块已经存在,我们可以指定archive_library:
|
1
|
postgres
=
#改变系统设置archive_library =“basic_archive”;
|
但是这个库需要进一步输入对归档文件的位置。可以指定使用的特定于模块的参数basic_archive.archive_directory。
否则,我们可以开始看到消息在PostgreSQL日志如下:
|
1
|
警告
:
archive_mode
启用
,
然而,
存档
是
不
配置
|
你可以参考官方文档也。
然而,这个存档库将被加载的文档的过程,而不是常规会话的后台进程。所以任何试图设置参数或看到可以给你错误的参数。
|
1
2
3
4
5
|
postgres
=
#改变系统设置basic_archive.archive_directory =“/ home / postgres / arch2”;
错误
:
未被认可的
配置
参数
“basic_archive.archive_directory”
postgres
=
#显示basic_archive.archive_directory;
错误
:
未被认可的
配置
参数
“basic_archive.archive_directory”
|
但是日常会话可以加载库,如果他们想要的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
|
postgres
=
#负载“basic_archive”;
负载
postgres
=
#改变系统设置basic_archive.archive_directory =“/ home / postgres / arch2”;
改变
系统
postgres
=
#显示basic_archive.archive_directory;
basic_archive
.archive_directory
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
(
1
行
)
postgres
=
#选择pg_reload_conf ();
pg_reload_conf
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
t
(
1
行
)
postgres
=
#显示basic_archive.archive_directory;
basic_archive
.archive_directory
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
/
家
/
postgres
/
arch2
(
1
行
)
postgres
=
#
|
这是两个重要的观察结果:
1)加载库到特定的会话,而是一个像shared_preload_libraries可能使用其他方法,但并不是明智的
2)的特定于模块的设置可能不会出现在pg_settings除非在会话模块加载。
如果有多个归档库可用,我们可以从一个库切换到另一个系统时的生活。但是文档过程将重新启动在幕后,和指定的新图书馆将由新文档加载过程。消息可能出现在PostgreSQL日志:
|
1
|
日志
:
重新启动
存储服务器
过程
因为
价值
的
“archive_library”
是
改变了
|
如果尝试归档的细胞膜basic_arhive失败,会有相应的错误在PostgreSQL日志条目。
|
1
2
|
2022年
- - - - - -
11
- - - - - -
24
11
:
24
:
31.330
UTC
(
2323年
]
错误
:
可以
不
创建
文件
“/ home / postgres / arch2 / archtemp.00000001000000000000007B.2323.1669289071330”
:
没有
这样的
文件
或
目录
2022年
- - - - - -
11
- - - - - -
24
11
:
24
:
31.330
UTC
(
2323年
]
警告
:
存档
写
- - - - - -
之前
日志
文件
“00000001000000000000007 b”
失败的
太
许多
次
,
将
试一试
再一次
晚些时候
|
人仔细观察上面的错误消息可能想知道这文件:archtemp.00000001000000000000007B.2323.1669289071330,提到的错误消息,。这个名字看起来并不定期WAL段文件。出现这种情况,是因为basic_archive模块首先创建一个临时文件的目的地有了这样的一个名字,然后fsync文件,然后将文件到最终的名字。这是确保更好的保护在崩溃。
当文档被终止的信号(除了SIGTERM,用作服务器关闭的一部分)或者一个错误的shell退出状态大于125(如命令未找到),文档过程中止和邮政局长就重启。在这种情况下,失败将被记录pg- - - - - -统计- - - - - -存储服务器视图。错误归档库执行也可以监控使用raybet雷竞技竞猜在线官网pg- - - - - -统计- - - - - -存储服务器。
|
1
2
3
4
5
6
7
8
9
|
postgres
=
#从pg_stat_archiver select *;
- - - - - -
(
记录
1
]
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
存档
_数
|
160年
last_archived
_细胞膜
|
0000000100000000000000 a1
last_archived_time
|
2022年
- - - - - -
11
- - - - - -
24
14
:
58
:
43.33668
+
00
失败的
_数
|
680年
last_failed
_细胞膜
|
000000010000000000000087
last_failed
_时间
|
2022年
- - - - - -
11
- - - - - -
24
14
:
49
:
51.716773
+
00
统计数据
_重置
|
2022年
- - - - - -
11
- - - - - -
15
08年
:
58
:
34.939925
+
00
|
利用basic_archive
basic_archive模块是几乎一样的shell命令:
|
1
|
“测试!f - f / mnt /服务器/ archivedir / % & & cp % p / mnt /服务器/ archivedir / % f '
|
但在一个更好的方式。我们已经讨论过的一个优点:
它创建一个临时文件,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和进步。





