是否可以在不生成 WAL 文件的情况下运行 postgres?

dav*_*100 7 postgresql postgresql-9.2

我正在寻找一种在 redhat 6 上运行 9.2 postgres 数据库而不生成任何 WAL 文件的方法。

我们有一个日终批处理,它生成大量的 WAL 文件(并且已经填满了磁盘几次)。我们还在一天结束的过程开始之前和结束时进行 pg_dump 备份。我们很高兴,如果在批处理过程中出现问题来恢复 pg_dump 前的备份。

当我将 wal_level 设置为最小时,由于发生的数据库更新类型,我们仍然会收到大量 WAL 文件。那么是否有可能没有 WAL 文件(基本上是 wal_level=none)?

谢谢戴夫

Cra*_*ger 11

简短版本:没有。PostgreSQL 不支持不生成任何 WAL,因为对pg_catalog模式中系统目录表的更改总是被记录下来。除了 xlog 之外,还有事务 ID 日志记录 ( pg_clog)、multixact 跟踪数据 ( pg_multixact) 等,但它们往往非常小。

正如丹尼尔所说,您可以通过以下方式以最少的WAL 生成运行:

  • 使用 wal_level = minimal
  • 将所有表创建为UNLOGGEDTEMPORARY

在这种情况下,您还需要设置fsync = off,full_page_writes = offsynchronous_commit = off,因为您不需要持久性和崩溃恢复。

当然,如果出现任何问题(如断电、意外重启、数据库服务器崩溃pg_ctl -m immediate stop等),您的数据将完全无法恢复,但这似乎正是您想要的。

对于大多数应用程序,使用此配置创建和旋转 WAL 的速率可以忽略不计。

如果您不介意initdb在任何重新启动(即使是干净的)后重新启动,您可以pg_xlog使用 tempfs,但我怀疑当 Pg 只生成一点点 WAL 时是否值得麻烦。

您还应该检查并确保您没有archive_mode = on启用WAL 归档 ( ),这wal_keep_segments未设置。这两者仅在您进行基于 WAL 的备份或复制时才有用。如果你不这样做,那么 WAL 不应该累积,它应该被迅速回收。也许你的检查点设置得太少了,以至于你的磁盘用完了?检查checkpoint_segments参数是否真的很高。

我认为你在这里试图解决错误的问题。问题不是阻止 PostgreSQL 生成 WAL,而是弄清楚为什么它会堆积在您的批处理作业中。

另请参阅:优化 PostgreSQL 以进行快速测试

  • 如果您无法让您的开发团队将“CREATE TABLE”更改为“CREATE UNLOGGED TABLE”,那么您的问题是公司管理问题,而不是技术问题。这太荒谬了,而且您不会找到解决该问题的技术解决方案。 (3认同)
  • 你可以这么说,我不可能发表评论。 (2认同)
  • 对。好吧,如果你停止 WAL 归档,那么你的空间不足问题无论如何都会消失,因为 WAL 会立即被回收。请注意,`UNLOGGED` 表不会记录到 WAL(有点意思),因此不能通过 WAL 传送或流复制进行复制。 (2认同)
  • @davegreen100 听起来不错。在那里检查检查点设置;如果它们处于默认值,它们肯定太低(并且您可能会在日志中收到有关它的警告),但还要确保有足够的磁盘空间用于 `checkpoint_segments * 16MB` WAL 段,如果它很高。哦,如果您想走非耐用路线,请查看 http://stackoverflow.com/q/9407442/398670。 (2认同)