mcpField
P
postgres-ops

postgres-ops

github.com/0xdarkmatterデータ・データベース7842 回インストール2 週間前に更新
リポジトリ

postgres-ops について

postgres-opsは、PostgreSQLの開発者やデータベース管理者向けの運用スキルです。スキーマ設計、クエリ最適化、本番環境の保守を扱い、テーマ別の参照ファイルで詳しい手順を確認できます。

主な機能

  1. 01スキーマ設計とデータ型の選択
  2. 02インデックス戦略と実行計画の分析
  3. 03OLTP・OLAPの設定調整
  4. 04バックアップ、復元、保守操作
  5. 05性能監視と問題の切り分け
  6. 06RLS、全文検索、通知パターン

活用シーン

  1. 01新しいテーブルの型と制約の選定
  2. 02遅いクエリの診断とインデックス調整
  3. 03データベースのバックアップと復元の計画
  4. 04PostgreSQLの設定と保守手順の調整

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/0xdarkmatter/claude-mods --skill postgres-ops

インストール後、Claude Code で/postgres-opsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
.gitkeep
references/
config-tuning.md
indexing.md
operations.md
query-tuning.md
replication.md
schema-design.md
scripts/
.gitkeep

詳細

PostgreSQL の運用

スキーマ設計から本番環境の運用までを網羅する、PostgreSQL の包括的なスキルです。

クイック接続

# Standard connection
psql "postgresql://user:pass@localhost:5432/dbname"

# With SSL
psql "postgresql://user:pass@host:5432/dbname?sslmode=require"

# Environment variables (libpq)
export PGHOST=localhost PGPORT=5432 PGDATABASE=mydb PGUSER=myuser PGPASSWORD=secret
psql

# Connection pooling (pgBouncer default)
psql "postgresql://user:pass@localhost:6432/dbname"
-- Check current connection
SELECT current_database(), current_user, inet_server_addr(), inet_server_port();

-- Active connections
SELECT count(*) FROM pg_stat_activity WHERE state = 'active';

インデックスの種類の選択

What query pattern are you optimizing?
│
├─ Equality (WHERE col = val)
│  └─ B-tree (default, almost always right)
│
├─ Range (WHERE col > val, ORDER BY, BETWEEN)
│  └─ B-tree
│
├─ Array/JSONB containment (@>, ?, ?|, ?&)
│  └─ GIN
│
├─ Full-text search (@@)
│  └─ GIN with tsvector
│
├─ Geometric/range overlap (&&, <->)
│  └─ GiST
│
├─ Pattern matching (LIKE '%text%', similarity)
│  └─ GIN with pg_trgm (gin_trgm_ops)
│
├─ Large table, few distinct values, append-only
│  └─ BRIN (tiny index, good for timestamps)
│
└─ Exact equality only, no range/sort needed
   └─ Hash (rare - B-tree usually better)
インデックスのクイックリファレンス
インデックス最適な用途サイズ書き込みコスト
B-tree等価検索、範囲検索、ソート中低
GIN配列、JSONB、全文検索、トライグラム大高
GiSTジオメトリ、範囲、全文検索中中
BRIN相関のあるデータ(タイムスタンプ)極小非常に低
Hash完全一致のみ中低

詳細:複合、部分、式、カバリングインデックスの戦略については、./references/indexing.md を読み込んでください。

EXPLAIN ANALYZE のワークフロー

-- Step 1: Run with ANALYZE and BUFFERS
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;

-- Step 2: Read bottom-up. Find the slowest node.
-- Step 3: Check estimates vs actuals
--   actual rows=10000, rows=100  -> bad estimate, run ANALYZE
-- Step 4: Look for these red flags:
要注意項目意味対処法
大きなテーブルでの Seq Scan使用可能なインデックスがありませんWHERE/JOIN に適合するインデックスを追加します
actual rows が estimated rows を大幅に上回る統計情報が古くなっていますANALYZE tablename を実行します
行数の多い Nested LoopO(n*m) の結合です結合条件を確認し、インデックスを追加します
external merge を伴う Sortwork_mem が小さすぎますセッションの work_mem を増やします
Buffers: shared read が hit を大幅に上回るキャッシュが空、またはテーブルが大きすぎますshared_buffers を確認し、カバリングインデックスを追加します
Hash Batch > 1ハッシュ結合がディスクに書き出されていますwork_mem を増やします

詳細:実行計画ノードのリファレンスと最適化パターンについては、./references/query-tuning.md を読み込んでください。

ワークロードプロファイル

設定OLTPOLAP備考
shared_buffersRAM の 25%RAM の 25%同じ基本値
work_mem4-16 MB256 MB-1 GBOLAP では大きなソートが必要です
effective_cache_sizeRAM の 75%RAM の 75%プランナーへのヒント
random_page_cost1.1(SSD)1.1(SSD)SSD では値を下げます
max_parallel_workers_per_gather24-8OLAP のほうが恩恵を受けます
checkpoint_completion_target0.90.9チェックポイントの I/O を分散します
wal_buffers64 MB64 MB自動設定には -1
maintenance_work_mem512 MB1-2 GBVACUUM、CREATE INDEX 用

詳細:postgresql.conf の全項目の解説と拡張機能の設定については、./references/config-tuning.md を読み込んでください。

一般的な操作

バックアップと復元
# Logical backup (single database)
pg_dump -Fc dbname > backup.dump

# Restore
pg_restore -d dbname backup.dump

# Parallel backup (faster for large DBs)
pg_dump -Fc -j4 dbname > backup.dump

