PostgreSQL 구성을 깔끔하게 수정

7105 단어 databasepostgressql
PostgreSQL에는 다양한 구성이 있습니다. 이러한 구성을 변경하면 때때로 문제가 발생하거나 서버 시작이 중지될 수도 있습니다.
또한 구성이 수정되었지만 아직 적용되지 않았을 수 있습니다. 이로 인해 구성을 수정하고 서버를 다시 로드하거나 다시 시작한 다음 수정과 관련 없는 문제가 발생하는 시나리오가 쉽게 발생할 수 있습니다.

그러나 좋은 소식은 PostgreSQL이 서버를 다시 로드하거나 다시 시작하기 전에 수정할 수 있도록 구성에 오류가 있는지 확인할 수 있는 인프라를 제공했다는 것입니다.

PostgreSQL 구성 조정 방법


  • 구성 파일 편집
  • 사용 중 ALTER SYSTEM

  • 구성에서 오류 확인



    아래의 SQL 쿼리를 사용하여 구성 오류를 확인할 수 있습니다.

     SELECT name, sourcefile, sourceline, setting, error FROM pg_catalog.pg_file_settings WHERE error IS NOT NULL;
     name |                    sourcefile                     | sourceline | setting |                error
    ------+---------------------------------------------------+------------+---------+--------------------------------------
     test | /usr/local/etc/postgresql/14/main/postgresql.conf |          2 | test    | unrecognized configuration parameter
    (1 row)
    
    Time: 2.354 ms
    


    서버를 다시 로드해 보겠습니다. 로그에서 다음 정보를 얻습니다.

    2022-07-22 16:00:53.190 CEST [4317] LOG:  received SIGHUP, reloading configuration files
    2022-07-22 16:00:53.190 CEST [4317] LOG:  unrecognized configuration parameter "test" in file "/usr/local/etc/postgresql/14/main/postgresql.conf" line 2
    2022-07-22 16:00:53.191 CEST [4317] LOG:  configuration file "/usr/local/etc/postgresql/14/main/postgresql.conf" contains errors; no changes were applied
    


    서버를 다시 시작해 봅시다. 아래 오류가 발생하여 서버를 시작할 수 없습니다.

    2022-07-22 14:03:45.281 GMT [4940] LOG:  unrecognized configuration parameter "test" in file "/usr/local/etc/postgresql/14/main/postgresql.conf" line 2
    2022-07-22 14:03:45.282 GMT [4940] FATAL:  configuration file "/usr/local/etc/postgresql/14/main/postgresql.conf" contains errors
    pg_ctl: could not start server
    Examine the log output.
    


    다시 로드하거나 다시 시작하기 전에 구성 상태를 확인할 수 있으므로 문제를 신속하게 해결할 수 있습니다.

    놀라움을 피하기 위해 구성 관리 시스템으로 구현할 수도 있습니다.

    보류 중인 다시 로드 및 보류 중인 다시 시작 확인



    구성을 변경하기 전에 서버의 현재 상태를 확인하는 것이 좋습니다. 이렇게 하면 깨끗한 상태에서 시작할 수 있고 캐스케이드 문제를 방지할 수 있습니다.

    팀의 DBA 중 한 명이 변경되었지만random page cost 변경 사항이 아직 적용되지 않은 시나리오를 생각해 보십시오. 수정하고 서버를 다시 로드하거나 다시 시작합니다. 며칠 후 쿼리 성능이 저하되기 시작했습니다. 당신은 조정에 대해 질문을 받았고 심지어 그것을 되돌려달라고 요청했지만 여전히 안도감은 없었습니다.
    이러한 문제를 조사하는 것은 번거롭고 시간이 많이 소요될 수 있습니다. 후회하는 것보다 안전한 것이 낫습니다.

    다음 SQL 쿼리로 보류 중인 다시 로드 및 다시 시작을 쉽게 확인할 수 있습니다.

    WITH current_settings AS (
        SELECT
            name,
            CASE
                WHEN unit IN ('kB', '8kB', 'MB') THEN pg_catalog.pg_size_pretty(pg_catalog.pg_size_bytes(setting || unit))
                WHEN unit = 'B' THEN pg_catalog.pg_size_pretty(pg_catalog.pg_size_bytes(setting))
                -- extract seconds from config with units s and min
                WHEN unit IN ('s', 'min') THEN floor(extract(epoch from (setting || unit)::interval))::text
                -- extract milliseconds from config with unit ms
                WHEN unit = 'ms' THEN floor(extract(epoch from (setting || unit)::interval) * 1000)::text
                ELSE setting || ' ' || coalesce(unit, '')
            END AS current_setting,
            unit,
            context
        FROM pg_catalog.pg_settings
    ),
    file_settings AS (
        SELECT
            row_number() OVER (PARTITION BY pf.name ORDER BY pf.seqno DESC) AS rn,
            pf.name,
            CASE
                WHEN cs.unit IN ('kB', '8kB', 'MB') THEN pg_catalog.pg_size_pretty(pg_catalog.pg_size_bytes(case when not pf.setting ~ '^\-?\d*\.?\d+[a-zA-Z]+$' then pf.setting || cs.unit else pf.setting end))
                WHEN cs.unit = 'B' THEN pg_catalog.pg_size_pretty(pg_catalog.pg_size_bytes(case when not pf.setting ~ '^\-?\d*\.?\d+B$' and not pf.setting ~ '^\-?\d*\.?\d+[a-zA-Z]+$' then pf.setting || 'bytes' when pf.setting ~ '^\-?\d+B$' then replace(pf.setting, 'B', 'bytes') else pf.setting end))
                -- extract seconds from config with units s and min
                WHEN cs.unit IN ('s', 'min') THEN floor(extract(epoch from (case when not pf.setting ~ '^\-?\d*\.?\d+[a-zA-Z]+$' then pf.setting || cs.unit else pf.setting end)::interval))::text
                -- extract milliseconds from config with unit ms
                WHEN unit = 'ms' THEN floor(extract(epoch from (case when not pf.setting ~ '^\-?\d*\.?\d+[a-zA-Z]+$' then pf.setting || cs.unit else pf.setting end)::interval) * 1000)::text
                ELSE setting || ' ' || coalesce(unit, '')
            END AS file_setting,
            pf.sourcefile,
            pf.sourceline,
            pf.error
        FROM current_settings AS cs
        JOIN pg_catalog.pg_file_settings AS pf ON pf.name = cs.name
    )
    SELECT
        cs.name,
        cs.current_setting,
        fs.file_setting AS pending_setting,
        cs.context,
        fs.sourcefile,
        fs.sourceline,
        fs.error,
        CASE
            WHEN cs.current_setting != fs.file_setting AND cs.context != 'postmaster' THEN true::text
            ELSE 'N/A'
        END AS pending_reload,
        CASE
            WHEN cs.current_setting != fs.file_setting AND cs.context = 'postmaster' THEN true::text
            ELSE 'N/A'
        END AS pending_restart
    FROM current_settings AS cs
    JOIN file_settings AS fs ON cs.name = fs.name
    WHERE fs.rn = 1
    AND cs.current_setting != fs.file_setting
    ORDER BY pending_reload DESC;
    


    샘플 출력:

            name         | current_setting | pending_setting |  context   |                         sourcefile                         | sourceline | error  | pending_reload | pending_restart
    ---------------------+-----------------+-----------------+------------+------------------------------------------------------------+------------+--------+----------------+-----------------
     archive_command     | (disabled)      | /bin/true       | sighup     | /usr/local/var/lib/postgresql/14/main/postgresql.auto.conf |         28 | <null> | true           | N/A
     autovacuum_work_mem | 10 MB           | 1024 kB         | sighup     | /usr/local/var/lib/postgresql/14/main/postgresql.auto.conf |         20 | <null> | true           | N/A
     max_wal_size        | 1024 MB         | 10 GB           | sighup     | /usr/local/var/lib/postgresql/14/main/postgresql.auto.conf |         26 | <null> | true           | N/A
     archive_mode        | off             | on              | postmaster | /usr/local/var/lib/postgresql/14/main/postgresql.auto.conf |         27 | <null> | N/A            | true
     shared_buffers      | 160 MB          | 1024 MB         | postmaster | /usr/local/var/lib/postgresql/14/main/postgresql.auto.conf |         25 | <null> | N/A            | true
    (5 rows)
    
    Time: 8.198 ms
    


    놀라움을 피하기 위해 구성 관리 시스템으로 구현할 수도 있습니다.

    좋은 웹페이지 즐겨찾기