お知らせ
2023.12.5(Tue)
目次
こんにちは、飯塚です。
業務でPostgreSQLを知ってから約3年が経ちましたが、単純にSQLを組むだけでなく、運用の知識も必要な場面が出てくるようになりました。運用上よく使ったSQLや、知っておくと便利なSQLを勉強と整理のためにまとめました。
select version();
select * from pg_settings; select * from pg_settings where name = 'max_connections'; --(例)最大接続数を確認する
select * from pg_language;
select * from pg_user;
select * from pg_tables;
select * from pg_stat_user_indexes;
select * from pg_locks;
select * from pg_proc;
select * from information_schema.triggers;
select * from pg_stat_database;
select * from pg_stat_user_tables;
select * from pg_stat_activity;
上記のテーブルなどを組み合わせると、調査や監視に便利なSQLを作成できます。
WITH pg_stats AS (
SELECT
backendid
, pg_stat_get_backend_pid(s.backendid) AS procpid
, pg_stat_get_backend_activity_start(s.backendid) AS
START
, pg_stat_get_backend_activity(s.backendid) AS current_query
FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS s
)
SELECT
pd.datname
, pc.relname
, lc.locktype
, lc.pid
, lc.mode
, ps.*
FROM
pg_locks lc
INNER JOIN pg_class pc
ON pc.oid = lc.relation
INNER JOIN pg_database pd
ON pd.oid = lc.database
INNER JOIN pg_stats ps
ON lc.pid = ps.procpid
WHERE
mode like '%ExclusiveLock%'; --排他ロックのみ指定
--AND relname LIKE '%tablename%'; --テーブル名を絞る場合は解放
他にもこんなこともできるようです。
SELECT
*
, pg_size_pretty(total_bytes) AS total
, pg_size_pretty(index_bytes) AS INDEX
, pg_size_pretty(toast_bytes) AS toast
, pg_size_pretty(table_bytes) AS TABLE
FROM
(
SELECT
*
, total_bytes - index_bytes - coalesce(toast_bytes, 0) AS table_bytes
FROM
(
SELECT
c.oid
, nspname AS table_schema
, relname AS table_name
, c.reltuples AS row_estimate
, pg_total_relation_size(c.oid) AS total_bytes
, pg_indexes_size(c.oid) AS index_bytes
, pg_total_relation_size(reltoastrelid) AS toast_bytes
FROM
pg_class c
LEFT JOIN pg_namespace n
ON n.oid = c.relnamespace
WHERE
relkind = 'r'
AND nspname NOT IN ('pg_catalog', 'information_schema')
) a
) a
ORDER BY
table_bytes DESC;
いかがでしょうか。
コマンドを使わずにSQLを流すだけで監視や運用で使える情報を得られるのはハードルが低くて、かなり便利ですよね。実際に運用をしているといかに素早く対応できるか、安定した仕組みにできるかは知識量にかかっていると感じました。
PostgreSQLの特徴として公式の日本語ドキュメントが充実しているので、今後も読んで勉強していきたいです。
《関連記事》