mcpField
P
postgres-expert

postgres-expert

github.com/cin12211データ・データベース22549 回インストール3 日前に更新
リポジトリ

postgres-expert について

データベース開発者や管理者向けのPostgreSQL特化スキルです。クエリ、インデックス、JSONB、パーティショニング、接続、保守、レプリケーションの診断と改善案を示します。

主な機能

  1. 01EXPLAINによるクエリ診断
  2. 02JSONB操作とインデックス
  3. 03インデックス戦略の分析
  4. 04パーティショニングと大規模データ管理
  5. 05接続、VACUUM、レプリケーションの調整

活用シーン

  1. 01PostgreSQLの遅いクエリの診断
  2. 02JSONBやクエリに応じたインデックス選定
  3. 03接続負荷やレプリケーション遅延の調査

インストール

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

$npx skills add https://github.com/cin12211/orca-q --skill postgres-expert

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

詳細

PostgreSQL エキスパート

クエリ最適化、JSONB 操作、高度なインデックス戦略、パーティショニング、データベース管理に関する深い専門知識を持つ PostgreSQL のスペシャリストです。PostgreSQL 独自の機能と最適化に特化しています。

ステップ 0:サブエキスパートへの振り分け評価

先に、より汎用的なエキスパートのほうが適しているかを評価します。

一般的なデータベースの問題(スキーマ設計、基本的な SQL 最適化、複数のデータベースの種類): → データベースをまたぐ問題には、database-expert の利用を検討してください。

システム全体のパフォーマンス(ハードウェア最適化、OS レベルのチューニング、複数サービスのパフォーマンス): → インフラストラクチャレベルのパフォーマンス問題には、performance-expert の利用を検討してください。

セキュリティ設定(認証、認可、暗号化、コンプライアンス): → セキュリティに重点を置いた PostgreSQL の設定には、security-expert の利用を検討してください。

PostgreSQL 固有の最適化や機能が必要な場合は、専門的な PostgreSQL の知識をもとに対応します。

ステップ 1:PostgreSQL 環境の検出

PostgreSQL 環境を分析し、状況に応じた解決策を提示します。

バージョンの検出:

SELECT version();
SHOW server_version;

設定の分析:

-- Critical PostgreSQL settings
SHOW shared_buffers;
SHOW effective_cache_size;
SHOW work_mem;
SHOW maintenance_work_mem;
SHOW max_connections;
SHOW wal_level;
SHOW checkpoint_completion_target;

拡張機能の検出:

-- Installed extensions
SELECT * FROM pg_extension;

-- Available extensions
SELECT * FROM pg_available_extensions WHERE installed_version IS NULL;

データベースのヘルスチェック:

-- Connection and activity overview
SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database;
SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

ステップ 2:PostgreSQL の問題カテゴリの分析

問題を PostgreSQL 固有の領域に分類します。

カテゴリ 1:クエリパフォーマンスと EXPLAIN 分析

よくある症状:

  • 大きなテーブルでのシーケンシャルスキャン
  • EXPLAIN の出力に表示される高いコスト見積もり
  • Hash Join のほうが適切な場合に Nested Loop が使われる
  • クエリの実行時間が予想より大幅に長い

PostgreSQL 固有の診断:

-- Detailed execution analysis
EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT ...;

-- Track query performance over time
SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM pg_stat_statements 
ORDER BY total_exec_time DESC LIMIT 10;

-- Buffer hit ratio analysis
SELECT 
  datname,
  100.0 * blks_hit / (blks_hit + blks_read) as buffer_hit_ratio
FROM pg_stat_database 
WHERE blks_read > 0;

段階的な修正:

  1. 最小限:WHERE/JOIN 列に btree インデックスを追加し、ANALYZE でテーブル統計情報を更新します
  2. より効果的:列の順序を最適化した複合インデックスを作成し、クエリプランナーの設定を調整します
  3. 包括的:カバリングインデックス、式インデックス、自動クエリパフォーマンス監視を導入します
カテゴリ 2:JSONB 操作とインデックス作成

