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
놀라움을 피하기 위해 구성 관리 시스템으로 구현할 수도 있습니다.
Reference
이 문제에 관하여(PostgreSQL 구성을 깔끔하게 수정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bolajiwahab/cleanly-modifying-postgresql-configurations-42d3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)