据我从文档中了解,当段文件达到一定大小或由于archive_timeout
而存档时,将归档一个WAL段。
因此,如果数据库崩溃,来自当前活动的不完整WAL段的所有数据都将丢失(假设我们无法访问Postgres目录中的不完整段)。
我是否正确,如果正确,是否有办法避免这种数据丢失?
发布于 2019-08-16 12:12:11
你是对的。
避免这种情况的方法是使用pg_receivewal
,它将WAL信息从数据库服务器中流出来,并将其立即保存在WAL段中。
默认情况下,这是异步的,因此您可能会在崩溃时损失一些时间。您需要避免这种情况,您必须使用与pg_receivewal
同步的复制,但请注意
COMMIT
在收到pg_receivewal
的回复后才能成功。synchronous_commit = remote_apply
,因为pg_receivewal
从不应用更改,它只是将它们保存到WAL文件中。发布于 2019-08-16 12:05:21
PostgreSQL使用写前日志(WAL)作为事务日志记录的方法。WAL的核心概念是,对数据文件(表和索引所在的地方)的更改必须在这些更改被记录之后才写入,也就是说,当描述这些更改的日志记录被刷新到永久存储时。如果遵循此过程,则无需在每次事务提交时将数据页刷新到磁盘,因为我们知道,如果发生崩溃,我们将能够使用日志恢复数据库:未应用于数据页的任何更改都可以从日志记录中重新执行。(这是前滚恢复,也称为重做。)这是从下面的链接:
https://wiki.postgresql.org/wiki/PostgreSQL_为_甲骨文_DBA
但是,从内存到磁盘的任何内容都将在重做+数据库中启动,只会保证提交的事务。任何仅在内存中的东西都是不可提交和不可恢复的.确实存在一些HA机制,用于将事务保存在内存中,而不是PostgreSQL。
https://dba.stackexchange.com/questions/245513
复制相似问题