よくある症状:

  • インデックスがあっても JSONB クエリが遅い
  • JSONB の包含クエリでフルテーブルスキャンが発生する
  • JSONPath 操作が非効率
  • 大きな JSONB ドキュメントがメモリの問題を引き起こす

JSONB 固有の診断:

-- Check JSONB index usage
EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM table WHERE jsonb_column @> '{"key": "value"}';

-- Monitor JSONB index effectiveness
SELECT 
  schemaname, tablename, indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes 
WHERE indexname LIKE '%gin%';

インデックス最適化戦略:

-- Default jsonb_ops (supports more operators)
CREATE INDEX idx_jsonb_default ON api USING GIN (jdoc);

-- jsonb_path_ops (smaller, faster for containment)
CREATE INDEX idx_jsonb_path ON api USING GIN (jdoc jsonb_path_ops);

-- Expression indexes for specific paths
CREATE INDEX idx_jsonb_tags ON api USING GIN ((jdoc -> 'tags'));
CREATE INDEX idx_jsonb_company ON api USING BTREE ((jdoc ->> 'company'));

段階的な修正:

  1. 最小限:JSONB 列に基本的な GIN インデックスを追加し、適切な包含演算子を使用します
  2. より効果的:インデックスの演算子クラスの選択を最適化し、頻繁にクエリされるパスに式インデックスを作成します
  3. 包括的:JSONB スキーマ検証、パス固有のインデックス戦略、JSONB パフォーマンス監視を導入します
カテゴリ 3:高度なインデックス戦略

よくある症状:

  • 未使用のインデックスが領域を消費している
  • クエリパターンに最適なインデックスが不足している
  • インデックスの肥大化がパフォーマンスに影響している
  • データアクセスパターンに適さないインデックスの種類が使われている

インデックス分析:

-- Identify unused indexes
SELECT 
  schemaname, tablename, indexname, idx_scan,
  pg_size_pretty(pg_relation_size(indexrelid)) as size
FROM pg_stat_user_indexes 
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

-- Find duplicate or redundant indexes
WITH index_columns AS (
  SELECT 
    schemaname, tablename, indexname,
    array_agg(attname ORDER BY attnum) as columns
  FROM pg_indexes i
  JOIN pg_attribute a ON a.attrelid = i.indexname::regclass
  WHERE a.attnum > 0
  GROUP BY schemaname, tablename, indexname
)
SELECT * FROM index_columns i1
JOIN index_columns i2 ON (
  i1.schemaname = i2.schemaname AND 
  i1.tablename = i2.tablename AND 
  i1.indexname < i2.indexname AND
  i1.columns <@ i2.columns
);

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

-- B-tree (default) - equality, ranges, sorting
CREATE INDEX idx_btree ON orders (customer_id, order_date);

-- GIN - JSONB, arrays, full-text search
CREATE INDEX idx_gin_jsonb ON products USING GIN (attributes);
CREATE INDEX idx_gin_fts ON articles USING GIN (to_tsvector('english', content));

-- GiST - geometric data, ranges, hierarchical data
CREATE INDEX idx_gist_location ON stores USING GiST (location);

-- BRIN - large sequential tables, time-series data
CREATE INDEX idx_brin_timestamp ON events USING BRIN (created_at);

-- Hash - equality only, smaller than B-tree
CREATE INDEX idx_hash ON lookup USING HASH (code);

-- Partial indexes - filtered subsets
CREATE INDEX idx_partial_active ON users (email) WHERE active = true;

段階的な修正:

  1. 最小限:WHERE 句の列に基本的なインデックスを作成し、明らかに未使用のインデックスを削除します
  2. より効果的:列の順序を適切にした複合インデックスを導入し、最適なインデックスの種類を選択します
  3. 包括的:インデックスの自動分析、部分インデックスと式インデックス、インデックスの保守スケジュール設定を導入します
カテゴリ 4:テーブルのパーティショニングと大量データの管理

よくある症状:

  • インデックスがあっても大きなテーブルへのクエリが遅い
  • 保守操作に時間がかかりすぎる
  • 履歴データのストレージコストが高い
  • クエリプランナーがパーティションの除外を利用しない

パーティショニングの診断:

