お知らせ
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の特徴として公式の日本語ドキュメントが充実しているので、今後も読んで勉強していきたいです。
《関連記事》