为PostgreSQL hot_standby设置wal_keep_segments

时间:2015-01-27 02:00:43

标签: postgresql postgresql-9.3

我在设置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的正确设置?此设置的可接受值是什么?

我正在与之合作:

  • Postgresql 9.3
  • Debian 7.6

1 个答案:

答案 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更改为minimalarchive后,预计费率会增加。唯一的成本是磁盘空间,默认情况下,每个段为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