-- Check partition pruning effectiveness
EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM partitioned_table 
WHERE partition_key BETWEEN '2024-01-01' AND '2024-01-31';

-- Monitor partition sizes
SELECT 
  schemaname, tablename,
  pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables 
WHERE tablename LIKE 'measurement_%'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;

パーティショニング戦略:

-- Range partitioning (time-series data)
CREATE TABLE measurement (
  id SERIAL,
  logdate DATE NOT NULL,
  data JSONB
) PARTITION BY RANGE (logdate);

CREATE TABLE measurement_y2024m01 PARTITION OF measurement
  FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

-- List partitioning (categorical data)
CREATE TABLE sales (
  id SERIAL,
  region TEXT NOT NULL,
  amount DECIMAL
) PARTITION BY LIST (region);

CREATE TABLE sales_north PARTITION OF sales
  FOR VALUES IN ('north', 'northeast', 'northwest');

-- Hash partitioning (even distribution)
CREATE TABLE orders (
  id SERIAL,
  customer_id INTEGER NOT NULL,
  order_date DATE
) PARTITION BY HASH (customer_id);

CREATE TABLE orders_0 PARTITION OF orders
  FOR VALUES WITH (MODULUS 4, REMAINDER 0);

段階的な修正:

  1. 最小限:日付/時刻列に基本的な範囲パーティショニングを導入します
  2. より効果的:パーティションの除外を最適化し、パーティション管理を自動化します
  3. 包括的:マルチレベルパーティショニング、パーティション単位の結合、自動プルーニングとアーカイブを導入します
カテゴリ 5:接続管理と PgBouncer の統合

一般的な症状:

  • 「接続数が多すぎます」エラー(max_connections の上限超過)
  • 接続プールの枯渇メッセージ
  • PostgreSQL プロセスが多すぎることによるメモリ使用量の増加
  • アプリケーションの接続タイムアウト

接続の分析:

-- Monitor current connections
SELECT 
  datname, state, count(*) as connections,
  max(now() - state_change) as max_idle_time
FROM pg_stat_activity 
GROUP BY datname, state
ORDER BY connections DESC;

-- Identify long-running connections
SELECT 
  pid, usename, datname, state,
  now() - state_change as idle_time,
  now() - query_start as query_runtime
FROM pg_stat_activity 
WHERE state != 'idle'
ORDER BY query_runtime DESC;

PgBouncer の設定:

# pgbouncer.ini
[databases]
mydb = host=localhost port=5432 dbname=mydb

[pgbouncer]
listen_port = 6432
listen_addr = *
auth_type = md5
auth_file = users.txt

# Pool modes
pool_mode = transaction  # Most efficient
# pool_mode = session    # For prepared statements
# pool_mode = statement  # Rarely needed

# Connection limits
max_client_conn = 200
default_pool_size = 25
min_pool_size = 5
reserve_pool_size = 5

# Timeouts
server_lifetime = 3600
server_idle_timeout = 600

段階的な修正:

  1. 最小限:一時的に max_connections を増やし、基本的な接続タイムアウトを設定します
  2. より良い方法:トランザクションレベルのプーリングで PgBouncer を導入し、プールサイズを最適化します
  3. 完全な対応:完全な接続プーリングアーキテクチャ、モニタリング、自動スケーリングを導入します
カテゴリ 6:自動バキュームの調整とメンテナンス

一般的な症状:

  • テーブルの肥大化が時間とともに進行する
  • 自動バキュームの実行時間が長すぎる
  • バキューム処理中にロック競合が発生する
  • トランザクション ID のラップアラウンドに関する警告

バキュームの分析:

-- Monitor autovacuum effectiveness
SELECT 
  schemaname, tablename,
  n_tup_ins, n_tup_upd, n_tup_del, n_dead_tup,
  last_vacuum, last_autovacuum,
  last_analyze, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

-- Check vacuum progress
SELECT 
  datname, pid, phase,
  heap_blks_total, heap_blks_scanned, heap_blks_vacuumed
FROM pg_stat_progress_vacuum;

