Kodrill

基本的な運用管理作業

OSS-DB Silver

起動と停止/ロールの作成・変更・削除/GRANT・REVOKE/VACUUM・ANALYZE・自動バキューム/システム情報関数・情報スキーマとシステムカタログ

問題数
20 問
合格ライン
70%
実行して確認済み
7 問
この分野の要点を読む6 章・約 9 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 15 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

基本的な運用管理作業の要点

内容の確認日: 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 が既定かどうか だけです。

SQL
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 で削除します (どちらもデータベースごとに実行します)。

SQL
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 (既定) ならメンバーはそのロールの権限を使える

SQL
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: 両方をまとめて行う

SQL
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() (読みやすい表記に直す)

SQL
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) でセッションを切ります。

SQL
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 と EXPLAIN

    ANALYZE は統計情報を集めます。実行計画を表示するのは EXPLAIN です。

  • current_user に括弧は付けない

    current_user() は構文エラーです。current_database() は括弧を付けます。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。