我在设置PostgreSQL hot_standby时遇到了麻烦。在运行pg_basebackup后尝试启动数据库时,我在postgresql.log中收到FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 00000001000006440000008D has already been removed
。在IRC进行了简短的讨论之后,我开始明白错误可能源于我的写密集型数据库的wal_keep_segments
设置太低。
如果可能,我如何计算wal_keep_segments
的正确设置?此设置的可接受值是什么?
我正在与之合作:
答案 0 :(得分:3)
-------------------------------------------------
-- Start the INNER Cursor --
-------------------------------------------------
DECLARE @Complete int
DECLARE @isComplete Bit = 1
DECLARE INNERCur CURSOR FOR
SELECT Complete
FROM #AAEAPVS
OPEN INNERCur
FETCH NEXT FROM INNERCur INTO @Complete
WHILE @@FETCH_STATUS = 0
BEGIN
If @Complete = 0
BEGIN
@isComplete = 0
END
FETCH NEXT FROM INNERCur INTO @Complete
END
CLOSE InnerCurs
DEALLOCATE InnerCurs
-------------------------------------------------
-- INNER Curser END --
-------------------------------------------------
可以估算为wal_keep_segments
目录中每分钟新WAL段的平均数乘以您希望安全的分钟数。请记住,在pg_xlog
从默认值wal_level
更改为minimal
或archive
后,预计费率会增加。唯一的成本是磁盘空间,默认情况下,每个段为16 MB。
我通常使用2的幂作为值。以每分钟大约1个段的速率,值256给我大约4小时来设置备用。
您也可以考虑将WAL流与hot_standby
一起使用。这是pg_basebackup
选项。遗憾的是,至少从2013年开始,按照discussion on a PostgreSQL mailing list,仍然可以建议将--xlog-method=stream
设置为非零值 - 这是为了防止流无法跟上。如果你确实使用wal_keep_segments
,也不要忘记pg_basebackup
。