【问题标题】:Changing "wal_level" on PostgreSQL 13 (via client session) is not being respected在 PostgreSQL 13(通过客户端会话)上更改“wal_level”没有得到尊重
【发布时间】:2021-05-11 16:19:41
【问题描述】:

在一个正在运行的 PostgreSQL 13 实例上,我尝试修改它的 wal_level 系统设置,如下所示,但没有得到尊重:

postgres@localhost:postgres> SHOW wal_level
+-------------+
| wal_level   |
|-------------|
| replica     |
+-------------+
SHOW
Time: 0.021s

postgres@localhost:postgres> ALTER SYSTEM SET wal_level = logical;
ALTER SYSTEM
Time: 0.007s

postgres@localhost:postgres> SHOW wal_level
+-------------+
| wal_level   |
|-------------|
| replica     |
+-------------+
SHOW
Time: 0.021s

postgres@localhost:postgres>

不幸的是,这是由 Postgres 人在 DockerHub 映像中设置的,因此仅修改配置文件并重新启动并非易事。确实可以解决变通办法,但我希望社区可以建议一种方法来通过 Postgres 客户端会话实时解决问题。

编辑(下方评论补充)

postgres@localhost:postgres> select * from pg_settings where name ='wal_level';
--+-----------------------------------+------------+-------------+--------------+--------------+-------------------+
  | enumvals                          | boot_val   | reset_val   | sourcefile   | sourceline   | pending_restart   |
--+-----------------------------------+------------+-------------+--------------+--------------+-------------------|
  | ['minimal', 'replica', 'logical'] | replica    | replica     | <null>       | <null>       | False             |
--+-----------------------------------+------------+-------------+--------------+--------------+-------------------+

【问题讨论】:

  • 在已经运行的服务器上更改 wal_level 需要重新启动。没有办法解决这个问题。
  • 不相关,但是:replica 是默认的 wal 级别。这并不特定于 Docker 映像
  • 那个@jjanes 和@a_horse_with_no_name(听起来像是我知道的一首歌)。 =:) 可惜他们没有公开那个参数。我必须从头开始构建映像,或者修改 commit 一个正在运行的容器。

标签: sql postgresql wal


【解决方案1】:

正如您将在文档中看到的那样,wal_level 在不重新启动 PostgreSQL 服务器的情况下无法更改。没有其他选择。

【讨论】:

    【解决方案2】:

    检查select * from pg_settings where name ='wal_level'; 上的上下文字段 有了这个值,你可以看到你需要什么“重启”级别

    更多信息https://www.postgresql.org/docs/current/view-pg-settings.html

    但是,在文档中,对于 wal_level 说:

    wal_level(枚举)

    wal_level 决定了写入 WAL 的信息量。这 默认值为replica,它写入足够的数据以支持WAL 归档和复制,包括在 备用服务器。最小删除除信息之外的所有日志记录 需要从崩溃或立即关闭中恢复。最后, 逻辑添加支持逻辑解码所需的信息。每个 level 包括在所有较低级别记录的信息。这 参数只能在服务器启动时设置。

    https://www.postgresql.org/docs/current/runtime-config-wal.html

    【讨论】:

    • 我将您提到的语句的输出添加到我的帖子中。 pending_restart = False。不知道这意味着什么,但这似乎意味着没有任何东西在等待重新启动(即,也许我的 ALTER 语句没有效果)。但我不是dba,所以我不确定。谢谢。
    • 我会将其标记为答案(其中包含非常有用的信息),但实际上答案是在启动数据库服务器之前将配置设置为logical,正如上面@jjanes 评论的那样。我希望避免这种情况,因为这意味着修改 Dockerfile(并维护它)或 committing 正在运行的 docker 映像;但是它就是这样啊。 =:) 谢谢!
    猜你喜欢
    • 2021-06-15
    • 2010-12-17
    • 2014-07-24
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2018-09-26
    相关资源
    最近更新 更多