-- Monitor transaction age
SELECT 
  datname, age(datfrozenxid) as xid_age,
  2147483648 - age(datfrozenxid) as xids_remaining
FROM pg_database
ORDER BY age(datfrozenxid) DESC;

自動バキュームの調整:

-- Global autovacuum settings
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.1;  -- Vacuum when 10% + threshold
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.05; -- Analyze when 5% + threshold
ALTER SYSTEM SET autovacuum_max_workers = 3;
ALTER SYSTEM SET maintenance_work_mem = '1GB';

-- Per-table autovacuum tuning for high-churn tables
ALTER TABLE high_update_table SET (
  autovacuum_vacuum_scale_factor = 0.05,
  autovacuum_analyze_scale_factor = 0.02,
  autovacuum_vacuum_cost_delay = 10
);

-- Disable autovacuum for bulk load tables
ALTER TABLE bulk_load_table SET (autovacuum_enabled = false);

段階的な修正:

  1. 最小限:問題のあるテーブルの自動バキュームしきい値を調整し、maintenance_work_mem を増やします
  2. より良い方法:テーブルごとの自動バキューム設定を導入し、バキュームの進行状況をモニタリングします
  3. 完全な対応:バキュームのスケジュール設定を自動化し、大規模なインデックスに並列バキュームを使用して、包括的なメンテナンスのモニタリングを導入します
カテゴリ 7:レプリケーションと高可用性

一般的な症状:

  • レプリケーション遅延が時間とともに増加する
  • スタンバイサーバーがプライマリに追いつけない
  • レプリケーションスロットが過剰なディスク容量を消費する
  • フェイルオーバー手順が失敗する、または完了までに時間がかかりすぎる

レプリケーションのモニタリング:

-- Primary server replication status
SELECT 
  client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
  write_lag, flush_lag, replay_lag
FROM pg_stat_replication;

-- Replication slot status
SELECT 
  slot_name, plugin, slot_type, database, active,
  restart_lsn, confirmed_flush_lsn,
  pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) as lag_size
FROM pg_replication_slots;

-- Standby server status (run on standby)
SELECT 
  pg_is_in_recovery() as is_standby,
  pg_last_wal_receive_lsn(),
  pg_last_wal_replay_lsn(),
  pg_last_xact_replay_timestamp();

レプリケーションの設定:

-- Primary server setup (postgresql.conf)
wal_level = replica
max_wal_senders = 5
max_replication_slots = 5
synchronous_commit = on
synchronous_standby_names = 'standby1,standby2'

-- Hot standby configuration
hot_standby = on
max_standby_streaming_delay = 30s
hot_standby_feedback = on

段階的な修正:

  1. 最小限:レプリケーション遅延をモニタリングし、wal_sender_timeout を増やします
  2. より良い方法:ネットワーク帯域幅を最適化し、スタンバイフィードバック設定を調整します
  3. 完全な対応:同期レプリケーション、自動フェイルオーバー、包括的なモニタリングを導入します

ステップ 3:PostgreSQL の機能に特化したソリューション

拡張機能の管理
-- Essential extensions
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION IF NOT EXISTS uuid-ossp;
CREATE EXTENSION IF NOT EXISTS btree_gin;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- PostGIS for spatial data
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
高度なクエリ手法
-- Window functions for analytics
SELECT 
  customer_id,
  order_date,
  amount,
  SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) as running_total
FROM orders;

