変更要約: 初版(主題S2・S2.1〜S2.5)
2.5基本的な運用管理
サーバーの起動・停止、データベースロール/ユーザーのCREATE・ALTER・DROP(ROLE/USER)、テーブルの肥大化と統計を管理するVACUUM・ANALYZE、それを自動化するautovacuum、稼働状況を返すシステム情報関数、メタデータを提供するinformation_schemaとpg_catalog(システムカタログ)、そして権限管理のGRANT・REVOKEを押さえます。
サーバーを起動させた後の日々の運用では、「誰が何にアクセスできるか」を管理するロール・権限の仕組みと、「肥大化したテーブルの健全性を保つ」ためのVACUUM系のメンテナンスが両輪になります。加えて、現在の状態を調べるための情報源(システムカタログ)を知っておくことが、トラブルシュートの土台になります。
2.5.1ロール/ユーザーと権限管理
- データベースロール=PostgreSQLにおける接続主体(従来の「ユーザー」と「グループ」を統合した概念)。CREATE ROLE(作成。
LOGIN属性を付けると接続可能=実質的な「ユーザー」になる)・ALTER ROLE(属性やパスワード等の変更)・DROP ROLE(削除)。CREATE USERはLOGIN属性が既定で付いたCREATE ROLEの別名(エイリアス)に過ぎません。 - ロールの主な属性は
CREATE ROLE/ALTER ROLEで指定する:LOGIN/NOLOGIN(接続可否)・SUPERUSER(全権)・CREATEDB(DB作成可)・PASSWORD(パスワード)・VALID UNTIL '日時'(パスワードの有効期限。例ALTER ROLE app VALID UNTIL '2025-12-31')。最小権限の原則で、アプリ用ロールには不要なSUPERUSER/CREATEDBを付けないのが定石。 - GRANT=テーブル等のオブジェクトに対する権限(
SELECT・INSERT・UPDATE・DELETE等)をロールへ付与するSQL文。REVOKE=付与済みの権限を取り消すSQL文。オブジェクト所有者またはスーパーユーザーが実行できます。
2.5.2VACUUM・ANALYZE・autovacuum
- VACUUM=更新・削除で発生した不要領域(デッドタプル)を回収し、テーブルの肥大化を抑えるメンテナンスコマンド。プランナが使う統計情報の更新は行いません。
VACUUM FULLはテーブルを排他ロックして物理的に圧縮する重い処理です。ANALYZE=クエリプランナ用の統計情報を更新するコマンド(領域回収はしない)。VACUUM ANALYZEのように両方を同時に実行することも一般的です。 - autovacuum=更新・削除の量がしきい値を超えたテーブルに対して、VACUUMとANALYZEを自動的にバックグラウンド実行する仕組み(既定で有効)。手動での実行忘れによるテーブル肥大化を防ぐ、実運用上の生命線です。
2.5.3システム情報関数とシステムカタログ
- システム情報関数=現在の接続・サーバー状態を返すSQL関数群(例:
current_user=現在の接続ロール名、current_database=接続中のデータベース名、version()=サーバーのバージョン文字列)。 - information_schema=SQL標準に準拠したメタデータのビュー群(テーブル・カラム・制約等の情報を標準的な形で提供、他RDBMSとの互換性が高い)。pg_catalog(システムカタログ)=PostgreSQL固有の内部メタデータテーブル群(
pg_class・pg_attribute等)で、より詳細で実装依存の情報を持ちます。psqlのメタコマンド(\d等)は内部的にこのシステムカタログを問い合わせています。
「CREATE USERはLOGIN付きCREATE ROLEの別名」「VACUUMは領域回収・ANALYZEは統計更新(別機能)」「autovacuumはしきい値超過で自動実行」「GRANTは権限付与・REVOKEは取消」「information_schemaはSQL標準準拠・pg_catalogはPostgreSQL固有」が最頻出です。VACUUMとANALYZEの役割の違い(片方だけでは不十分な場面がある)は繰り返し狙われます。
新しいアプリケーション用のロールを作り、権限を絞って運用する一連の流れを見てみましょう。まずCREATE ROLE app_reader LOGIN PASSWORD '...';のように接続可能なロールを作成します(CREATE USER app_reader ...と書いても実質同じ結果です)。次に、このロールには読み取り専用の業務だけを許可したいので、GRANT SELECT ON orders TO app_reader;のように必要な権限だけを個別に付与します。誤って広い権限を与えてしまった場合はREVOKE INSERT ON orders FROM app_reader;のように該当分だけ取り消せば、他の権限には影響しません。しばらく運用したのち、「特定のテーブルへの検索が遅くなった」という相談が来たとします。原因調査の第一歩は、プランナが古い統計情報を使っていないかを疑うことです。大量の更新・削除の後はANALYZE orders;で統計を更新し、それでも改善しない場合は、デッドタプルが溜まって物理的に肥大化している可能性があるためVACUUM orders;(領域回収)も検討します。通常はこの両方をautovacuumが自動で実行してくれるため手動介入は不要ですが、大規模な一括更新の直後など即座に反映させたい場面では手動でのVACUUM ANALYZEが有効です。最後に、このテーブルの列定義や制約を他のツールから標準的な方法で参照したいならinformation_schema(例:information_schema.columns)を、PostgreSQL固有の内部情報(テーブルの物理ページ数等)まで踏み込みたいならpg_catalog(例:pg_class)を使う、という切り分けが実務の判断基準になります。
| コマンド/仕組み | 対象 | 役割 |
|---|---|---|
| VACUUM | 不要領域 | デッドタプルを回収 |
| ANALYZE | 統計情報 | プランナ用統計を更新 |
| autovacuum | 両方を自動化 | しきい値超過で自動実行 |
| GRANT / REVOKE | 権限 | 付与 / 取消 |
ひっかけ: 「VACUUMを実行すればクエリプランナの統計情報も更新される」は誤りです。VACUUMはデッドタプルの回収のみが役割で、統計情報の更新は別コマンドのANALYZEが担当します(両方必要ならVACUUM ANALYZE)。また「CREATE USERとCREATE ROLEは全く別の機能」も誤り=CREATE USERはLOGIN属性付きCREATE ROLEの別名に過ぎません。「information_schemaの方がpg_catalogより詳細な内部情報を持つ」も誤り=より詳細・実装依存なのはpg_catalogで、information_schemaはSQL標準準拠の標準的な情報にとどまります。
2.5.4この節のまとめ
- データベースロール:CREATE/ALTER/DROP ROLE、CREATE USER=LOGIN付きCREATE ROLEの別名。GRANT=権限付与・REVOKE=権限取消
- VACUUM=デッドタプル回収(統計は更新しない)・ANALYZE=統計更新(領域回収はしない)・autovacuum=両方を自動化
- システム情報関数(current_user等)/information_schema=SQL標準準拠・pg_catalog=PostgreSQL固有の詳細情報
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 大量の更新処理の後、特定テーブルへの検索クエリが以前より遅くなった。原因調査でまず疑うべきは、プランナが古い統計情報を使っている可能性である。これを解消するために実行すべきコマンドは?
Q2. アプリケーション用に新しいロールを作成し、特定のテーブルへの参照(SELECT)だけを許可したい。過剰な権限を与えないための正しい手順は?
Q3. テーブルの列定義や制約を、PostgreSQL固有の実装ではなくSQL標準に準拠した標準的な形で他ツールから参照したい。参照すべき情報源は?

