はじめに - アシスト

はじめに
■セミナー概要と目的
PostgreSQL を使用した開発や運用管理を行うには、PostgreSQL データベースの内部構造・特徴を正しく理解
することが重要です。本セミナーでは、PostgreSQL のアーキテクチャ全般、データベースの運用管理のポイ
ント、チューニング手法について解説します。
■受講対象者
データベース管理者、PostgreSQL を使用したアプリケーション開発を行う方。
■前提条件
リレーショナル・データベースに関する基本的な知識を有する方。
■PostgreSQL のバージョンについて
本テキスト内容は、PostgreSQL v9.0 がベースとなっています。
■テキスト内の記述について
マーク
NOTE
参照
知っておいたほうが良いテクニック、もしくは注意事項
参照ページ
■テキストで使用している表について
検証環境で使用した以下の表を使用しています。
log_master表
emp表
empno
empname
emp_password
integer
logno
integer
char(45)
compno
integer
char(45)
custno
integer
productno
integer
errorno
integer
start_date
timestamp
log_body表
logno
integer
end_data
timestamp
logbodyno
integer
status
char(2)
log_text
text
message
char(210)
CONTENTS
第1章 PostgreSQL アーキテクチャ
1.PostgreSQL の基本アーキテクチャ--------------------
1-1
2.データベースクラスタ------------------------------
1-3
3.プロセス------------------------------------------
1-5
4.SQL 実行とメモリ領域-------------------------------
1-7
5.オブジェクトの内部構造----------------------------
1-9
6.ユーザとスキーマ----------------------------------
1-11
7.トランザクションと同時実行制御--------------------
1-13
8.追記型アーキテクチャと VACUUM----------------------
1-17
第2章 データベース管理の基本
1.データベース管理者--------------------------------
2-1
2.データベースの起動と停止--------------------------
2-2
3.パラメータの設定----------------------------------
2-3
4.データベース管理ユーザ----------------------------
2-5
5.ロール--------------------------------------------
2-7
6.オブジェクト権限----------------------------------
2-9
7.クライアント認証----------------------------------
2-11
第3章 データベースの監視
1.データベースの監視手段----------------------------
3-1
2.ユーザセッションの監視----------------------------
3-5
CONTENTS
第4章 データベースオブジェクトの管理
1.テーブルスペース機能の利用---------------------------
4-1
2.表の作成とデータ管理---------------------------------
4-3
3.表の管理---------------------------------------------
4-11
4.索引の作成と管理-------------------------------------
4-25
第5章 バックアップ・リカバリ基礎
1.バックアップ・リカバリ概要---------------------------
5-1
2.障害の種類-------------------------------------------
5-3
3.変更履歴と WAL ファイル管理---------------------------
5-7
4.アーカイブファイルとメディア・リカバリ---------------
5-9
5.オンライン・バックアップの取得-----------------------
5-11
6.オンライン・バックアップからのリカバリ---------------
5-13
7.オフライン・バックアップとリカバリ-------------------
5-19
8.論理バックアップとリカバリ---------------------------
5-21
第6章 SQL チューニング
1.SQL チューニングの概要--------------------------------
6-1
2.SQL の処理ステップ------------------------------------
6-3
3.スキャン方式-----------------------------------------
6-5
4.結合方式---------------------------------------------
6-9
5.実行時間の長い SQL の確認-----------------------------
6-15
6.実行計画の確認---------------------------------------
6-17
7.統計情報---------------------------------------------
6-21
8.実行計画の調整---------------------------------------
6-23
CONTENTS
第7章 データベースチューニング
1.データベースチューニング概要----------------------
7-1
2.データベースの状態の確認--------------------------
7-3
3.共有バッファに関するチューニング------------------
7-9
4.WAL バッファに関するチューニング-------------------
7-11
5.チェックポイントに関するチューニング--------------
7-13
6.Writer プロセスに関するチューニング----------------
7-15
7.ワークメモリに関するチューニング------------------
7-17
8.VACUUM に関するチューニング------------------------
7-19
付録
1.データベースクラスタ------------------------------
付-1
2.pg_hba.conf ファイルの設定-------------------------
付-2
3.データベースの起動・停止(pg_ctl コマンド)---------
付-3
4.SQL コマンド---------------------------------------
付-5
5.システムカタログ----------------------------------
付-14
6.実行時統計情報------------------------------------
付-17
7.計画タイプの種類----------------------------------
付-20
8.ビットマップ・スキャン----------------------------
付-21
9.ユーティリティ------------------------------------
付-23
参考資料 PostgreSQL データベース動作検証
1.動作検証の概要------------------------------------
参-1
2.動作検証環境--------------------------------------
参-2
3.RDBMS としての基本性能評価-------------------------
参-7
4.PostgreSQL 固有機能が関係する性能評価--------------
参-13
第 2 章「データベース管理の基本」
第2章
データベース管理の基本
この章では、PostgreSQL データベース管理について解説します。
1.データベース管理者
2.データベースの起動と停止
3.パラメータの設定
4.データベース管理ユーザ
5.ロール
6.オブジェクト権限
7.クライアント認証
株式会社アシスト
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
第 2 章「データベース管理の基本」
1. データベース管理者
(1) データベース管理者とは
昨今、PostgreSQL は、企業システムにおいても重要な役割を担うデータベースとして利用されるようになって
きました。データベース管理者(DBA:Database Administrator)は、データベースの設計・インストールとい
った導入段階から、運用開始後の管理・保守までを幅広く担当します。
(2) データベース管理者の作業
データベース管理者の作業内容は、
「導入まで」と「運用開始後」に大別されますが、中でも運用開始後の管理作
業が重要かつ責任重大な業務です。なぜなら、インストールなどの導入作業は基本的に一度で終わりますが、
データベース運用中は新規の表作成やデータの増減など、常に状態が変化するため、その時々のデータベース
状態を監視し、効率的に運用できるよう運用管理作業を継続的に行う必要があるためです。
運用中は、データ格納領域やリソースなどの余裕があるかどうかを定期的に監視し、問題がある場合は迅速な
対処が求められます。例えば、データ格納領域が一杯になってしまうと表へのデータ追加などができなくなり、
処理が停止してしまいます。データベース管理者は、そのような問題が発生する前に、監視によって兆候をつか
み、適切な対応を行う必要があります。
また、最適なパフォーマンスを維持しデータベースを安定稼動できるように、表・索引の再作成などの定期メ
ンテナンス作業も必要です。
株式会社アシスト
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
2-1
第 2 章「データベース管理の基本」
2. データベースの起動と停止
通常、データベースはユーザからのアクセスを受け付けるために起動されている状態ですが、管理作業によっては
データベースを停止し、メンテナンスを行う場合があります。
pg_ctl コマンドを使用しデータベースの起動・停止を行います。
例)データベースを起動する。
[p900@pg01 ~]$ pg_ctl start
server starting
/* サーバログの出力を確認する */
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
/* PostgreSQL のプロセスが起動されていることを確認する */
[p900@pg01 ~]$ ps -edf | grep post
p900
17274
1 0 13:33 pts/6
00:00:00 /home/p900/postgre_home/bin/postgres
p900
17276 17274 0 13:33 ?
00:00:00 postgres: logger process
p900
17278 17274 0 13:33 ?
00:00:00 postgres: writer process
p900
17279 17274 0 13:33 ?
00:00:00 postgres: wal writer process
p900
17280 17274 0 13:33 ?
00:00:00 postgres: autovacuum launcher process
p900
17281 17274 0 13:33 ?
00:00:00 postgres: archiver process
p900
17282 17274 0 13:33 ?
00:00:00 postgres: stats collector process
例)データベースを停止する。
[p900@pg01 ~]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
/* サーバログの出力を確認する */
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down
参照
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
「 pg_ctl 」 ( 付 -3)
株式会社アシスト
2-2
第 2 章「データベース管理の基本」
3. パラメータの設定
PostgreSQL のパラメータは、以下のようなデータベースシステム構成を設定するものであり、データベース起動時
に読み込まれ、設定値が有効になります。
・データベース構成の設定(サーバログやアーカイブファイルの位置など)
・共有メモリ構成の設定(共有バッファ、WAL バッファのサイズなど)
運用中は、パフォーマンス改善など、必要に応じてパラメータを変更します。データベース稼働中に値を変更できる
かはパラメータによって異なります。
(1) パラメータの確認
各パラメータの詳細を確認するには、SHOW コマンドもしくは pg_settings ビューを使用します。pg_settings
ビューでは、パラメータの値や設定可能な最小値・最大値などの詳細情報が確認できます。
SHOW パラメータ名
SHOW ALL
例)SHOW コマンドを利用して共有バッファのサイズを確認する
postgres=# SHOW shared_buffers;
shared_buffers
---------------256MB
例)pg_settings を利用して shared_で始まるパラメータの詳細を確認する
postgres=# SELECT name,setting FROM pg_settings WHERE name like 'shared_%';
name
|
setting
--------------------------+-------------------shared_buffers
| 32768
shared_preload_libraries | pg_stat_statements
参照
株式会社アシスト
「 pg_settings ビ ュ ー 」 ( 付 -16)
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
2-3
第 2 章「データベース管理の基本」
(2) パラメータ・ファイル
パラメータの設定は、postgresql.conf と呼ばれるパラメータファイルに記録されています。データベースを
起動すると、postgresql.conf のパラメータが読み込まれます。
読み込み
pg_ctl start
共有メモリ
パラメータ
データベース起動時に
postgresql.conf の パ ラ
メータが読み込まれる。
データベース
postgresql.conf
(3) パラメータの変更
データベース稼動中に値を変更できるパラメータに関しては、データベース全体で変更を有効にする ALTER
DATABASE 文、特定ユーザの接続のみ影響する ALTER USER 文、また特定セッションやトランザクションのみ値
を変更したい場合は、SET コマンドを使用します。
■データベース全体で値の変更を有効
/* postgres データベースでシーケンシャル・スキャンを無効に設定する */
postgres#= ALTER DATABASE postgres SET enable_seqscan = off;
ALTER DATABASE
■特定ユーザの接続時のみ値の変更を有効
/* user1 ユーザに対してシーケンシャル・スキャンを無効に設定する */
postgres#= ALTER USER user1 SET enable_seqscan = off;
ALTER ROLE
■特定セッションやトランザクションのみ値の変更を有効
/* トランザクションに対してシーケンシャル・スキャンを無効に設定する */
postgres=# SET LOCAL enable_seqscan=off;
SET
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
参照
「 ALTER DATABASE SET 」 ( 付 -5)
参照
「 ALTER USER SET 」 ( 付 -5)
参照
「 SET 」 ( 付 -13)
株式会社アシスト
2-4
第 2 章「データベース管理の基本」
4. データベース管理ユーザ
データベース管理者は、データベース管理ユーザでデータベースにログインし、様々な管理作業を行います。
PostgreSQL では、initdb コマンドでデータベースクラスタ作成した OS ユーザと同じ名前のスーパーユーザが自動
的に作成されます。スーパーユーザは、データベースクラスタにおける全ての権限を持ちます。
データベースやユーザ作成などの一般的なデータベース管理作業は、該当する権限を付与されたユーザで行います
バックアップ・リカバリは特別な管理作業のため、スーパーユーザで行います。
■管理作業と必要な権限
管理カテゴリ
管理作業
特別管理作業
株式会社アシスト
主な管理作業
必要権限
ユーザ管理
CREATE ROLE
データベース作成
CREATE DB
データベースクラスタのオンラインバックアップ
データベースクラスタのリカバリ
SUPERUSER
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
2-5
第 2 章「データベース管理の基本」
■管理作業と権限
特別管理作業
・バックアップ
・リカバリ
バックアップ・リカバリなどの特別
な 管 理 作 業 を 行 な う 場 合 は 、特 別 な 管
理権限が付与されたスーパーユーザ
でログインする必要がある。
管理作業
・一般ユーザの作成
・権限やロールの付与
・ユーザデータベース
の作成
CREATEROLE 、 CREATEDB 権 限 付 与 が さ
れているユーザでログインする必要
がある。
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
株式会社アシスト
2-6
第 2 章「データベース管理の基本」
5. ロール
PostgreSQL では、ロールという概念でデータベース全体の権限を管理しています。
ロールの作成は、CREATE ROLE 文を使用します。ロールには、LOGIN、SUPERUSER、CREATEDB、CREATEROLE 属性があり、属
性によってユーザロールもしくはグループロールとみなすことができます。
(1) ユーザロール
ユーザロールとは、LOGIN 属性が与えられたロールを指し、ユーザとしてデータベースにログインし、表や索引
などのオブジェクトを作成、所有します。
(2) グループロール
グループロールとは、LOGIN 以外の属性やオブジェクト権限を含むロールを指します。作成したグループロー
ルにユーザロールをメンバーとして含めることができ、グループ単位でのユーザ管理が可能です。
例)ユーザロールを作成する
/* パスワード付きログイン権限を持つユーザロール user1 を作成する */
postgres=# CREATE ROLE user1 WITH LOGIN PASSWORD 'pwd1';
CREATE ROLE
postgres=# SELECT rolname,rolcanlogin,rolsuper,rolcreatedb,rolcreaterole FROM pg_roles
WHERE rolname='user1';
rolname | rolcanlogin | rolsuper | rolcreatedb | rolcreaterole
---------+-------------+----------+-------------+--------------user1
| t
| f
| f
| f
LOGIN 属 性 を 保 持 し て い る こ と が 分 か る
例)グループロールを作成する
/* グループロール group1 を作成する */
postgres=# CREATE ROLE group1;
CREATE ROLE
postgres=# SELECT rolname,rolcanlogin,rolsuper,rolcreatedb,rolcreaterole FROM pg_roles
WHERE rolname='group1';
rolname | rolcanlogin | rolsuper | rolcreatedb | rolcreaterole
---------+-------------+----------+-------------+--------------属性を何も保持していないことが
group1 | f
| f
| f
| f
分かる
/* user1 の表 A に対する SELECT 権限を付与し、グループロール group1 に user2 をメンバーとして
/* 含める
postgres=# GRANT SELECT ON 表 A TO group1;
GRANT
postgres=# GRANT group1 TO user2;
GRANT ROLE
参照
株式会社アシスト
「 CRATE ROLE 」 ( 付 -8)
参照
*/
*/
「 pg_roles ビ ュ ー 」 ( 付 -15)
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
2-7
第 2 章「データベース管理の基本」
■ユーザロール
スーパーユーザまたは
CREATE ROLE 権 限 を 持 つ ユ ー ザ
postgres
①
ユ ー ザ 名 : USER1
パ ス ワ ー ド : xxxx
②
ログイン権限
PostgreSQL
データベース
① ユ ー ザ ロ ー ル USER1 を 作 成 す る 。
② USER1 で デ ー タ ベ ー ス へ 接 続 す る 。
■グループロール
スーパーユーザまたは
CREATE ROLE 権 限 を 持 つ ユ ー ザ
postgres
グ ル ー プ ロ ー ル group1
①
オブジェクト権限:
SELECT ON 表 A
②
グ ル ー プ ロ ー ル group1
③
ユ ー ザ 名 : USER2
パ ス ワ ー ド : xxxx
PostgreSQL
データベース
ログイン権限
① グ ル ー プ ロ ー ル group1 を 作 成 す る 。
② USER1 が 所 有 す る 表 A に 対 す る SELECT 権 限 を 付 与 し 、 グ ル ー プ ロ ー ル group1 に
USER2 を メ ン バ ー と し て 含 め る 。
③ USER2 で デ ー タ ベ ー ス へ 接 続 し 、 表 A を 検 索 す る 。
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
株式会社アシスト
2-8
第 2 章「データベース管理の基本」
6. オブジェクト権限
表、索引などのオブジェクトを所有するユーザロールは、そのオブジェクトに対する全ての権限を持ちます。
他のユーザロールがオブジェクトにアクセスするには、所有するユーザロールが権限を与えておく必要があります
オブジェクトを変更、削除する権限はオブジェクト所有ユーザロールから削除することはできません。他のユーザ
ロールに権限を付与/削除するには、GRANT/REVOKE コマンドで行います。また、スーパーユーザは常にオブジェクト
所有ユーザロールと同様にアクセスが可能です。オブジェクト権限の付与は psql の\z コマンドで確認できます。
例)p900 ユーザの log_body 表に対する権限を付与する
/* p900 ユーザの log_body 表に対する SELECT 権限を user1 ユーザに付与する */
postgres=# GRANT SELECT ON log_body TO user1;
GRANT
/* p900 ユーザの log_body 表に対する INSERT 権限を全ユーザに付与する */
postgres=# GRANT INSERT ON log_body TO PUBLIC;
GRANT
/* \z コマンドで権限付与を確認する */
postgres=# \z log_body
Access privileges
Schema |
Name
| Type | Access privileges | Column access privileges
--------+----------+-------+-------------------+-------------------------public | log_body | table | p900=arwdDxt/p900 |
: user1=r/p900
: =a/p900
ユーザ名 = オブジェクト権限 / ユーザ名
( 権限を付与されたユーザ) ( 権限を付与したユーザ)
上記の例では、
p900 ユ ー ザ は 、 arwdDxt の 権 限 を 所 有 し 、
user1 ユ ー ザ は 、 p900 ユ ー ザ か ら r(SELECT) 権 限 を 付 与 さ れ て い る
ま た 、 デ ー タ ベ ー ス の 全 ユ ー ザ は 、 p900 ユ ー ザ か ら a(INSERT) 権 限 を 付 与 さ れ て い る
ことを表している。
参照
「 GRANT/REVOKE 」 ( 付 -8)
■\z コマンドで表示される項目
r=SELECT
t=TRIGGER
w=UPDATE
X=EXECUTE
a=INSERT
U=USAGE
d=DELETE
C=CREATE
D=TRUNCATE
c=CONNECT
x=REFERENCES
T=TEMPORARY
株式会社アシスト
Copyright(C) 2010 K.K. Ashisuto All Rights Reserved.
2-9
アシスト発!ここまで使える PostgreSQL 解説
第2版
2011 年 6 月
当社の文書による許可なしに、本誌の一部または全部を複製することはお断りします。
また、本誌に記載された内容については、予告なしに変更することがありますので、ご了承ください。
株式会社アシストは、本書および本書に付属する資料についてその記載内容に誤りがないこと、および特定目的
に対する適合性に関するいっさいの保証を行うものではありません。
また、本資料を使用したことによって被った直接的、間接的な損害などについて、いかなる場合においても責任
を負いかねます。
発売元 株式会社