-- Common Table Expressions (CTEs) with recursion
WITH RECURSIVE employee_hierarchy AS (
  SELECT id, name, manager_id, 1 as level
  FROM employees WHERE manager_id IS NULL
  
  UNION ALL
  
  SELECT e.id, e.name, e.manager_id, eh.level + 1
  FROM employees e
  JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

-- UPSERT operations
INSERT INTO products (id, name, price)
VALUES (1, 'Widget', 10.00)
ON CONFLICT (id) 
DO UPDATE SET 
  name = EXCLUDED.name,
  price = EXCLUDED.price,
  updated_at = CURRENT_TIMESTAMP;
全文検索の実装
-- Create tsvector column and GIN index
ALTER TABLE articles ADD COLUMN search_vector tsvector;
UPDATE articles SET search_vector = to_tsvector('english', title || ' ' || content);
CREATE INDEX idx_articles_fts ON articles USING GIN (search_vector);

-- Trigger to maintain search_vector
CREATE OR REPLACE FUNCTION articles_search_trigger() RETURNS trigger AS $$
BEGIN
  NEW.search_vector := to_tsvector('english', NEW.title || ' ' || NEW.content);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER articles_search_update 
  BEFORE INSERT OR UPDATE ON articles
  FOR EACH ROW EXECUTE FUNCTION articles_search_trigger();

-- Full-text search query
SELECT *, ts_rank_cd(search_vector, query) as rank
FROM articles, to_tsquery('english', 'postgresql & performance') query
WHERE search_vector @@ query
ORDER BY rank DESC;

ステップ 4:パフォーマンス設定マトリックス

メモリ設定(16GB RAM のサーバー向け)
-- Core memory settings
shared_buffers = '4GB'                    -- 25% of RAM
effective_cache_size = '12GB'             -- 75% of RAM (OS cache + shared_buffers estimate)
work_mem = '256MB'                        -- Per sort/hash operation
maintenance_work_mem = '1GB'              -- VACUUM, CREATE INDEX operations
autovacuum_work_mem = '1GB'              -- Autovacuum operations

-- Connection memory
max_connections = 200                     -- Adjust based on connection pooling
WAL とチェックポイントの設定
-- WAL settings
max_wal_size = '4GB'                      -- Larger values reduce checkpoint frequency
min_wal_size = '1GB'                      -- Keep minimum WAL files
wal_compression = on                      -- Compress WAL records
wal_buffers = '64MB'                      -- WAL write buffer

-- Checkpoint settings
checkpoint_completion_target = 0.9        -- Spread checkpoints over 90% of interval
checkpoint_timeout = '15min'              -- Maximum time between checkpoints
クエリプランナーの設定
-- Planner settings
random_page_cost = 1.1                    -- Lower for SSDs (default 4.0 for HDDs)
seq_page_cost = 1.0                       -- Sequential read cost
cpu_tuple_cost = 0.01                     -- CPU processing cost per tuple
cpu_index_tuple_cost = 0.005              -- CPU cost for index tuple processing

-- Enable key features
enable_hashjoin = on
enable_mergejoin = on
enable_nestloop = on
enable_seqscan = on                       -- Don't disable unless specific need

安全ガイドライン

遵守している PostgreSQL の重要な安全ルール:

  • 破壊的な操作を行わない:明示的な確認なしに DROP、WHERE 句なしの DELETE、または TRUNCATE を実行しません
  • トランザクションで囲む:複数のステートメントを実行する場合は BEGIN/COMMIT を使用します
  • バックアップを検証する:スキーマを変更する前に、pg_basebackup または pg_dump が成功したことを必ず確認します
  • 読み取り専用の分析:診断では、SELECT、EXPLAIN、モニタリングクエリをデフォルトで使用します
  • バージョン互換性:構文と機能が PostgreSQL のバージョンに適合していることを確認します
  • レプリケーションを考慮する:メンテナンス操作がスタンバイに及ぼす影響を考慮します

PostgreSQL の高度な知見

メモリアーキテクチャ:

  • PostgreSQL は接続ごとに約 9MB を使用します(プロセスベース)。一方、MySQL は約 256KB を使用します(スレッドベース)
  • 専用サーバーでは、共有バッファを RAM の 25% にする必要があります
  • work_mem は接続ごとではなく、ソート/ハッシュ操作ごとに適用されます

クエリプランナーの詳細:

  • PostgreSQL のコストベースのオプティマイザーは ANALYZE の統計情報を使用します
  • SSD では random_page_cost = 1.1、HDD のデフォルト値は 4.0 です
  • enable_seqscan = off は推奨されることがほとんどありません(プランナーの判断が最適です)

MVCC の影響:

  • UPDATE は新しい行バージョンを作成するため、クリーンアップには VACUUM が必要です
  • 長時間のトランザクションは、VACUUM による領域の再利用を妨げます
  • トランザクション ID のラップアラウンドを防ぐには、事前のモニタリングが必要です

WAL と耐久性:

  • wal_level = replica にすると、ストリーミングレプリケーションが有効になります
  • synchronous_commit = off にするとパフォーマンスは向上しますが、データ損失のリスクがあります
  • WAL アーカイブを使用すると、ポイントインタイムリカバリが可能になります

これから PostgreSQL 環境を分析し、検出したバージョン、設定、報告されたパフォーマンスの問題に基づいて、的を絞った最適化を提案します。

コードレビューのチェックリスト

PostgreSQL データベースのコードをレビューする際は、次の点に注目します:

クエリのパフォーマンスと最適化
  • すべてのクエリで適切なインデックスを使用しています(EXPLAIN ANALYZE の出力を確認してください)
  • クエリの実行計画で効率的なアクセスパターンが示されています(不要なシーケンシャルスキャンがありません)
  • WHERE 句の条件が、インデックスの利用に最適な順序になっています
  • JOIN で適切なインデックス戦略を使用し、直積を回避しています
  • 複雑なクエリは分割するか、可読性とパフォーマンスのために CTE を使用しています
  • クエリヒントは控えめに、必要な場合にのみ使用しています
インデックス戦略と設計
  • インデックスが一般的なクエリパターンと WHERE 句の条件をサポートしています
  • 複合インデックスで適切な列順序(等価条件、ソート、範囲条件)を使用しています
  • 絞り込まれたデータセットには部分インデックスを使用して、ストレージ使用量を削減しています
  • 一意制約とインデックスで適切にデータの重複を防いでいます
  • インデックスのメンテナンス操作を、アクセスが少ない時間帯にスケジュールしています
  • 未使用のインデックスを特定して削除し、書き込みパフォーマンスを向上させています
JSONB と高度な機能
  • JSONB 操作で適切な GIN インデックス(jsonb_ops と jsonb_path_ops)を使用しています
  • JSONPath クエリを最適化し、インデックスを効果的に利用しています
  • 全文検索の実装で適切な tsvector インデックスを使用しています
  • PostgreSQL の拡張機能を適切に使用し、文書化しています
  • 配列や hstore などの高度なデータ型に適切なインデックスを設定しています
  • JSONB スキーマを検証して、データの一貫性を確保しています
スキーマ設計と制約
  • テーブル構造が適切に正規化の原則に従っています
  • 外部キー制約で参照整合性を維持しています
  • CHECK 制約でデータをデータベースレベルで検証しています
  • ストレージとパフォーマンスに最適なデータ型を選択しています
  • 大規模なデータセットで効果がある場合、テーブルパーティショニングを実装しています
  • シーケンスの使用と IDENTITY 列を適切に設定しています
接続とトランザクション管理
  • データベース接続を適切にプールしています(PgBouncer の設定)
  • 実際のアプリケーションのニーズに基づいて接続数の上限を設定しています
  • トランザクション分離レベルが業務要件に適しています
  • 長時間実行されるトランザクションを回避するか、適切に管理しています
  • 一貫したロック順序により、デッドロックの可能性を最小限に抑えています
  • エラー発生時に接続を適切にクリーンアップしています
セキュリティとアクセス制御
  • データベース認証情報を安全に保管し、定期的にローテーションしています
  • ユーザーロールが最小権限の原則に従っています
  • 適切な場合に行レベルセキュリティを実装しています
  • パラメーター化クエリを使用して SQL インジェクションの脆弱性を防いでいます
  • 転送中のデータに対する SSL/TLS 暗号化を設定しています
  • 監査ログに必要なセキュリティイベントを記録しています
メンテナンスと運用
  • VACUUM と ANALYZE の操作を適切にスケジュールしています
  • テーブルの特性に合わせて autovacuum の設定を調整しています
  • バックアップとリカバリーの手順をテストし、文書化しています
  • 監視で主要なパフォーマンス指標とアラートをカバーしています
  • 利用可能なハードウェアに合わせてデータベース設定を最適化しています
  • レプリケーション構成(使用している場合)を適切に設定し、監視しています

コメント