# Base backup for PITR
pg_basebackup -D /backup/base -Ft -Xs -P
バキュームとメンテナンス
-- Manual vacuum (reclaim space, update stats)
VACUUM (VERBOSE, ANALYZE) tablename;

-- Full vacuum (rewrites table, exclusive lock)
VACUUM FULL tablename;  -- CAUTION: locks table

-- Reindex without downtime
REINDEX INDEX CONCURRENTLY idx_name;

-- Update statistics only
ANALYZE tablename;
主要なメトリクスの監視
-- Slow queries (requires pg_stat_statements)
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;

-- Table bloat indicator
SELECT schemaname, relname, n_dead_tup, n_live_tup,
       round(n_dead_tup::numeric / NULLIF(n_live_tup, 0) * 100, 1) AS dead_pct
FROM pg_stat_user_tables WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;

-- Lock contention
SELECT pid, relation::regclass, mode, granted, query
FROM pg_locks JOIN pg_stat_activity USING (pid)
WHERE NOT granted;

-- Cache hit ratio (should be > 99%)
SELECT sum(heap_blks_hit) / NULLIF(sum(heap_blks_hit) + sum(heap_blks_read), 0) AS ratio
FROM pg_statio_user_tables;

詳細:WAL アーカイブ、PITR、自動バキュームの調整、コネクションプーリングについては、./references/operations.md を読み込んでください。

データ型のクイックリファレンス

型使用する場面例
JSONB半構造化データ、柔軟なスキーマ'{"tags": ["a","b"]}'::jsonb
ARRAY型が固定されたリストARRAY['a','b','c']
tsrange期間、スケジュール管理'[2024-01-01, 2024-12-31)'::tsrange
tsvector全文検索to_tsvector('english', body)
uuid分散 IDgen_random_uuid()
inet/cidrIP アドレス、ネットワーク'192.168.1.0/24'::cidr

詳細:正規化、制約、RLS、生成列、テーブル継承については、./references/schema-design.md を読み込んでください。

注意点とアンチパターン

間違い問題点修正方法
本番環境での SELECT *帯域幅を浪費し、カバリングインデックススキャンを妨げます列を明示的に列挙します
インデックス付き列に関数を適用する(WHERE UPPER(email) = ...)インデックスが使われなくなります式インデックスを作成します:CREATE INDEX ... ON (UPPER(email))
NULL を含む NOT IN (subquery)サブクエリに NULL が含まれると、行が1件も返されませんNOT EXISTS を使います
一括ロード後に ANALYZE を実行しないプランナーが古い行数推定を使いますANALYZE tablename を実行します
本番環境での VACUUM FULLテーブル全体に排他ロックがかかります定期的な VACUUM と pg_repack を使います
ORDER BY のない LIMIT結果が非決定的になります必ず ORDER BY と組み合わせます
大規模テーブルでのオフセットページネーション行をスキャンして破棄しますキーセットページネーションを使います:WHERE id > last_id
インデックスが多すぎる書き込みが遅くなり、領域を浪費しますpg_stat_user_indexes で監査します
共有接続プールが1つだけサービス間で競合が発生しますpgBouncer を使い、サービスごとにプールを用意します
default_transaction_isolation = serializableシリアライゼーションエラーが過剰に発生しますread committed を維持し、必要な箇所で明示的に SERIALIZABLE を使います

行レベルセキュリティ(RLS)のクイックスタート

-- Enable RLS on table
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;

-- Policy: users see only their own rows
CREATE POLICY user_isolation ON documents
    USING (owner_id = current_setting('app.current_user_id')::int);

-- Policy: admins see everything
CREATE POLICY admin_access ON documents
    USING (current_setting('app.role') = 'admin');

-- Set context per request (from app layer)
SET app.current_user_id = '42';
SET app.role = 'user';

全文検索のクイックスタート

-- Add search column
ALTER TABLE articles ADD COLUMN search_vector tsvector
    GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;

-- Index it
CREATE INDEX idx_articles_fts ON articles USING gin(search_vector);

-- Search with ranking
SELECT title, ts_rank(search_vector, query) AS rank
FROM articles, to_tsquery('english', 'database & optimization') AS query
WHERE search_vector @@ query
ORDER BY rank DESC;

LISTEN/NOTIFY

-- Publisher
NOTIFY order_events, '{"order_id": 123, "status": "shipped"}';

-- Subscriber (in psql or app)
LISTEN order_events;

-- Check for notifications (app code)
-- Python: conn.poll(); conn.notifies
-- Node: client.on('notification', callback)

参考ファイル

詳細なトピックについては、これらを読み込んでください。各ファイルは単独で完結しています。

参考資料読み込むタイミング
./references/schema-design.mdテーブルの設計、型の選択、制約、RLS ポリシー、JSONB のモデリング
./references/indexing.mdインデックスの種類、複合/部分/式インデックスの選択、インデックスのメンテナンス
./references/query-tuning.mdEXPLAIN プランの読み方、pg_stat_statements、特定のクエリパターンの最適化
./references/operations.mdバックアップ/復元、WAL/PITR、VACUUM のチューニング、モニタリング、接続プーリング
./references/replication.mdストリーミング/論理レプリケーション、フェイルオーバー、パーティショニング、FDW
./references/config-tuning.mdpostgresql.conf の設定、OLTP/OLAP プロファイル、拡張機能のセットアップ

関連項目

  • sql-ops - ベンダーに依存しない SQL パターン(CTE、ウィンドウ関数、JOIN)
  • sqlite-ops - SQLite 固有のパターンと操作
  • python-database-ops - SQLAlchemy ORM と非同期データベースのパターン

コメント