PostgreSQL 運用チート集
psql、ロール権限、DDL、EXPLAIN、インデックス、パーティション、pg_dump、レプリケーション、pg_stat 系、VACUUM をまとめた PostgreSQL 運用集。
- 更新日
- 2026-05-29
- 参照範囲
- 公式ドキュメント / man page / 主要ベンダーCLI
- 対象実装
- 主要 Linux / BSD / ネットワーク機器 CLI の一般的な実装
- 免責
- OS とバージョン差分は実環境で確認してください。
このチートシートの使いどころ
PostgreSQL 運用チート集は、psql、ロール権限、DDL、EXPLAIN、インデックス、パーティション、pg_dump、レプリケーション、pg_stat 系、VACUUM をまとめた PostgreSQL 運用集。 対象は公式ドキュメント、man page、主要ベンダー CLI で確認できる現行の一般的な実装です。カテゴリは接続・認証、スキーマ・DDL、クエリ・EXPLAIN、インデックス・パーティション、バックアップを中心に、40件のコマンドや値を用途別に引けます。障害調査、設定変更前の確認、作業メモ作成で、PostgreSQL、postgres、psql、EXPLAIN、pg_dumpに関連する操作を短時間で探すために使います。
40 / 40
psql -h -U -dホスト・ユーザー・DB を指定して接続する。
psql -h db.example.com -U appuser -d appdbpsql connection URIURI 形式で TLS 付き接続する。
psql "postgresql://appuser@db.example.com:5432/appdb?sslmode=require"\lデータベース一覧を表示する。
appdb=> \l\duロール一覧と属性を表示する。
appdb=> \du\dtテーブル一覧を表示する。
appdb=> \dt public.*\d+ tableテーブル定義とサイズを確認する。
appdb=> \d+ public.orders\x \timing拡張表示と実行時間表示を有効化する。
appdb=> \x on
appdb=> \timing on\watchクエリを周期実行する。
appdb=> SELECT now(), count(*) FROM jobs WHERE state = 'running';
appdb=> \watch 5CREATE ROLEログイン可能ロールを作成する。
CREATE ROLE appuser LOGIN PASSWORD 'change-me';ALTER ROLEロールの既定設定を変更する。
ALTER ROLE appuser SET statement_timeout = '5s';GRANT REVOKE権限を付与・剥奪する。
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO appuser;
REVOKE DELETE ON public.orders FROM appuser;pg_hba.conf hostsslTLS 接続だけを許可する。
hostssl appdb appuser 10.0.0.0/8 scram-sha-256postgresql.conf memory主要メモリ設定を調整する。
shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 64MBCREATE SCHEMAアプリ用スキーマを作成する。
CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION appuser;CREATE TABLE主キー付きテーブルを作成する。
CREATE TABLE app.orders (id bigserial PRIMARY KEY, customer_id bigint NOT NULL, created_at timestamptz NOT NULL DEFAULT now());ALTER TABLE ADD COLUMN列を追加する。
ALTER TABLE app.orders ADD COLUMN status text NOT NULL DEFAULT 'pending';CREATE EXTENSION拡張を有効化する。
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;EXPLAIN ANALYZE BUFFERS実行時間とバッファ使用量を確認する。
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM app.orders WHERE customer_id = 42;EXPLAIN VERBOSE出力列や内部式を含めて計画を見る。
EXPLAIN (VERBOSE, COSTS, SETTINGS) SELECT count(*) FROM app.orders;statement_timeout重いクエリを安全に試す。
SET statement_timeout = '3s'; SELECT * FROM app.events ORDER BY created_at DESC LIMIT 100;CREATE INDEX btree等価・範囲検索向け btree index。
CREATE INDEX CONCURRENTLY idx_orders_customer_created ON app.orders (customer_id, created_at DESC);CREATE INDEX ginJSONB や配列検索向け GIN index。
CREATE INDEX CONCURRENTLY idx_events_payload_gin ON app.events USING gin (payload jsonb_path_ops);CREATE INDEX gist幾何・範囲型向け GiST index。
CREATE INDEX idx_bookings_period_gist ON app.bookings USING gist (period);CREATE INDEX brin時系列巨大テーブル向け BRIN index。
CREATE INDEX idx_logs_created_brin ON app.logs USING brin (created_at);partial index条件付き index で小さく保つ。
CREATE INDEX CONCURRENTLY idx_jobs_ready ON app.jobs (priority, id) WHERE state = 'ready';expression index式の結果に index を作る。
CREATE INDEX CONCURRENTLY idx_users_lower_email ON app.users (lower(email));partition table月次レンジパーティションを作成する。
CREATE TABLE app.logs_2026_05 PARTITION OF app.logs FOR VALUES FROM ('2026-05-01') TO ('2026-06-01');VACUUM ANALYZE不要タプル回収と統計更新を行う。
VACUUM (ANALYZE, VERBOSE) app.orders;autovacuum settingsテーブル単位で autovacuum を調整する。
ALTER TABLE app.events SET (autovacuum_vacuum_scale_factor = 0.02, autovacuum_analyze_scale_factor = 0.01);pg_dump customカスタム形式でバックアップする。
pg_dump -h db.example.com -U postgres -d appdb -Fc -f appdb.dumppg_restore jobs並列復元する。
createdb appdb_restore && pg_restore -d appdb_restore -j 4 appdb.dumppg_basebackup物理ベースバックアップを取得する。
pg_basebackup -h primary.example.com -U repl -D /var/lib/postgresql/16/main -Fp -Xs -P -Rstandby.signalスタンバイとして起動する。
touch /var/lib/postgresql/16/main/standby.signalprimary_conninfoストリーミングレプリカの接続先を設定する。
primary_conninfo = 'host=primary.example.com port=5432 user=repl password=secret application_name=standby1'pg_stat_replicationレプリケーション遅延を確認する。
SELECT application_name, state, sync_state, write_lag, replay_lag FROM pg_stat_replication;pg_stat_activity実行中セッションを確認する。
SELECT pid, usename, state, wait_event_type, query FROM pg_stat_activity WHERE state <> 'idle';pg_stat_statements累積で重い SQL を探す。
SELECT calls, mean_exec_time, rows, query FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;pg_locksロック待ちを確認する。
SELECT pid, locktype, relation::regclass, mode, granted FROM pg_locks WHERE NOT granted;terminate backend問題セッションを終了する。
SELECT pg_terminate_backend(12345);reindex concurrentlyindex を無停止で再構築する。
REINDEX INDEX CONCURRENTLY app.idx_orders_customer_created;| Command | Description | Example | Copy |
|---|---|---|---|
psql -h -U -d | ホスト・ユーザー・DB を指定して接続する。 | psql -h db.example.com -U appuser -d appdb | |
psql connection URI | URI 形式で TLS 付き接続する。 | psql "postgresql://appuser@db.example.com:5432/appdb?sslmode=require" | |
\l | データベース一覧を表示する。 | appdb=> \l | |
\du | ロール一覧と属性を表示する。 | appdb=> \du | |
\dt | テーブル一覧を表示する。 | appdb=> \dt public.* | |
\d+ table | テーブル定義とサイズを確認する。 | appdb=> \d+ public.orders | |
\x \timing | 拡張表示と実行時間表示を有効化する。 | appdb=> \x on
appdb=> \timing on | |
\watch | クエリを周期実行する。 | appdb=> SELECT now(), count(*) FROM jobs WHERE state = 'running';
appdb=> \watch 5 | |
CREATE ROLE | ログイン可能ロールを作成する。 | CREATE ROLE appuser LOGIN PASSWORD 'change-me'; | |
ALTER ROLE | ロールの既定設定を変更する。 | ALTER ROLE appuser SET statement_timeout = '5s'; | |
GRANT REVOKE | 権限を付与・剥奪する。 | GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO appuser;
REVOKE DELETE ON public.orders FROM appuser; | |
pg_hba.conf hostssl | TLS 接続だけを許可する。 | hostssl appdb appuser 10.0.0.0/8 scram-sha-256 | |
postgresql.conf memory | 主要メモリ設定を調整する。 | shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 64MB | |
CREATE SCHEMA | アプリ用スキーマを作成する。 | CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION appuser; | |
CREATE TABLE | 主キー付きテーブルを作成する。 | CREATE TABLE app.orders (id bigserial PRIMARY KEY, customer_id bigint NOT NULL, created_at timestamptz NOT NULL DEFAULT now()); | |
ALTER TABLE ADD COLUMN | 列を追加する。 | ALTER TABLE app.orders ADD COLUMN status text NOT NULL DEFAULT 'pending'; | |
CREATE EXTENSION | 拡張を有効化する。 | CREATE EXTENSION IF NOT EXISTS pg_stat_statements; | |
EXPLAIN ANALYZE BUFFERS | 実行時間とバッファ使用量を確認する。 | EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM app.orders WHERE customer_id = 42; | |
EXPLAIN VERBOSE | 出力列や内部式を含めて計画を見る。 | EXPLAIN (VERBOSE, COSTS, SETTINGS) SELECT count(*) FROM app.orders; | |
statement_timeout | 重いクエリを安全に試す。 | SET statement_timeout = '3s'; SELECT * FROM app.events ORDER BY created_at DESC LIMIT 100; | |
CREATE INDEX btree | 等価・範囲検索向け btree index。 | CREATE INDEX CONCURRENTLY idx_orders_customer_created ON app.orders (customer_id, created_at DESC); | |
CREATE INDEX gin | JSONB や配列検索向け GIN index。 | CREATE INDEX CONCURRENTLY idx_events_payload_gin ON app.events USING gin (payload jsonb_path_ops); | |
CREATE INDEX gist | 幾何・範囲型向け GiST index。 | CREATE INDEX idx_bookings_period_gist ON app.bookings USING gist (period); | |
CREATE INDEX brin | 時系列巨大テーブル向け BRIN index。 | CREATE INDEX idx_logs_created_brin ON app.logs USING brin (created_at); | |
partial index | 条件付き index で小さく保つ。 | CREATE INDEX CONCURRENTLY idx_jobs_ready ON app.jobs (priority, id) WHERE state = 'ready'; | |
expression index | 式の結果に index を作る。 | CREATE INDEX CONCURRENTLY idx_users_lower_email ON app.users (lower(email)); | |
partition table | 月次レンジパーティションを作成する。 | CREATE TABLE app.logs_2026_05 PARTITION OF app.logs FOR VALUES FROM ('2026-05-01') TO ('2026-06-01'); | |
VACUUM ANALYZE | 不要タプル回収と統計更新を行う。 | VACUUM (ANALYZE, VERBOSE) app.orders; | |
autovacuum settings | テーブル単位で autovacuum を調整する。 | ALTER TABLE app.events SET (autovacuum_vacuum_scale_factor = 0.02, autovacuum_analyze_scale_factor = 0.01); | |
pg_dump custom | カスタム形式でバックアップする。 | pg_dump -h db.example.com -U postgres -d appdb -Fc -f appdb.dump | |
pg_restore jobs | 並列復元する。 | createdb appdb_restore && pg_restore -d appdb_restore -j 4 appdb.dump | |
pg_basebackup | 物理ベースバックアップを取得する。 | pg_basebackup -h primary.example.com -U repl -D /var/lib/postgresql/16/main -Fp -Xs -P -R | |
standby.signal | スタンバイとして起動する。 | touch /var/lib/postgresql/16/main/standby.signal | |
primary_conninfo | ストリーミングレプリカの接続先を設定する。 | primary_conninfo = 'host=primary.example.com port=5432 user=repl password=secret application_name=standby1' | |
pg_stat_replication | レプリケーション遅延を確認する。 | SELECT application_name, state, sync_state, write_lag, replay_lag FROM pg_stat_replication; | |
pg_stat_activity | 実行中セッションを確認する。 | SELECT pid, usename, state, wait_event_type, query FROM pg_stat_activity WHERE state <> 'idle'; | |
pg_stat_statements | 累積で重い SQL を探す。 | SELECT calls, mean_exec_time, rows, query FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; | |
pg_locks | ロック待ちを確認する。 | SELECT pid, locktype, relation::regclass, mode, granted FROM pg_locks WHERE NOT granted; | |
terminate backend | 問題セッションを終了する。 | SELECT pg_terminate_backend(12345); | |
reindex concurrently | index を無停止で再構築する。 | REINDEX INDEX CONCURRENTLY app.idx_orders_customer_created; |