基本的な運用管理作業の要点
内容の確認日: 2026-10-29
この分野は出題範囲の S2.5 (基本的な運用管理作業) に当たり、50 問中およそ 7 問が出題されます。ロールと権限、VACUUM と ANALYZE、システムの情報を調べる方法が中心です。
PostgreSQL では、ユーザーもグループも ロール という 1 つの仕組みで表します。また、MVCC のために更新・削除で古い行が残るので、VACUUM による後始末が欠かせません。この 2 つの考え方を押さえると、細かい知識も整理しやすくなります。
ロールの作成・変更・削除
ロールは CREATE ROLE で作り、LOGIN・SUPERUSER・CREATEDB・CREATEROLE・REPLICATION・PASSWORD 'パスワード'・VALID UNTIL '日時'・CONNECTION LIMIT 数 などの属性を付けます。CREATE USER は CREATE ROLE の別名で、違いは LOGIN が既定かどうか だけです。
CREATE ROLE r1;CREATE USER u1;CREATE ROLE dev1 CREATEDB LOGIN;SELECT rolname, rolcanlogin, rolcreatedb FROM pg_roles WHERE rolname IN ('r1', 'u1', 'dev1') ORDER BY rolname;psql -A -t -P null=NULL -f example.sql dev1|t|t r1|f|f u1|t|f
ALTER ROLE では属性の変更、RENAME TO での名前の変更、SET 項目 = 値 でのロールごとの設定の既定値の指定ができます。DROP ROLE は、そのロールが所有するオブジェクトがあるとエラーになるので、先に REASSIGN OWNED BY で所有者を移すか、DROP OWNED BY で削除します (どちらもデータベースごとに実行します)。
CREATE ROLE owner1;CREATE TABLE t (x integer);ALTER TABLE t OWNER TO owner1;DROP ROLE owner1;psql -A -t -P null=NULL -f example.sql
エラー (SQLSTATE 2BP01)
GRANT と REVOKE
テーブルの権限には SELECT・INSERT・UPDATE・DELETE・TRUNCATE・REFERENCES・TRIGGER があり、GRANT 権限 ON テーブル TO ロール で与え、REVOKE 権限 ON テーブル FROM ロール で取り消します。列を指定して GRANT SELECT (列名) ON ... とすることもできます。
・PUBLIC は、すべてのロール (今後作るロールも含む) を表す
・WITH GRANT OPTION を付けると、受け取ったロールもその権限をほかのロールに与えられる
・テーブルの所有者は最初からすべての権限を持つ
・GRANT ロール TO ロール でロールをメンバーにでき、INHERIT (既定) ならメンバーはそのロールの権限を使える
CREATE ROLE staff;CREATE ROLE alice LOGIN;CREATE TABLE notes (body text);INSERT INTO notes VALUES ('hello');GRANT SELECT ON notes TO staff;GRANT staff TO alice;SET ROLE alice;SELECT body FROM notes;SELECT current_user, session_user;psql -A -t -P null=NULL -f example.sql hello alice|postgres
SET ROLE で変わるのは current_user (権限の確認に使うロール) で、session_user (接続したときのロール) は変わりません。
VACUUM と ANALYZE
PostgreSQL の UPDATE・DELETE は、古い版の行をすぐには消しません。VACUUM は、どのトランザクションからも見えなくなった行の領域を回収し、同じテーブルで再利用できるようにします。ほかのセッションの読み書きと同時に実行でき、トランザクションブロックの中では実行できません。
・VACUUM: 領域を再利用できるようにする (ファイルは基本的に小さくならない)。トランザクション ID の周回を防ぐための凍結や、可視性マップの更新も行う
・VACUUM FULL: テーブルを書き直して領域を OS に返す。実行中は ACCESS EXCLUSIVE ロックで読み書きできない
・ANALYZE: 列の値の分布などの統計情報を集め、プランナが実行計画を選ぶのに使えるようにする。大量にデータを入れた直後に実行する
・VACUUM ANALYZE: 両方をまとめて行う
CREATE TABLE logs (msg text);BEGIN;VACUUM logs;psql -A -t -P null=NULL -f example.sql
エラー (SQLSTATE 25001)
コマンドの vacuumdb は VACUUM を実行するラッパーで、-a すべてのデータベース、-z 統計情報の更新も行う、-Z 統計情報の更新だけ、-f VACUUM FULL です。
自動バキューム
自動バキューム (autovacuum = on が既定) は、ランチャーが autovacuum_naptime (既定 1 分) ごとに各データベースを調べ、しきい値を超えたテーブルにワーカー (最大 autovacuum_max_workers、既定 3) が VACUUM・ANALYZE をかけます。判断には track_counts で集めた統計を使います。
VACUUM のしきい値は「autovacuum_vacuum_threshold (50) + autovacuum_vacuum_scale_factor (0.2) × テーブルの行数」で、10,000 行のテーブルなら、不要になった行が 2,050 行を超えると対象になります。ANALYZE には autovacuum_analyze_threshold (50)・autovacuum_analyze_scale_factor (0.1) が使われます。VACUUM FULL は自動では行われません。
システム情報関数・情報スキーマ・システムカタログ
・version()・current_database()・current_user・session_user (後の 2 つは括弧を付けない)・pg_postmaster_start_time()
・大きさ: pg_database_size()・pg_relation_size() (本体だけ)・pg_total_relation_size() (インデックスと TOAST を含む)・pg_size_pretty() (読みやすい表記に直す)
SELECT pg_size_pretty(1048576::bigint), pg_size_pretty(10239::bigint), pg_size_pretty(10240::bigint);psql -A -t -P null=NULL -f example.sql 1024 kB|10239 bytes|10 kB
information_schema は SQL 標準のビューの集まり (tables・columns など) で、ほかの RDBMS でも同じように使えます。pg_catalog のシステムカタログ (pg_class・pg_database・pg_roles など) は PostgreSQL 独自の情報も持っています。実行中のセッションと SQL は pg_stat_activity ビューで確かめ、pg_cancel_backend(pid) で SQL を取り消し、pg_terminate_backend(pid) でセッションを切ります。
CREATE TABLE orders (id integer);CREATE VIEW recent AS SELECT * FROM orders;SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name;psql -A -t -P null=NULL -f example.sql orders|BASE TABLE recent|VIEW
試験でよくある引っかけ
CREATE ROLEはNOLOGINが既定ログインさせるには
LOGINを付けます。CREATE USERはLOGINが既定です。オブジェクトを所有するロールは削除できない
REASSIGN OWNED BY・DROP OWNED BYで片付けてからDROP ROLEします。REVOKEは指定した権限だけREVOKE INSERTでSELECTの権限は残ります。VACUUMとVACUUM FULL通常の
VACUUMは読み書きを止めず、領域を OS には返しません。VACUUM FULLは書き直して返しますが、テーブルを読み書きできなくなります。VACUUMはトランザクションブロックの中で使えないBEGINの後に実行するとエラーになります。ANALYZEとEXPLAINANALYZEは統計情報を集めます。実行計画を表示するのはEXPLAINです。current_userに括弧は付けないcurrent_user()は構文エラーです。current_database()は括弧を付けます。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- LPI-Japan「OSS-DB Silver」(出題範囲)
- PostgreSQL 14 文書「データベースロール」
- PostgreSQL 14 文書「定常的なバキューム作業」
- PostgreSQL 14 文書「システム情報関数と演算子」
コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。