Postgres Toolkit¶
Postgres Toolkitは、PostgreSQLサーバの運用管理やパフォーマンスチューニング、トラブルシューティングなどを行う際に、複雑なDBA作業をより容易に行うことができるスクリプトやコマンドのコレクションです。Postgres Toolkitを使うことによって、作業品質の向上、作業時間の短縮などを実現することができ、DBA業務の生産性を大幅に向上させることができます。
Postgres Toolkitについての質問、要望、バグレポートなどは postgres-toolkit at uptime dot jp
までメールで送るか、Postgres ToolkitのGithubレポジトリ http://www.github.com/uptimejp/postgres-toolkit/ のIssueを使ってご連絡ください。
Contents:
ツールキットの導入¶
サポートOS¶
サポートされているOSとそのバージョンは以下の通りです。
- Red Hat Enterprise Linux 6 / CentOS 6
- Red Hat Enterprise Linux 7 / CentOS 7
- Ubuntu 14.04 LTS
なお、Python2.6またはPython2.7がインストールされている必要があります。
PostgreSQLバージョン¶
サポートされているPostgreSQLのバージョンは以下の通りです。
- PostgreSQL 9.0
- PostgreSQL 9.1
- PostgreSQL 9.2
- PostgreSQL 9.3
- PostgreSQL 9.4
インストール方法¶
以下のコマンドを実行することで、インターネット経由でインストールすることができます。
curl -L http://dl.uptimeforce.com/postgres-toolkit/install.sh | sh
または
wget http://dl.uptimeforce.com/postgres-toolkit/install.sh
sh install.sh
を実行してください。
インストールが完了すると、 /opt/uptime/postgres-toolkit-<VERSION>
以下に関連するファイルがインストールされます。
pt-archive-xlog¶
実行方法¶
pt-archive-xlog <XLOGFILEPATH> <DESTDIR>
オプション¶
特になし。
出力項目¶
アーカイブ成功時には 0 を、失敗時には 1 を返却します。
実行例¶
postgresql.conf
の archive_command
で以下のように設定します。
archive_command = '/path/to/pt-archive-xlog %p /path/to/archivedir'
pt-config¶
概要¶
PostgreSQLの設定ファイル postgresql.conf
の設定値を参照、変更します。
実行方法¶
pt-config [options...] get [PARAM]
pt-config [options...] set [PARAM] [VALUE]
pt-config [options...] disable [PARAM]
コマンド¶
get [PARAM] |
現在の値を表示します。無効(コメントアウト)の場合、 (disabled) と表示されます。 |
set [PARAM] [VALUE] |
新しい値を設定します。無効(コメントアウト)な場合は、有効にします。 |
disable [PARAM] |
設定値を無効にします(コメントアウトします)。 |
オプション¶
-D, --pgdata=PGDATA Specify a PostgreSQL database cluster.
--apply Apply change(s).
--help Print this help.
-D
, --pgdata
オプションは、PostgreSQLデータベースクラスタを指定します。オプションが指定されない場合は、PGDATA環境変数に設定された値が使われます。
--apply
オプションは、 set
/ disable
コマンドを実行する際に、実際に変更内容を postgresql.conf ファイルに適用します。
出力項目¶
Reading: |
読み込んでいる postgresql.conf ファイルをフルパスで表示します。 |
Dry-run mode: |
設定する前後の値を表示するのみで、実際の設定変更は行いません。 |
Applying: |
実際の設定変更を行っています。 |
Old |
変更する前の値を表します。 |
New |
変更する前の値を表します。 |
Updating: |
変更を行っている postgresql.conf ファイルをフルパスで表示します。 |
実行例¶
現在の shared_buffers
の値を表示します。
$ pt-config -D /var/lib/pgsql/9.4/data get shared_buffers
[2015-04-16 17:08:12] INFO: Reading: /var/lib/pgsql/9.4/data/postgresql.conf
256MB
$
shared_buffers
の値を 512MB
に設定します(実際の設定ファイルの変更は行いません)。
$ pt-config -D /var/lib/pgsql/9.4/data set shared_buffers 512MB
[2015-04-16 17:08:44] INFO: Reading: /var/lib/pgsql/9.4/data/postgresql.conf
[2015-04-16 17:08:44] INFO: Dry-run mode:
[2015-04-16 17:08:44] INFO: Old: shared_buffers = 256MB # min 128kB
[2015-04-16 17:08:44] INFO: New: shared_buffers = 512MB # min 128kB
$
shared_buffers
の値を 512MB
に設定します(実際に設定ファイルの変更を行います)。
$ pt-config -D /var/lib/pgsql/9.4/data --apply set shared_buffers 512MB
[2015-04-16 17:09:11] INFO: Reading: /var/lib/pgsql/9.4/data/postgresql.conf
[2015-04-16 17:09:11] INFO: Applying:
[2015-04-16 17:09:11] INFO: Old: shared_buffers = 256MB # min 128kB
[2015-04-16 17:09:11] INFO: New: shared_buffers = 512MB # min 128kB
[2015-04-16 17:09:11] INFO: Updated: /var/lib/pgsql/9.4/data/postgresql.conf
$
shared_buffers
の設定を無効化(コメントアウト)します。
$ pt-config -D /var/lib/pgsql/9.4/data --apply disable shared_buffers
[2015-04-16 17:09:52] INFO: Reading: /var/lib/pgsql/9.4/data/postgresql.conf
[2015-04-16 17:09:52] INFO: Applying:
[2015-04-16 17:09:52] INFO: Old: shared_buffers = 512MB # min 128kB
[2015-04-16 17:09:52] INFO: New: #shared_buffers = 512MB # min 128kB
[2015-04-16 17:09:52] INFO: Updated: /var/lib/pgsql/9.4/data/postgresql.conf
$
(無効化されている) shared_buffers
の値を表示します。
$ pt-config -D /var/lib/pgsql/9.4/data get shared_buffers
[2015-04-16 17:10:00] INFO: Reading: /var/lib/pgsql/9.4/data/postgresql.conf
512MB (disabled)
$
pt-index-usage¶
概要¶
インデックスの使用状況を表示します。
実行方法¶
pt-index-usage [option...]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
-o, --owner=STRING
-n, --schema=STRING
-t, --table=STRING
-i, --index=STRING
-u, --unused
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
-o
, --owner
オプションは、指定した文字列に合致する名前のユーザが所有者となっているインデックスの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-n
, --schema
オプションは、指定した文字列に合致する名前のスキーマにあるインデックスの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-t
, --table
オプションは、指定した文字列に合致する名前のテーブルに作成されたインデックスの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-i
, --index
オプションは、指定した文字列に合致する名前のインデックスの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-u
, --unused
オプションは、使われていないインデックスの情報のみを表示します。
-d
(または --dbname
), -o
(または --owner
), -n
(または --schema
), -t
(または --table
), -i
(または --index
), -u
(または --unused
)を同時に指定した場合には、すべての条件に合致するインデックスのみが表示対象となります。
出力項目¶
OID |
インデックスのオブジェクトID |
OWNER |
インデックスの所有者のユーザ名 |
SCHEMA |
インデックスの存在しているスキーマ名 |
TABLE |
インデックスが作成されているテーブル名 |
INDEX |
インデックス名 |
BLKS |
インデックスのブロック数(8kB単位) |
SCAN |
インデックススキャンの実行回数 |
T_READ |
インデックススキャンによって取得されたインデックスエントリ数 |
T_FTCH |
インデックススキャンによってテーブルから読まれたタプル数 |
B_READ |
ディスクから読み込まれたインデックスのブロック数 |
B_HIT |
共有バッファから読み込まれたインデックスのページ数 |
STATUS |
インデックスのステータス。このステータスは pg_index システムテーブルから取得します。 |
TABLESPACE |
インデックスの配置されているテーブルスペース名。 |
実行例¶
public
スキーマにあるテーブルのインデックスについて、利用状況を表示します。
$ pt-index-usage -n public -d postgres
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
| OID | OWNER | SCHEMA | TABLE | INDEX | BLKS | SCAN | T_READ | T_FTCH | B_READ | B_HIT | STATUS | TABLESPACE |
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
| 26793 | snaga | public | pgbench_accounts | pgbench_accounts_pkey | 276 | 1 | 1 | 1 | 4 | 0 | | spc1 |
| 26789 | snaga | public | pgbench_branches | pgbench_branches_pkey | 2 | 1 | 1 | 0 | 2 | 0 | | pg_default |
| 26791 | snaga | public | pgbench_tellers | pgbench_tellers_pkey | 2 | 0 | 0 | 0 | 0 | 0 | | pg_default |
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
$
public
スキーマ内の pgbench_accounts
テーブルにあるインデックスについて、利用状況を表示します。
$ pt-index-usage -n public -d postgres -t pgbench_accounts
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
| OID | OWNER | SCHEMA | TABLE | INDEX | BLKS | SCAN | T_READ | T_FTCH | B_READ | B_HIT | STATUS | TABLESPACE |
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
| 26793 | snaga | public | pgbench_accounts | pgbench_accounts_pkey | 276 | 1 | 1 | 1 | 4 | 0 | | spc1 |
+-------+-------+--------+------------------+-----------------------+------+------+--------+--------+--------+-------+--------+------------+
$
public
スキーマ内の一度も使われていないインデックスについて、利用状況を表示します。
$ pt-index-usage -d postgres -n public -u
+-------+-------+--------+-----------------+----------------------+------+------+--------+--------+--------+-------+--------+------------+
| OID | OWNER | SCHEMA | TABLE | INDEX | BLKS | SCAN | T_READ | T_FTCH | B_READ | B_HIT | STATUS | TABLESPACE |
+-------+-------+--------+-----------------+----------------------+------+------+--------+--------+--------+-------+--------+------------+
| 26791 | snaga | public | pgbench_tellers | pgbench_tellers_pkey | 2 | 0 | 0 | 0 | 0 | 0 | | pg_default |
+-------+-------+--------+-----------------+----------------------+------+------+--------+--------+--------+-------+--------+------------+
$
pt-kill¶
概要¶
PostgreSQLバックエンドの処理を中断、またはバックエンドを終了させます。
実行方法¶
pt-kill [options...] [command] [pid]
コマンド¶
cancel Cancel a running query.
terminate Terminate a backend with canceling query.
オプション¶
--help Print this help.
出力項目¶
特になし。
実行例¶
プロセスID 3289 で実行中のSQLをキャンセルします。
$ pt-kill cancel 3289
プロセスID 3291 で実行中のバックエンドを終了します。
$ pt-kill terminate 3291
pt-privilege-autogen¶
概要¶
ユーザおよびデータベースオブジェクトに対する最小の権限を付与するためのREVOKE/GRANT文を生成します。アプリケーションのアクセスポリシーを学習するためにPostgreSQLの統計情報を利用します。
実行方法¶
pt-privilege-autogen [option...] [ start | stop ]
pt-privilege-autogen [option...] generate <USERNAME>
コマンド¶
start |
データベース内のテーブルのアクセス統計情報の収集を開始します。 |
generate |
収集したテーブルのアクセス統計情報をもとにREVOKE/GRANT文を生成します。権限を設定したい対象のユーザ名を引数に取ります。 |
stop |
データベース内のテーブルのアクセス統計情報の収集を停止します。 |
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
出力項目¶
このコマンドは、PostgreSQLデータベースに対して実行可能なGRANT/REVOKE文を出力します。
実行例¶
以下の例では、snaga
ユーザに対してpgbenchのトランザクションを実行するために必要な、最小限の権限を実現するためのREVOKE/GRANT文を生成しています。
一連の作業は、すでに権限のあるユーザで行います。この例では管理者ユーザ postgres
で実行しています。
まず最初に、pgbench用のデータベースを管理者権限で作成し、通常のユーザではテーブルにアクセスできないことを確認します。
$ createdb -U postgres mydb
$ pgbench -i -U postgres mydb
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.70 s, remaining 0.00 s).
vacuum...
set primary keys...
done.
$ pgbench -c 1 -t 1 -U snaga -n mydb
ERROR: permission denied for relation pgbench_branches
$
次に、テーブルのアクセス統計情報の収集を開始し、pgbenchのトランザクションを実行します。
$ pt-privilege-autogen -U postgres -d mydb start
[2015-08-04 04:40:45] INFO: Collecting access statistics started.
$ pgbench -c 1 -t 1 -U postgres -n mydb
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 1
number of transactions actually processed: 1/1
latency average: 0.000 ms
tps = 14.402581 (including connections establishing)
tps = 20.464964 (excluding connections establishing)
$
そして、アクセスポリシーのファイルを作成して、データベースに適用します。ここでは snaga
ユーザに対して、4つのテーブルの最小限のアクセス権限を付与しています。
$ pt-privilege-autogen -U postgres -d mydb generate snaga
-- Database
REVOKE ALL ON DATABASE "mydb" FROM "public";
GRANT CONNECT,TEMP ON DATABASE "mydb" TO "snaga";
-- Schema
REVOKE ALL ON SCHEMA "public" FROM "public";
GRANT USAGE ON SCHEMA "public" TO "snaga";
-- Table
REVOKE ALL ON TABLE "public"."pgbench_accounts" FROM "snaga";
REVOKE ALL ON TABLE "public"."pgbench_branches" FROM "snaga";
REVOKE ALL ON TABLE "public"."pgbench_history" FROM "snaga";
REVOKE ALL ON TABLE "public"."pgbench_tellers" FROM "snaga";
GRANT SELECT,UPDATE ON TABLE "public"."pgbench_accounts" TO "snaga";
GRANT SELECT,UPDATE ON TABLE "public"."pgbench_branches" TO "snaga";
GRANT INSERT ON TABLE "public"."pgbench_history" TO "snaga";
GRANT SELECT,UPDATE ON TABLE "public"."pgbench_tellers" TO "snaga";
$ pt-privilege-autogen -U postgres -d mydb generate snaga > grant.sql
$ psql -f grant.sql -U postgres mydb
REVOKE
GRANT
REVOKE
GRANT
REVOKE
REVOKE
REVOKE
REVOKE
GRANT
GRANT
GRANT
GRANT
$
最後に、アクセス統計情報の収集を終了し、一般ユーザの snaga
でも最小権限の付与によってpgbenchトランザクションを実行可能になったことを確認します。
$ pt-privilege-autogen -U postgres -d mydb stop
[2015-08-04 04:44:21] INFO: Collecting access statistics stopped.
$ pgbench -c 1 -t 1 -U snaga -n mydb
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 1
number of transactions actually processed: 1/1
latency average: 0.000 ms
tps = 33.598764 (including connections establishing)
tps = 82.182774 (excluding connections establishing)
$
pt-proc-stat¶
概要¶
各プロセスごとのI/O統計量を表示します。
実行方法¶
pt-proc-stat [option...] [delay [count]]
pt-proc-stat
コマンドは、procファイルシステムを参照します。PostgreSQLの実行ユーザ、またはrootユーザで実行する必要があります。
オプション¶
-D, --pgdata=DATADIR
-P, --pid=PID
--help
-D
, --pgdata
オプションは、データベースクラスタのディレクトリを指定します。
-P
, --pid
オプションは、PostmasterプロセスのプロセスIDを指定します。
出力項目¶
PROCESS NAME |
プロセス名 |
PID |
プロセスID |
STAT |
プロセスのステータス |
USR |
ユーザCPU使用時間(差分) |
SYS |
システムCPU使用時間(差分) |
VSZ |
仮想メモリサイズ(MB単位) |
RSS |
物理メモリ使用量(MB単位)_ |
READ |
読み込みのディスクI/O量(KB単位、差分) |
WRITE |
書き込みのディスクI/O量(KB単位、差分) |
READ2 |
READ を除いた読み込みI/O量(KB単位、差分) |
WRITE2 |
WRITE を除いた書き込みI/O量(KB単位、差分) |
実行例¶
Postmasterプロセスを自動的に探し、Postmasterおよび子プロセスの統計を5秒間隔で2回表示して終了します。
$ sudo ./pt-proc-stat 5 2
Fri May 1 22:23:39 JST 2015
PROCESS NAME[ PID] STAT USR SYS VSZ RSS READ WRITE READ2 WRITE2
postmaster[24026] S 4 13 100 9 23752 1290092 1090800 155357
logger[24028] S 0 1 85 1 4 76 30 -45
checkpointer[24030] S 4 117 100 8 176 56768 -176 -46965
writer[24031] S 104 66 100 9 0 291080 0 130560
wal writer[24032] S 8 19 100 1 0 2928 0 0
autovacuum launcher[24033] S 3 3 101 2 8 8 288 0
stats collector[24034] S 13 32 85 1 0 2140 34 -649
snaga postgres 127.0[25473] R 32 9 101 7 296 1472 1264 0
snaga postgres 127.0[25474] R 33 9 101 7 424 1384 1120 0
snaga postgres 127.0[25475] R 33 9 101 7 424 1448 1016 0
snaga postgres 127.0[25476] S 32 9 101 7 580 1400 780 0
snaga postgres 127.0[25477] R 32 9 101 7 908 1368 492 0
Fri May 1 22:23:44 JST 2015
PROCESS NAME[ PID] STAT USR SYS VSZ RSS READ WRITE READ2 WRITE2
postmaster[24026] S 0 0 100 9 0 0 0 0
logger[24028] S 0 0 85 1 0 0 0 0
checkpointer[24030] S 0 0 100 8 0 0 0 0
writer[24031] S 4 1 100 9 0 11928 0 392
wal writer[24032] S 0 0 100 1 0 0 0 0
autovacuum launcher[24033] S 0 0 101 2 0 0 0 0
stats collector[24034] S 0 0 85 1 0 0 0 0
snaga postgres 127.0[25473] R 72 18 101 10 1772 3608 1740 0
snaga postgres 127.0[25474] R 68 20 101 10 1436 3920 2020 0
snaga postgres 127.0[25475] D 70 18 101 10 1304 4216 2368 0
snaga postgres 127.0[25476] R 70 20 101 10 1252 3384 2212 0
snaga postgres 127.0[25477] R 73 16 101 10 1464 3224 2080 0
$
pt-replication-stat¶
概要¶
レプリケーションのマスターのノードの統計情報を参照してレプリケーションの実行状況を表示します。指定したインターバルごとに連続的に表示することも可能です。
PostgreSQL 9.1またはそれ以降のバージョンで動作します。PostgreSQL 9.0は pg_stat_replication
システムビューが無いため、動作しません。
実行方法¶
pt-replication-stat [option...] [delay [count]]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
出力項目¶
PID |
マスターノードで動作しているWAL送信プロセスのプロセスID |
NAME |
レプリケーション先として登録されているスレーブノードの名称 |
HOST |
スレーブノードのホスト名またはIPアドレス |
PORT |
スレーブノードに接続しているマスターノードのポート番号 |
STATE |
スレーブノードの状態です。 startup 、 backup 、 catchup 、 streaming のいずれかを取る。 |
SENT |
スレーブへ送信されたWAL上の位置 |
WRITTTEN |
スレーブ上でのWALバッファへの書き込みされたWAL上の位置 |
FLUSHED |
スレーブ上でのWALファイルへの同期書き込みされたWAL上の位置 |
REPLAYED |
スレーブ上でのデータファイルへの適用されたWAL上の位置 |
PRI |
スレーブノードが同期レプリケーションの場合の、ノードの優先度を表示します。 |
MODE |
動作しているモードを表示します。sync は同期モード、async は非同期モード、potential は非同期モードで動作中ではあるが同期モードに昇格する可能性がある。 |
実行例¶
ホスト 127.0.0.1
のポート 5433
にユーザ postgres
で接続し、5秒ごとに統計情報を2回表示して終了します。
$ pt-replication-stat -h 127.0.0.1 -p 5433 -U postgres 5 2
Sat Mar 28 21:45:23 JST 2015
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| PID | NAME | HOST | PORT | STATE | SENT | WRITTTEN | FLUSHED | REPLAYED | PRI | MODE |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| | | | | local | 0/5F30398 | 0/5F300B0 | | | | master |
| 3323 | replica1 | 127.0.0.1 | 55580 | streaming | 0/5F300B0 | 0/5F300B0 | 0/5F300B0 | 0/5F2FE48 | 0 | async |
| 3367 | replica2 | 127.0.0.1 | 55589 | streaming | 0/5F300B0 | 0/5F300B0 | 0/5F2FE48 | 0/5F2FE48 | 0 | async |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
Sat Mar 28 21:45:28 JST 2015
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| PID | NAME | HOST | PORT | STATE | SENT | WRITTTEN | FLUSHED | REPLAYED | PRI | MODE |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| | | | | local | 0/608CD68 | 0/608CAC0 | | | | master |
| 3323 | replica1 | 127.0.0.1 | 55580 | streaming | 0/608CAC0 | 0/608CAC0 | 0/608C7D8 | 0/608C7D8 | 0 | async |
| 3367 | replica2 | 127.0.0.1 | 55589 | streaming | 0/608CAC0 | 0/608CAC0 | 0/608C7D8 | 0/608C7D8 | 0 | async |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
$
localhost
のデフォルトポート(5432
)に接続して、5秒ごとに統計情報を表示し続けます。CTRL-Cで終了します。
$ pt-replication-stat -h localhost 5
Sat Mar 28 21:45:23 JST 2015
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| PID | NAME | HOST | PORT | STATE | SENT | WRITTTEN | FLUSHED | REPLAYED | PRI | MODE |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
| | | | | local | 0/5F30398 | 0/5F300B0 | | | | master |
| 3323 | replica1 | 127.0.0.1 | 55580 | streaming | 0/5F300B0 | 0/5F300B0 | 0/5F300B0 | 0/5F2FE48 | 0 | async |
| 3367 | replica2 | 127.0.0.1 | 55589 | streaming | 0/5F300B0 | 0/5F300B0 | 0/5F2FE48 | 0/5F2FE48 | 0 | async |
+------+----------+-----------+-------+-----------+-----------+-----------+-----------+-----------+-----+--------+
^C[2015-03-28 21:45:25] INFO: Terminated.
$
pt-session-profiler¶
実行方法¶
pt-session-profiler [option...]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-i [INTERFACE]
-T, --threshold=MILLISECONDS
--help
-h
, --host
オプションは、解析するPostgreSQLセッションのPostgreSQLサーバのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、すべてのサーバ名またはIPアドレスのパケットを解析対象とします。
-p
, --port
オプションは、解析するPostgreSQLセッションのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-i
オプションは、キャプチャするネットワークインターフェースを指定します。省略した場合にはすべてのネットワークインターフェース(any
)が対象となります。
-T
, --threshold
オプションは、表示するクエリの実行時間の閾値を指定します。単位はミリ秒です。デフォルトは 1000
です。
出力項目¶
sess |
セッションを表す一意な文字列(セッションごとに異なる値。送信元のIPアドレスとポート番号、および宛先のIPアドレスとポート番号を、MD5でハッシュ化した文字列の先頭12文字を使用) |
time |
クエリの実行時間 |
query |
実行したクエリ文字列 |
実行例¶
すべてのネットワークインターフェースを通過するTCPパケットのうち、ポート 5432 宛のものを監視して、実行に500ミリ秒以上かかったクエリを表示します。CTRL-Cで終了します。
$ sudo pt-session-profiler -T 500
[2015-03-29 15:07:22] INFO: Threshold: 500 ms
[2015-03-29 15:07:22] INFO: tcpdump -l -i any -s 0 -X -p tcp port 5432
[2015-03-29 15:07:36] INFO: sess:e27f20dae08f, time:0:00:00.557728, query:UPDATE pgbench_tellers SET tbalance = tbalance + 2084 WHERE tid = 23;
[2015-03-29 15:07:36] INFO: sess:b3674d7bbea0, time:0:00:00.980950, query:INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (32, 5, 255511, 2695, CURRENT_TIMESTAMP);
[2015-03-29 15:07:45] INFO: sess:1c32286cab7a, time:0:00:01.115904, query:SELECT abalance FROM pgbench_accounts WHERE aid = 161999;
[2015-03-29 15:07:45] INFO: sess:33f8c268624c, time:0:00:00.526850, query:UPDATE pgbench_accounts SET abalance = abalance + 3877 WHERE aid = 326415;
[2015-03-29 15:07:46] INFO: sess:b370afd07dcf, time:0:00:00.719780, query:SELECT abalance FROM pgbench_accounts WHERE aid = 852680;
[2015-03-29 15:07:46] INFO: sess:0f04724051ad, time:0:00:00.543609, query:BEGIN;
^C[2015-03-29 15:07:51] INFO: Terminated.
$
pt-set-tablespace¶
概要¶
指定したテーブルと関連するインデックスのテーブルスペースを一括して変更します。
実行方法¶
pt-set-tablespace [option...] [tablespace]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
-o, --owner=STRING
-n, --schema=STRING
-t, --table=STRING
-l, --list
--apply
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
-o
, --owner
オプションは、指定した文字列に合致する名前のユーザが所有者となっているテーブルのみを対象とします。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-n
, --schema
オプションは、指定した文字列に合致する名前のスキーマにあるテーブルのみを対象とします。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-t
, --table
オプションは、指定した文字列に合致する名前のテーブルのみを対象とします。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
--apply
オプションは、テーブルスペースの変更を実際にデータベースに反映します。
-l
, --list
オプションは、テーブルスペースの情報を表示します。
-o
(または --owner
), -n
(または --schema
), -t
(または --table
) を同時に指定した場合には、すべての条件に合致するテーブルのみが対象となります。
1つ以上のテーブルの移動に失敗した場合には終了コード 1
を返します。すべてのファイルの移動に成功した場合には 0
を返します。
出力項目¶
-l
, --list
オプションで表示される項目は以下の通りです。
OID |
テーブルスペースのオブジェクトID |
OWNER |
テーブルスペースの所有者のユーザ名 |
TABLESPACE |
テーブルスペース名 |
LOCATION |
テーブルスペースの配置されているディレクトリのパス |
USE% |
テーブルスペースの配置されているパーティションのディスク使用率 |
AVAIL |
テーブルスペースの配置されているパーティションの空き容量 |
その他の表示項目は以下の通りです。
Dry-run mode |
発行するALTER TABLE/INDEX文を表示しますが、実際の移動は行いません。 |
Applying ALTER TABLE/INDEX |
ALTER TABLE/INDEX文を実際に実行して、テーブル/インデックスのテーブルスペースを変更します。 |
X tables/indexes moved. Y failed. |
X 個のテーブル/インデックスを移動に成功し、 Y 個の移動に失敗しました。 |
実行例¶
PostgreSQLインスタンスに存在するテーブルスペースの一覧を表示します。 各パーティションの使用領域を取得し、併せて一覧として表示します。
$ pt-set-tablespace --list
+--------+----------+------------+---------------------------+------+-------+
| OID | OWNER | TABLESPACE | LOCATION | USE% | AVAIL |
+--------+----------+------------+---------------------------+------+-------+
| 1663 | postgres | pg_default | | | |
| 1664 | postgres | pg_global | | | |
| 121263 | postgres | hddspc2 | /disk/disk2/pgsql | 85% | 80G |
| 16818 | postgres | ssdspc1 | /disk/disk1/tblspc1 | 67% | 127G |
| 305242 | postgres | ssdspc2 | /disk/disk3/pgsql/ssdspc2 | 98% | 13G |
+--------+----------+------------+---------------------------+------+-------+
$
dbt3
データベースにある orders
テーブル、および orders
テーブルに作成されたインデックスのすべてを、 ssdspc1
テーブルスペースに移動するための ALTER TABLE
文および ALTER INDEX
文を表示します。(実際の移動は行いません)
$ pt-set-tablespace -d dbt3 --table orders ssdspc1
[2015-04-29 17:35:24] INFO: Dry-run mode:
[2015-04-29 17:35:24] INFO: ALTER TABLE "public"."orders" SET TABLESPACE "ssdspc1";
[2015-04-29 17:35:24] INFO: ALTER INDEX "public"."pk_orders" SET TABLESPACE "ssdspc1";
[2015-04-29 17:35:24] INFO: ALTER INDEX "public"."i_o_orderdate" SET TABLESPACE "ssdspc1";
[2015-04-29 17:35:24] INFO: ALTER INDEX "public"."i_o_custkey" SET TABLESPACE "ssdspc1";
$
dbt3
データベースにある orders
テーブル、および orders
テーブルに作成されたインデックスのすべてを、 ssdspc1
テーブルスペースに移動します。
$ pt-set-tablespace -d dbt3 --table orders --apply ssdspc1
[2015-04-29 17:37:06] INFO: Applying ALTER TABLE/INDEX...
[2015-04-29 17:37:08] INFO: 4 tables/indexes moved. 0 failed.
$
dbt3
スキーマ内にあるすべてのテーブル、およびすべてのインデックスを、 ssdspc1
テーブルスペースに移動します。
$ pt-set-tablespace --schema dbt3 --apply ssdspc1
[2015-04-29 17:38:39] INFO: Applying ALTER TABLE/INDEX...
[2015-04-29 17:38:57] INFO: 31 tables/indexes moved. 0 failed.
$
pt-show-locks¶
概要¶
待機中のロックと、その待機の原因となっているロックを、依存関係および実行中のクエリとともに表示します。
実行方法¶
pt-show-locks [option...]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
出力項目¶
BLOCKER |
ロックを待機している場合には、対象のロックを獲得しているバックエンドのプロセスID |
PID |
バックエンドのプロセスID |
LOCKTYPE |
ロックの種別 |
MODE |
ロックの取得モード |
GRANTED |
ロックが獲得されていれば t 、獲得待ちなら f |
QUERY |
実行中のクエリ文字列 |
実行例¶
postgres
ユーザで mydb
データベースに接続して、ロックの状態を表示します。
$ pg-show-locks -d mydb -U postgres
+---------+------+----------+---------------------+---------+--------------------------------------------+
| BLOCKER | PID | LOCKTYPE | MODE | GRANTED | QUERY |
+---------+------+----------+---------------------+---------+--------------------------------------------+
| | 2076 | relation | AccessExclusiveLock | t | lock TABLE pgbench_accounts; |
| 2076 | 2049 | relation | RowShareLock | f | select * from pgbench_accounts for update; |
| 2076 | 2436 | relation | RowExclusiveLock | f | delete from pgbench_accounts; |
+---------+------+----------+---------------------+---------+--------------------------------------------+
$
pt-snap-statements¶
概要¶
2つの時刻のSQL文の統計情報の差分を計算して表示します。
オプションを指定することにより、特定の項目ごとにソートして表示することができます。
contribモジュールの pg_stat_statements
が導入されている必要があります。
また、 track_io_timing
オプションが有効にされている必要があります。
実行方法¶
pt-snap-statements [option...] [interval]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
-s, --sort=KEY
-l
-t, --top=NUMBER
-R, --reset
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
-s
オプションは、ソートする項目を指定します(未実装)。KEY
は、次のいずれかの値を取ることができます: CALLS
, T_TIME
, ROWS
, B_HIT
, B_READ
, B_DIRT
, B_WRTN
, R_TIME
, W_TIME
-l
オプションは、ブロックの種別(共有バッファ、ローカルバッファ、一時バッファ)ごとに詳細な内訳を表示します(未実装)。-l
オプションを指定しない場合は、共有バッファ、ローカルバッファ、一時バッファの数値を合算した値が表示されます。
-t
, --top
オプションは、表示するクエリの数を指定します。指定しない場合はすべてのクエリが表示されます。
-R
, --reset
オプションは、pg_stat_statements
ビューの統計情報を初期化します。
出力項目¶
USER |
クエリを実行したユーザ名 |
DBNAME |
クエリを実行したデータベース名 |
QUERYID |
実行されたクエリのクエリID(16進数表記) |
QUERY |
実行されたクエリ(最大30文字で切り詰め) |
CALLS |
クエリの実行回数 |
T_TIME |
クエリの総実行時間(ミリ秒) |
ROWS |
クエリによって取得または影響を受けた行の総数 |
B_HIT |
ブロック読み込みの際にバッファから読み込んだブロック総数 |
B_READ |
ブロック読み込みの際にディスクから読み込んだブロック総数 |
B_DIRT |
クエリによってページが更新されたページ総数 |
B_WRTN |
クエリによってディスクに書き込まれたブロック総数 |
R_TIME |
ディスクからのブロック読み込みにかかった総時間(ミリ秒) (track_io_timing パラメータが有効になっている必要がある) |
W_TIME |
ディスクへのブロック書き込みにかかった総時間(ミリ秒) (track_io_timing パラメータが有効になっている必要がある) |
実行例¶
postgres
データベースに接続し、で5秒間に実行されたSQL文を総実行時間(T_TIME
)の長い順にソートしてすべて表示します。
$ pt-snap-statements -d postgres 5
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
| USER | DBNAME | QUERYID | QUERY | CALLS | T_TIME | ROWS | B_HIT | B_READ | B_DIRT | B_WRTN | R_TIME | W_TIME |
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
| snaga | postgres | 80053daf | UPDATE pgbench_branches SET bb | 677 | 12007 | 677 | 9160 | 1 | 1 | 0 | 0.0 | 0.0 |
| snaga | postgres | 1675159e | UPDATE pgbench_tellers SET tba | 681 | 7648 | 681 | 3403 | 0 | 0 | 0 | 0.0 | 0.0 |
| snaga | postgres | ec088219 | UPDATE pgbench_accounts SET ab | 684 | 530 | 684 | 2289 | 585 | 568 | 0 | 125.9 | 0.0 |
| snaga | postgres | 198383d | SELECT abalance FROM pgbench_a | 682 | 73 | 682 | 2080 | 0 | 0 | 0 | 0.0 | 0.0 |
| snaga | postgres | da8cc6f | INSERT INTO pgbench_history (t | 676 | 34 | 676 | 704 | 12 | 10 | 0 | 0.0 | 0.0 |
| snaga | postgres | d4e6bf94 | BEGIN; | 684 | 4 | 0 | 0 | 0 | 0 | 0 | 0.0 | 0.0 |
| snaga | postgres | a81672e | END; | 671 | 3 | 0 | 0 | 0 | 0 | 0 | 0.0 | 0.0 |
| snaga | postgres | 8caa574 | select count(*) from pgbench_b | 1 | 0 | 1 | 4 | 0 | 0 | 0 | 0.0 | 0.0 |
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
$
ホスト 192.168.1.101
のポート 5433
で稼働しているPostgreSQLサーバの データベース postgres
にユーザ snaga
で接続し、5秒間に実行されたSQL文を総実行時間(T_TIME
)の長い順にソートしてトップ5件を表示します。
$ pt-snap-statements --host 192.168.1.101 -p 5433 -U snaga -d postgres -t 5 5
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
| USER | DBNAME | QUERYID | QUERY | CALLS | T_TIME | ROWS | B_HIT | B_READ | B_DIRT | B_WRTN | R_TIME | W_TIME |
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
| snaga | postgres | 80053daf | UPDATE pgbench_branches SET bb | 503 | 9953 | 503 | 8430 | 14 | 7 | 0 | 0.6 | 0.0 |
| snaga | postgres | 1675159e | UPDATE pgbench_tellers SET tba | 508 | 6483 | 508 | 2551 | 10 | 9 | 0 | 0.3 | 0.0 |
| snaga | postgres | ec088219 | UPDATE pgbench_accounts SET ab | 511 | 560 | 511 | 1424 | 698 | 477 | 7 | 91.0 | 12.1 |
| snaga | postgres | 198383d | SELECT abalance FROM pgbench_a | 511 | 93 | 511 | 1550 | 0 | 0 | 0 | 0.0 | 0.0 |
| snaga | postgres | da8cc6f | INSERT INTO pgbench_history (t | 503 | 20 | 503 | 530 | 13 | 11 | 0 | 0.1 | 0.0 |
+-------+----------+----------+--------------------------------+-------+--------+------+-------+--------+--------+--------+--------+--------+
$
pt-stat-snapshot¶
概要¶
統計情報のスナップショットを取得、保存、管理します。
実行方法¶
pt-stat-snapshot [option...] install
pt-stat-snapshot [option...] uninstall
pt-stat-snapshot [option...] create [level]
pt-stat-snapshot [option...] list
pt-stat-snapshot [option...] delete [sid]
pt-stat-snapshot [option...] export [file]
pt-stat-snapshot [option...] import [file]
コマンド¶
install |
動作に必要なスキーマ、テーブルや関数の作成などを行います。 | ||
uninstall |
関連するスキーマ、テーブルや関数などを削除します。 | ||
create [level] |
スナップショットを取得します。レベルには 1 |
2 |
4 のいずれかを指定できます。 |
list |
保存されているスナップショットの一覧を表示します。 | ||
delete [sid] |
指定したスナップショットIDのスナップショットを削除します。 M:N のように記述することで範囲指定することが可能です。 |
||
export [file] |
指定したファイルにスナップショットデータをエクスポートします。 | ||
import [file] |
指定したファイルからスナップショットデータをインポートします。 |
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
出力項目¶
list
コマンドで表示される項目は以下の通りです。
SID |
スナップショットID(スナップショットを取得するごとに単調増加する整数値) |
TIMESTAMP |
スナップショットを取得したタイムスタンプ |
LEVEL |
スナップショットレベル |
実行例¶
動作に必要なスキーマ、テーブル、関数を testdb
データベースにインストールします。
$ pt-stat-snapshot -h 127.0.0.1 -U postgres -d testdb install
[2015-03-31 17:21:37] INFO: Succeeded to install pgperf snapshot.
$
スナップショットレベル4でスナップショットを取得します。
$ pt-stat-snapshot -h 127.0.0.1 -U postgres -d testdb create 4
[2015-03-31 17:21:47] INFO: Succeeded to take a snapshot.
$
スナップショットの一覧を表示します。
$ pt-stat-snapshot -h 127.0.0.1 -U postgres -d testdb list
+-----+---------------------+-------+
| SID | TIMESTAMP | LEVEL |
+-----+---------------------+-------+
| 0 | 2015-03-31 17:21:47 | 1 |
+-----+---------------------+-------+
$
関連するスキーマ、テーブル、関数を testdb
データベースからアンインストールします。
$ pt-stat-snapshot -h 127.0.0.1 -U postgres -d testdb uninstall
[2015-03-31 17:21:59] INFO: Succeeded to uninstall pgperf snapshot.
$
pgperf-snapshotモジュールについて¶
pt-stat-snapshot
コマンドは、その内部で旧 pgperf-snapshot モジュールを使っています。
pgperf-snapshotモジュールについての詳細は、以下のドキュメントを参照してください。
PgPerfパッケージの概要¶
PgPerfパッケージとは¶
PgPerfパッケージは、PostgreSQLの内部で取得できるパフォーマンス統計情報のスナップショットを取得し、専用のスナップショットテーブルに保存するパッケージです。
ここで言う「PostgreSQLのパフォーマンス統計情報」とは、主に以下の統計情報です。
- pg_stat_databaseなどのシステムビューから取得できるアクセス統計情報
- pg_statisticシステムテーブルから取得できるオプティマイザ統計情報
- pg_current_xlog_location()などのシステム管理関数から取得できる統計情報
- pgstattuple()などの関数で取得できるフラグメンテーション情報
これらのパフォーマンス統計情報を取得・保存しておくことで、運用管理やパフォーマンス管理に不可欠な現状把握や予測に役立てることができます。
PgPerfパッケージの特徴¶
PgPerfパッケージは、主に以下のような特徴を持っています。
- スクリプト(SQL、PL/pgSQL)のみで動作するため、PostgreSQLの稼働しているプラットフォームに依存しない。
- 各種性能情報を容易に取得・保存することができ、蓄積したデータを自由に分析・活用することができる。
- インストールおよびアンインストールが容易で、稼働しているPostgreSQLの設定を変更する必要がない。
PgPerfパッケージの動作するプラットフォーム¶
PgPerfパッケージは以下のプラットフォームで動作します。
- PostgreSQL 9.0, 9,1, 9.2, 9.3, 9.4
動作するOSは問いません。
PgPerfパッケージの提供するもの¶
PgPerfパッケージは以下を提供します。
- パッケージで使用する専用のスキーマ
- スナップショットを取得するためのSQL関数
- スナップショットを保存するためのテーブル
- 関連するシェルスクリプト
PgPerfパッケージの使い方¶
この章ではPgPerfパッケージの導入から基本的な使い方を解説します。
PgPerfパッケージのインストール¶
PgPerfをインストールするには、スナップショットを取得するデータベースに対して pgperf_snapshot_install.sql
スクリプトを実行して、該当データベース内に pgperf
スキーマ、スナップショット関数、およびスナップショットテーブルを作成します。
psql -f pgperf_snapshot_install<VERSION>.sql <DBNAME>
PgPerfパッケージのアンインストール¶
PgPerfパッケージをアンインストールする場合には、インストールしてあったデータベースに対して pgperf_snapshot_uninstall.sql
スクリプトを実行します。
psql -f pgperf_snapshot_uninstall.sql <DBNAME>
pgperf_snapshot_uninstall.sql
を実行すると、該当データベース内の pgperf
スキーマ、およびスキーマに含まれるスナップショット関数、スナップショットテーブルを一括して削除します。
スナップショットの取得¶
スナップショットを取得するには、SQL関数 pgperf.create_snapshot()
を実行します。
スナップショット取得レベルを指定して pgperf.create_snapshot()
関数を実行すると、各統計情報のスナップショットが取得され、取得されたスナップショットのスナップショットIDが返却されます。
以下の例では、スナップショット取得レベルを 4
としてスナップショットを取得し、そのスナップショットIDとして 1005
が返却されています。
postgres=# SELECT pgperf.create_snapshot(4);
create_snapshot
-----------------
1005
(1 row)
postgres=#
スナップショット一覧の取得¶
スナップショットの一覧を取得するには、 pgperf.snapshot
テーブルの内容を表示します。
以下のように、スナップショットIDとスナップショットを取得した日時を取得することができます。
postgres=# SELECT * FROM pgperf.snapshot;
sid | ts | level
-----+----------------------------+-------
0 | 2015-04-11 19:11:24.04428 | 1
1 | 2015-04-11 19:11:24.060965 | 2
2 | 2015-04-11 19:11:24.110034 | 4
(3 rows)
postgres=#
スナップショットの削除¶
スナップショットを削除するには、スナップショットIDを指定してSQL関数 pgperf.delete_snapshot()
を実行します。
以下の例では、スナップショットIDが 2
のスナップショットを削除しています。
postgres=# SELECT pgperf.delete_snapshot(2);
delete_snapshot
-----------------
t
(1 row)
postgres=# SELECT * FROM pgperf.snapshot;
sid | ts | level
-----+----------------------------+-------
0 | 2015-04-11 19:11:24.04428 | 1
1 | 2015-04-11 19:11:24.060965 | 2
(2 rows)
postgres=#
定期的なスナップショットの取得¶
スナップショットを定期的に取得するには、cronなどを用いて定期的に pgperf.create_snapshot()
を実行します。
パッケージに同梱されているシェルスクリプト get_snapshot.sh
は指定したデータベース、または(テンプレート以外の接続が許可されている)すべてのデータベースに対して pgperf.create_snapshot()
を実行します。
以下は postgres
データベースのパフォーマンス統計情報のスナップショットを取得しています。
$ ./get_snapshot.sh postgres
以下はすべてのデータベースのパフォーマンス統計情報のスナップショットを取得しています。
$ ./get_snapshot.sh
crontabを設定することで、 get_snapshot.sh
スクリプトを定期的に実行してスナップショットを取得することができます。
以下のcrontabの設定では10分おきに get_snapshot.sh
スクリプトを実行して全データベースのパフォーマンス統計情報のスナップショットを取得しています。
0-59/10 * * * * /path/to/get_snapshot.sh > /dev/null 2>&1
古いスナップショットの消し込み¶
保存されている古いスナップショットを一括して削除するためには、SQL関数 pgperf.purge_snapshots()
を実行します。
以下の例では、一週間以上前に作成されたスナップショットを削除しています。
postgres=# SELECT sid,ts FROM pgperf.snapshot ORDER BY ts LIMIT 1;
sid | ts
-----+----------------------------
2 | 2012-10-21 18:20:01.238885
(1 row)
postgres=# SELECT now(),pgperf.purge_snapshots('1 weeks');
now | purge_snapshots
-------------------------------+-----------------
2012-10-29 14:57:04.092243+09 | 121
(1 row)
postgres=# SELECT sid,ts FROM pgperf.snapshot ORDER BY ts LIMIT 1;
sid | ts
-----+--------------------------
123 | 2012-10-22 15:00:01.8397
(1 row)
postgres=#
スナップショット関数¶
この章ではパフォーマンス統計情報のスナップショットを管理・利用するためのSQL関数について解説します。
スナップショット関数一覧¶
関数名 | 内容 |
---|---|
pgperf.create_snapshot(level) | 新規のスナップショットを作成します。 |
pgperf.delete_snapshot(snapid) | 指定したスナップショットを削除します。 |
pgperf.purge_snapshots(interval) | 指定した期間以前のスナップショットを削除します。 |
pgperf.get_interval(snapid1, snapid2) | 指定した2つのスナップショットの間隔を秒数で取得します。 |
pgperf.create_snapshot()関数¶
概要¶
PostgreSQL内のパフォーマンス統計情報のスナップショットを取得します。
定義¶
integer pgperf.create_snapshot(integer level)
引数¶
引数名 | 引数型 | 内容 |
---|---|---|
level | integer | 取得するスナップショットレベル |
データベース内のパフォーマンス統計情報は、その種別によってはデータベースへの小さくない負荷が発生する場合があります。
pgperf.create_snapshot()
関数では、スナップショット取得レベルを指定することで、負荷の小さいパフォーマンス統計情報は頻繁に取得し、データベースへの負荷のかかるパフォーマンス統計情報は頻度を下げて取得することが可能です。
取得レベル | 取得する内容 |
---|---|
1 | 基本的なアクセス統計情報およびセッション情報のスナップショットを取得します。 pg_stat_database, pg_database_size() pg_stat_user_tables, pg_statio_user_tables pg_stat_user_indexes, pg_statio_user_indexes pg_relation_size(), pg_total_relation_size() pg_current_xlog_location(), pg_current_xlog_insert_location() pg_stat_bgwriter pg_stat_activity, pg_locks, pg_stat_statements |
2 | 上記に加え、オプティマイザ統計情報のスナップショットを取得します。 pg_statistic |
3 | 未使用 |
4 | 上記に加え、テーブル/インデックスのフラグメンテーション情報のスナップショットを取得します。 pgstattuple(), pgstatindex() |
5 | 未使用 |
pgperf.delete_snapshot()関数¶
概要¶
指定したパフォーマンス統計情報のスナップショットのデータを削除します。
定義¶
integer pgperf.delete_snapshot(integer snapid);
引数¶
引数名 | 引数型 | 内容 |
---|---|---|
snapid | integer | 削除するスナップショットのスナップショットID |
スナップショットテーブル¶
この章ではパフォーマンス統計情報のスナップショットを保存するテーブルについて解説します。
スナップショットテーブル一覧¶
パフォーマンス統計情報のスナップショットは、PostgreSQL内部の各種統計情報と対応する以下のテーブルに保存されます。
テーブル名 | 概要 | 備考 |
---|---|---|
pgperf.snapshot | 取得したスナップショットのIDと取得時間を保存します | |
pgperf.snapshot_pg_stat_database | pg_stat_databaseシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_database_size | データベースのサイズを保存します | |
pgperf.snapshot_pg_stat_user_tables | pg_stat_user_tablesシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_statio_user_tables | pg_statio_user_tablesシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_stat_user_indexes | pg_stat_user_indexesシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_statio_user_indexes | pg_statio_user_indexesシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_statio_user_sequences | pg_statio_user_sequencesシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_stat_user_functions | pg_stat_user_functionsシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_relation_size | テーブルおよびインデックスのサイズを保存します | |
pgperf.snapshot_pg_current_xlog | トランザクションログの挿入位置/書き込み位置を保存します | |
pgperf.snapshot_pg_stat_bgwriter | pg_stat_bgwriterシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_stat_activity | pg_stat_activityシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_locks | pg_locksシステムビューのスナップショットを保存します | |
pgperf.snapshot_pg_statistic | pg_statisticsシステムテーブルのスナップショットを保存します | |
pgperf.snapshot_pg_stat_statements | pg_stat_statementsビューのスナップショットを保存します | 8.4以降のみ |
pgperf.snapshot_pgstattuple | pgstattuple関数の実行結果のスナップショットを保存します | |
pgperf.snapshot_pgstatindex | pgstatindex関数の実行結果をスナップショットを保存します |
pgperf.snapshotテーブル¶
スナップショット関数で取得したスナップショットのスナップショットIDおよび取得時間を保持するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | 単調増加 |
ts | timestamp | スナップショット取得時刻 | |
level | integer | スナップショットレベル |
pgperf.snapshot_pg_stat_databaseテーブル¶
アクセス統計情報を取得する pg_stat_database
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
datid | oid | pg_stat_database.datid | |
datname | name | pg_stat_database.datname | |
numbackends | integer | pg_stat_database.numbackends | |
xact_commit | bigint | pg_stat_database.xact_commit | |
xact_rollback | bigint | pg_stat_database.xact_rollback | |
blks_read | bigint | pg_stat_database.blks_read | |
blks_hit | bigint | pg_stat_database.blks_hit | |
tup_returned | bigint | pg_stat_database.tup_returned | |
tup_fetched | bigint | pg_stat_database.tup_fetched | |
tup_inserted | bigint | pg_stat_database.tup_inserted | |
tup_updated | bigint | pg_stat_database.tup_updated | |
tup_deleted | bigint | pg_stat_database.tup_deleted | |
conflicts | bigint | pg_stat_database.conflicts | 9.1以降のみ |
stats_reset | timestampz | pg_stat_database.stats_reset | 9.1以降のみ |
pgperf.snapshot_pg_database_sizeテーブル¶
データベースのサイズを取得する pg_database_size()
関数のスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
datname | name | pg_database.datname | |
pg_database_size | bigint | pg_database_size() |
pgperf.snapshot_pg_stat_user_tablesテーブル¶
アクセス統計情報を取得する pg_stat_user_tables
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
relid | oid | pg_stat_user_tables.relid | |
schemaname | name | pg_stat_user_tables.schemaname | |
relname | name | pg_stat_user_tables.relname | |
seq_scan | bigint | pg_stat_user_tables.seq_scan | |
seq_tup_read | bigint | pg_stat_user_tables.seq_tup_read | |
idx_scan | bigint | pg_stat_user_tables.idx_scan | |
idx_tup_fetch | bigint | pg_stat_user_tables.idx_tup_fetch | |
n_tup_ins | bigint | pg_stat_user_tables.n_tup_ins | |
n_tup_upd | bigint | pg_stat_user_tables.n_tup_upd | |
n_tup_del | bigint | pg_stat_user_tables.n_tup_del | |
n_tup_hot_upd | bigint | pg_stat_user_tables.n_tup_hot_upd | |
n_live_tup | bigint | pg_stat_user_tables.n_live_tup | |
n_dead_tup | bigint | pg_stat_user_tables.n_dead_tup | |
last_vacuum | timestampz | pg_stat_user_tables.last_vacuum | |
last_autovacuum | timestampz | pg_stat_user_tables.last_autovacuum | |
last_analyze | timestampz | pg_stat_user_tables.last_analyze | |
last_autoanalyze | timestampz | pg_stat_user_tables.last_autoanalyze | |
vacuum_count | bigint | pg_stat_user_tables.vacuum_count | 9.1以降のみ |
autovacuum_count | bigint | pg_stat_user_tables.autovacuum_count | 9.1以降のみ |
analyze_count | bigint | pg_stat_user_tables.analyze_count | 9.1以降のみ |
autoanalyze_count | bigint | pg_stat_user_tables.autoanalyze_count | 9.1以降のみ |
pgperf.snapshot_pg_statio_user_tablesテーブル¶
アクセス統計情報を取得する pg_statio_user_tables
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
relid | oid | pg_statio_user_tables.relid | |
schemaname | name | pg_statio_user_tables.schemaname | |
relname | name | pg_statio_user_tables.relname | |
heap_blks_read | bigint | pg_statio_user_tables.heap_blks_read | |
heap_blks_hit | bigint | pg_statio_user_tables.heap_blks_hit | |
idx_blks_read | bigint | pg_statio_user_tables.idx_blks_read | |
idx_blks_hit | bigint | pg_statio_user_tables.idx_blks_hit | |
toast_blks_read | bigint | pg_statio_user_tables.toast_blks_read | |
toast_blks_hit | bigint | pg_statio_user_tables.toast_blks_hit | |
tidx_blks_read | bigint | pg_statio_user_tables.tidx_blks_read | |
tidx_blks_hit | bigint | pg_statio_user_tables.tidx_blks_hit |
pgperf.snapshot_pg_stat_user_indexesテーブル¶
アクセス統計情報を取得する pg_stat_user_indexes
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
relid | oid | pg_stat_user_indexes.relid | |
indexrelid | oid | pg_stat_user_indexes.indexrelid | |
schemaname | name | pg_stat_user_indexes.schemaname | |
relname | name | pg_stat_user_indexes.relname | |
indexrelname | name | pg_stat_user_indexes.indexrelname | |
idx_scan | bigint | pg_stat_user_indexes.idx_scan | |
idx_tup_read | bigint | pg_stat_user_indexes.idx_tup_read | |
idx_tup_fetch | bigint | pg_stat_user_indexes.idx_tup_fetch |
pgperf.snapshot_pg_statio_user_indexesテーブル¶
アクセス統計情報を取得する pg_statio_user_indexes
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
relid | oid | pg_statio_user_indexes.relid | |
indexrelid | oid | pg_statio_user_indexes.indexrelid | |
schemaname | name | pg_statio_user_indexes.schemaname | |
relname | name | pg_statio_user_indexes.relname | |
indexrelname | name | pg_statio_user_indexes.indexrelname | |
idx_blks_read | bigint | pg_statio_user_indexes.idx_blks_read | |
idx_blks_hit | bigint | pg_statio_user_indexes.idx_blks_hit |
pgperf.snapshot_pg_statio_user_sequencesテーブル¶
アクセス統計情報を取得する pg_statio_user_sequences
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
relid | oid | pg_statio_user_sequences.relid | |
schemaname | name | pg_statio_user_sequences.schemaname | |
relname | name | pg_statio_user_sequences.relname | |
blks_read | int8 | pg_statio_user_sequences.blks_read | |
blks_hit | int8 | pg_statio_user_sequences.blks_hit |
pgperf.snapshot_pg_stat_user_functionsテーブル¶
アクセス統計情報を取得する pg_stat_user_functions
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
funcid | oid | pg_stat_user_functions.funcid | |
schemaname | name | pg_stat_user_functions.schemaname | |
funcname | name | pg_stat_user_functions.funcname | |
calls | int8 | pg_stat_user_functions.calls | |
total_time | int8 | pg_stat_user_functions.total_time | |
self_time | int8 | pg_stat_user_functions.self_time |
pgperf.snapshot_pg_relation_sizeテーブル¶
テーブルおよびインデックスのサイズを取得する pg_relation_size()
, pg_total_relation_size()
関数のスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
schemaname | name | pg_stat_user_tables.schemaname, pg_stat_user_indexes.schemaname | |
relid | oid | pg_stat_user_tables.relid, pg_stat_user_indexes.indexrelid | |
relname | name | pg_class.relname | |
pg_relation_size | bigint | pg_relaion_size() | |
pg_total_relation_size | bigint | pg_total_relaion_size() | 対象がテーブルの場合のみ有効 |
pgperf.snapshot_pg_current_xlogテーブル¶
トランザクションログの位置を取得する pg_current_xlog_location()
, pg_current_xlog_insert_location()
関数のスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
location | text | pg_current_xlog_location() | |
insert_location | text | pg_current_xlog_insert_location() |
pgperf.snapshot_pg_stat_bgwriterテーブル¶
バックグラウンドライタ統計情報を取得する pg_stat_bgwriter
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
checkpoints_timed | bigint | pg_stat_bgwriter.checkpoints_timed | |
checkpoints_req | bigint | pg_stat_bgwriter.checkpoints_req | |
checkpoint_write_time | double precision | pg_stat_bgwriter.checkpoint_write_time | 9.2以降のみ |
checkpoint_sync_time | double precision | pg_stat_bgwriter.checkpoint_sync_time | 9.2以降のみ |
buffers_checkpoint | bigint | pg_stat_bgwriter.buffers_checkpoint | |
buffers_clean | bigint | pg_stat_bgwriter.buffers_clean | |
maxwritten_clean | bigint | pg_stat_bgwriter.maxwritten_clean | |
buffers_backend | bigint | pg_stat_bgwriter.buffers_backend | |
buffers_backend_fsync | bigint | pg_stat_bgwriter.buffers_backend_fsync | 9.1以降のみ |
buffers_alloc | bigint | pg_stat_bgwriter.buffers_alloc | |
stats_reset | timestampz | pg_stat_bgwriter.stats_reset | 9.1以降のみ |
pgperf.snapshot_pg_stat_activityテーブル¶
セッション情報を取得する pg_stat_activity
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
datid | oid | pg_stat_activity.datid | |
datname | name | pg_stat_activity.datname | |
procpid | int4 | pg_stat_activity.procpid | 9.1以前 |
pid | int4 | pg_stat_activity.pid | 9.2以降 |
usesysid | oid | pg_stat_activity.usesysid | |
usename | name | pg_stat_activity.usename | |
application_name | text | pg_stat_activity.application_name | 9.0以降 |
client_addr | inet | pg_stat_activity.client_addr | |
client_hostname | text | pg_stat_activity.client_hostname | 9.1以降 |
client_port | int4 | pg_stat_activity.client_port | |
backend_start | timestamptz | pg_stat_activity.backend_start | |
xact_start | timestamptz | pg_stat_activity.xact_start | |
query_start | timestamptz | pg_stat_activity.query_start | |
state_change | timestamptz | pg_stat_activity.state_change | 9.2以降 |
waiting | bool | pg_stat_activity.waiting | |
state | text | pg_stat_activity.state | 9.2以降 |
current_query | text | pg_stat_activity.current_query | 9.1以前 |
query | text | pg_stat_activity.query | 9.2以降 |
pgperf.snapshot_pg_locksテーブル¶
ロック情報を取得する pg_locks
システムビューのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
locktype | text | pg_locks.locktype | |
database | oid | pg_locks.database | |
relation | oid | pg_locks.relation | |
page | int4 | pg_locks.page | |
tuple | int2 | pg_locks.tuple | |
virtualxid | text | pg_locks.virtualxid | |
transactionid | xid | pg_locks.transactionid | |
classid | oid | pg_locks.classid | |
objid | oid | pg_locks.objid | |
objsubid | int2 | pg_locks.objsubid | |
virtualtransaction | text | pg_locks.virtualtransaction | |
pid | int4 | pg_locks.pid | |
mode | text | pg_locks.mode | |
granted | bool | pg_locks.granted | |
fastpath | bool | pg_locks.fastpath | 9.2以降 |
pgperf.snapshot_pg_statisticテーブル¶
オプティマイザ統計情報を保持する pg_statistic
システムテーブルのスナップショットを保存するテーブルです。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
starelid | oid | pg_statistic.starelid | |
starelname | name | pg_class.relname | |
staattnum | smallint | pg_statistic.staattnum | |
staattname | name | pg_attribute.attname | |
stainherit | boolean | pg_statistic.stainherit | 9.0以降 |
stanullfrac | real | pg_statistic.stanullfrac | |
stawidth | integer | pg_statistic.stawidth | |
stadistinct | real | pg_statistic.stadistinct | |
stakind1 | smallint | pg_statistic.stakind1 | |
stakind2 | smallint | pg_statistic.stakind2 | |
stakind3 | smallint | pg_statistic.stakind3 | |
stakind4 | smallint | pg_statistic.stakind4 | |
stakind5 | smallint | pg_statistic.stakind5 | 9.2以降 |
staop1 | oid | pg_statistic.staop1 | |
staop2 | oid | pg_statistic.staop2 | |
staop3 | oid | pg_statistic.staop3 | |
staop4 | oid | pg_statistic.staop4 | |
staop5 | oid | pg_statistic.staop5 | 9.2以降 |
stanumbers1 | real[] | pg_statistic.stanumbers1 | |
stanumbers2 | real[] | pg_statistic.stanumbers2 | |
stanumbers3 | real[] | pg_statistic.stanumbers3 | |
stanumbers4 | real[] | pg_statistic.stanumbers4 | |
stanumbers5 | real[] | pg_statistic.stanumbers5 | 9.2以降 |
stavalues1 | text | pg_statistic.stavalues1 | |
stavalues2 | text | pg_statistic.stavalues2 | |
stavalues3 | text | pg_statistic.stavalues3 | |
stavalues4 | text | pg_statistic.stavalues4 | |
stavalues5 | text | pg_statistic.stavalues5 | 9.2以降 |
pgperf.snapshot_pg_stat_statementsテーブル¶
セッション統計情報を取得する pg_stat_statements
システムビューのスナップショットを保存するテーブルです。アドオンモジュール pg_stat_statements
をインストール、設定している場合のみ有効です。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
userid | oid | pg_stat_statements.userid | |
dbid | oid | pg_stat_statements.dbid | |
query | text | pg_stat_statements.query | |
calls | bigint | pg_stat_statements.calls | |
total_time | double precision | pg_stat_statements.total_time | |
rows | bigint | pg_stat_statements.rows | |
shared_blks_hit | bigint | pg_stat_statements.shared_blks_hit | |
shared_blks_read | bigint | pg_stat_statements.shared_blks_read | |
shared_blks_dirtied | bigint | pg_stat_statements.shared_blks_dirtied | 9.2以降 |
shared_blks_written | bigint | pg_stat_statements.shared_blks_written | |
local_blks_hit | bigint | pg_stat_statements.local_blks_hit | |
local_blks_read | bigint | pg_stat_statements.local_blks_read | |
local_blks_dirtied | bigint | pg_stat_statements.local_blks_dirtied | 9.2以降 |
local_blks_written | bigint | pg_stat_statements.local_blks_written | |
temp_blks_read | bigint | pg_stat_statements.temp_blks_read | |
temp_blks_written | bigint | pg_stat_statements.temp_blks_written | |
blk_read_time | double precision | pg_stat_statements.blk_read_time | 9.2以降 |
blk_write_time | double precision | pg_stat_statements.blk_write_time | 9.2以降 |
pgperf.snapshot_pgstattupleテーブル¶
テーブルのフラグメンテーション情報を取得する pgstattuple()
関数のスナップショットを保存するテーブルです。アドオンモジュール pgstattuple
をインストール、設定している場合のみ有効です。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
schemaname | name | pg_stat_user_tables.schemaname | |
relname | name | pg_stat_user_tables.relname | |
table_len | int8 | pgstattuple().table_len | |
tuple_count | int8 | pgstattuple().tuple_count | |
tuple_len | int8 | pgstattuple().tuple_len | |
tuple_percent | float8 | pgstattuple().tuple_percent | |
dead_tuple_count | int8 | pgstattuple().dead_tuple_count | |
dead_tuple_len | int8 | pgstattuple().dead_tuple_len | |
dead_tuple_percent | float8 | pgstattuple().dead_tuple_percent | |
free_space | int8 | pgstattuple().free_space | |
free_percent | float8 | pgstattuple().free_percent |
pgperf.snapshot_pgstatindexテーブル¶
インデックスのフラグメンテーション情報を取得する pgstatindex()
関数のスナップショットを保存するテーブルです。アドオンモジュール pgstattuple
をインストール、設定している場合のみ有効です。
カラム名 | データ型 | 取得元 | 備考 |
---|---|---|---|
sid | integer | スナップショットID | |
schemaname | name | pg_stat_user_indexes.schemaname | |
relname | name | pg_stat_user_indexes.relname | |
indexrelname | name | pg_stat_user_indexes.indexrelname | |
version | int4 | pgstatindex().version | |
tree_level | int4 | pgstatindex().tree_level | |
index_size | int8 | pgstatindex().index_size | |
root_block_no | int8 | pgstatindex().root_block_no | |
internal_pages | int8 | pgstatindex().internal_pages | |
leaf_pages | int8 | pgstatindex().leaf_pages | |
empty_pages | int8 | pgstatindex().empty_pages | |
deleted_pages | int8 | pgstatindex().deleted_pages | |
avg_leaf_density | float8 | pgstatindex().avg_leaf_density | |
leaf_fragmentation | float8 | pgstatindex().leaf_fragmentation |
pt-table-usage¶
概要¶
テーブルの使用状況を表示します。
実行方法¶
pt-table-usage [option...]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
-o, --owner=STRING
-n, --schema=STRING
-t, --table=STRING
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
-o
, --owner
オプションは、指定した文字列に合致する名前のユーザが所有者となっているテーブルの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-n
, --schema
オプションは、指定した文字列に合致する名前のスキーマにあるテーブルの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-t
, --table
オプションは、指定した文字列に合致する名前のテーブルの情報のみを表示します。スラッシュで挟むことで正規表現を指定することもできます(例: /REGEXP/
)。
-d
(または --dbname
), -o
(または --owner
), -n
(または --schema
), -t
(または --table
) を同時に指定した場合には、すべての条件に合致するテーブルのみが表示対象となります。
出力項目¶
OID |
テーブルのオブジェクトID |
OWNER |
テーブルの所有者のユーザ名 |
SCHEMA |
テーブルの存在しているスキーマ名 |
TABLE |
テーブル名 |
BLKS |
テーブルのブロック数(8kB単位) |
SCAN |
シーケンシャルスキャンの実行回数 |
T_READ |
シーケンシャルスキャンによって取得されたタプル数 |
T_INS |
挿入されたタプル数 |
T_UPD |
更新されたタプル数(HOT UPDATEを含む) |
T_DEL |
削除されたタプル数 |
B_READ |
ディスクから読み込まれたテーブルのブロック数 |
B_HIT |
共有バッファから読み込まれたテーブルのページ数 |
VACUUMED |
最後にVACUUMされた日時(VACUUMコマンドおよび自動VACUUMのいずれか) |
ANALYZED |
最後にANALYZEされた日時(ANALYZEコマンドおよび自動ANALYZEのいずれか) |
TABLESPACE |
テーブルの配置されているテーブルスペース名。 |
実行例¶
localhost
のポート 5432
で動作しているPostgreSQLインスタンスに接続し、dbt3
データベースの全テーブルの利用状況を表示します。
$ pt-table-usage -d dbt3
+---------+-------+--------+----------+--------+------+----------+---------+-------+-------+--------+---------+----------+---------------------+------------+
| OID | OWNER | SCHEMA | TABLE | BLKS | SCAN | T_READ | T_INS | T_UPD | T_DEL | B_READ | B_HIT | VACUUMED | ANALYZED | TABLESPACE |
+---------+-------+--------+----------+--------+------+----------+---------+-------+-------+--------+---------+----------+---------------------+------------+
| 1273410 | snaga | public | customer | 3531 | 5 | 750000 | 150000 | 0 | 0 | 6499 | 29943 | | 2015-03-08 18:31:41 | ssdspc1 |
| 1273416 | snaga | public | lineitem | 106583 | 12 | 66656465 | 6001215 | 0 | 0 | 240547 | 1340871 | | 2015-03-08 18:31:42 | ssdspc1 |
| 1273419 | snaga | public | nation | 1 | 4 | 100 | 25 | 0 | 0 | 1 | 5 | | 2015-03-08 18:31:42 | ssdspc1 |
| 1273413 | snaga | public | orders | 25326 | 5 | 7500000 | 1500000 | 0 | 0 | 48612 | 208386 | | 2015-03-08 18:31:41 | ssdspc1 |
| 1273404 | snaga | public | part | 4064 | 3 | 600000 | 200000 | 0 | 0 | 6082 | 26558 | | 2015-03-08 18:31:40 | ssdspc1 |
| 1273407 | snaga | public | partsupp | 17087 | 5 | 4000000 | 800000 | 0 | 0 | 32200 | 148518 | | 2015-03-08 18:31:41 | ssdspc1 |
| 1273422 | snaga | public | region | 1 | 3 | 15 | 5 | 0 | 0 | 1 | 4 | | 2015-03-08 18:31:42 | ssdspc1 |
| 1273401 | snaga | public | supplier | 218 | 4 | 40000 | 10000 | 0 | 0 | 220 | 1802 | | 2015-03-08 18:31:40 | ssdspc1 |
+---------+-------+--------+----------+--------+------+----------+---------+-------+-------+--------+---------+----------+---------------------+------------+
$
localhost
のポート 5432
で動作しているPostgreSQLインスタンスに接続し、dbt3
データベースにあるテーブルのうち、 pa
で始まる名前のテーブルの利用状況を表示します。
$ pt-table-usage -d dbt3 -t /^pa/
+---------+-------+--------+----------+-------+------+---------+--------+-------+-------+--------+--------+----------+---------------------+------------+
| OID | OWNER | SCHEMA | TABLE | BLKS | SCAN | T_READ | T_INS | T_UPD | T_DEL | B_READ | B_HIT | VACUUMED | ANALYZED | TABLESPACE |
+---------+-------+--------+----------+-------+------+---------+--------+-------+-------+--------+--------+----------+---------------------+------------+
| 1273404 | snaga | public | part | 4064 | 3 | 600000 | 200000 | 0 | 0 | 6082 | 26558 | | 2015-03-08 18:31:40 | ssdspc1 |
| 1273407 | snaga | public | partsupp | 17087 | 5 | 4000000 | 800000 | 0 | 0 | 32200 | 148518 | | 2015-03-08 18:31:41 | ssdspc1 |
+---------+-------+--------+----------+-------+------+---------+--------+-------+-------+--------+--------+----------+---------------------+------------+
$
pt-tablespace-usage¶
実行方法¶
pt-tablespace-usage [option...]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-U, --username=USERNAME
-d, --dbname=DBNAME
--help
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
出力項目¶
TABLESPACE |
テーブルスペース名 |
DBNAME |
データベース名(pg_globalテーブルスペースの場合は空欄) |
SIZE (MB) |
テーブルスペース内でデータベースのオブジェクトが使っている容量(MB単位) |
実行例¶
ローカルホストのポート 5432
で動作するPostgreSQLインスタンスの postgres
データベースに接続し、各テーブルスペースのうち、各データベースの使用している容量を表示します。
$ pt-tablespace-usage -d postgres
+------------+-----------+-----------+
| TABLESPACE | DBNAME | SIZE (MB) |
+------------+-----------+-----------+
| pg_default | postgres | 8 |
| pg_default | template1 | 6 |
| pg_default | testdb | 8 |
| pg_global | | 1 |
| spc1 | postgres | 16 |
+------------+-----------+-----------+
pt-verify-checksum¶
概要¶
指定したPostgreSQLのファイルのチェックサムを検証します。
チェックサムを有効にしてデータベースクラスタを作成している必要があります。 (initdb
コマンドの -k
オプション)
PostgreSQL 9.3以降のバージョンが対象です。
このスクリプトは内部で verifychecksum
コマンドを呼び出します。Red Hat Enterprise Linux 6/CentOS 6以外のOSで動作させる場合は、src/verifychecksum.c
を別途ビルドして bin
ディレクトリ以下に配置する必要があります。
実行方法¶
pt-verify-checksum [option...] [segment file | directory]
引数としてファイル名を指定した場合には、そのファイルのチェックサムを検証します。
引数としてディレクトリ名を指定した場合には、そのディレクトリにあるファイルのうち、以下のファイルを対象としてチェックサムを検証します。
global
またはbase
ディレクトリ以下にあり、かつ、- ファイル名が数字で構成されるもの(例:
1234
、1234.1
)、および末尾に_vm
または_fsm
が付与されているファイル(例:1234_vm
、1234_fsm
)
チェックサム検証で1つ以上のファイルにエラーが見つかった場合には終了コード 1
を返します。それ以外のエラーが発生した場合には終了コード 2
を返します。どのファイルにも問題がなかった場合には 0
を返します。
オプション¶
-r, --recursive
-v, --verbose
--help
-r
, --recursive
オプションは、ディレクトリを指定した場合に、サブディレクトリ以下を再帰的にスキャンし、該当するファイルのチェックサムを検証します。
-v
, --verbose
オプションは、チェックサム検証中により多くのメッセージを出力します。
出力項目¶
blkno |
チェックサムエラーの見つかったブロック番号 |
expected |
ブロックのデータから計算されたチェックサム |
found |
ページヘッダに記録されていたチェックサム |
Verified N files |
チェックサムの検証をしたファイル数 |
N files corrupted |
チェックサムのエラーの見つかったファイル数 |
実行例¶
単一のファイルのチェックサムを検証します。
$ pt-verify-checksum /var/lib/pgsql/9.4/data/base/16386/16399
[2015-03-28 15:50:03] INFO: Verified 1 files. 0 files corrupted.
$
データベース内のすべてのファイルのチェックサムを検証します。
$ pt-verify-checksum /var/lib/pgsql/9.4/data/base/16386
[2015-03-28 15:51:00] INFO: Verified 311 files. 0 files corrupted.
$
データベースクラスタ内を再帰的に探索し、すべてのファイルのチェックサムを検証します。
$ pt-verify-checksum -r /var/lib/pgsql/9.4/data
[2015-03-28 15:55:16] INFO: /var/lib/pgsql/9.4/data/base/12144/11905: blkno 7, expected 2cf, found da97
[2015-03-28 15:55:16] INFO: 1 blocks corrupted in /var/lib/pgsql/9.4/data/base/12144/11905.
[2015-03-28 15:55:16] INFO: Verified 1046 files. 1 files corrupted.
$
pt-xact-stat¶
概要¶
複数ノードのトランザクションの統計状況を表示します。指定したインターバルごとに連続的に表示することも可能です。
実行方法¶
pt-xact-stat [option...] [delay [count]]
オプション¶
-h, --host=HOSTNAME
-p, --port=PORT
-H, --host-list=HOSTLIST
-U, --username=USERNAME
-d, --dbname=DBNAME
-H, --host-list=HOSTNAME:PORT,HOSTNAME:PORT[,...]
-h
, --host
オプションは、接続するPostgreSQLデータベースのサーバ名またはIPアドレスを指定します。オプションが指定されない場合は、PGHOST環境変数に設定された値が使われます。PGHOST環境変数が設定されていない場合には、デフォルトの値として localhost
が使われます。
-p
, --port
オプションは、接続するPostgreSQLデータベースのポート番号を指定します。オプションが指定されない場合は、PGPORT環境変数に設定された値が使われます。PGPORT環境変数が設定されていない場合には、デフォルトの値として 5432
が使われます。
-H
, --host-list
オプションは、接続するPostgreSQLサーバが複数ある場合にデータベースのサーバ名またはIPアドレスとポート番号の組み合わせを複数指定します。書式は 192.168.1.101:5432,192.168.1.102:5433
のように、一組のサーバ名とポート番号をコロン :
で連結し、複数のサーバをカンマ ,
で連結します。ポート番号は省略可能で、省略した場合はデフォルトのポート番号が使われます。
-U
, --username
オプションは、PostgreSQLデータベースに接続するユーザ名を指定します。オプションが指定されない場合は、PGUSER環境変数に設定された値が使われます。PGUSER環境変数が設定されていない場合には、USER環境変数に設定された値が使われます。
-d
, --dbname
オプションは、接続するデータベース名を指定します。オプションが指定されない場合は、PGDATABASE環境変数に設定された値が使われます。PGDATABASE環境変数が設定されていない場合には、データベースに接続するユーザ名と同じ名前のデータベースに接続します。
出力項目¶
HOST |
PostgreSQLサーバのホスト名 |
PORT |
PostgreSQLサーバのポート番号 |
DBNAME |
データベース名 |
CONN |
データベースに接続しているセッション数 |
COMMITS |
コミットされたトランザクション総数 |
ROLLBACKS |
ロールバックされたトランザクション総数 |
B_READ |
ディスクから読み込まれたテーブルのブロック数 |
B_HIT |
共有バッファから読み込まれたテーブルのページ数 |
実行例¶
ローカルホストのポート5432とポート5433で動作している2つのPostgreSQLインスタンスに接続して、各インスタンスのトランザクションの統計情報を5秒おきに2回表示します。
$ pt-xact-stat --host-list 127.0.0.1:5432,127.0.0.1:5433,127.0.0.1:5434 -d postgres 5 2
Sat Mar 28 20:47:50 JST 2015
+-----------+------+----------+------+---------+-----------+--------+-------+
| HOST | PORT | DBNAME | CONN | COMMITS | ROLLBACKS | B_READ | B_HIT |
+-----------+------+----------+------+---------+-----------+--------+-------+
| 127.0.0.1 | 5432 | postgres | 1 | 137 | 1 | 104 | 10273 |
| 127.0.0.1 | 5433 | postgres | 1 | 8 | 0 | 104 | 1350 |
| 127.0.0.1 | 5434 | postgres | 1 | 76 | 0 | 104 | 7708 |
+-----------+------+----------+------+---------+-----------+--------+-------+
Sat Mar 28 20:47:55 JST 2015
+-----------+------+----------+------+---------+-----------+--------+-------+
| HOST | PORT | DBNAME | CONN | COMMITS | ROLLBACKS | B_READ | B_HIT |
+-----------+------+----------+------+---------+-----------+--------+-------+
| 127.0.0.1 | 5432 | postgres | 1 | 139 | 1 | 104 | 10460 |
| 127.0.0.1 | 5433 | postgres | 1 | 10 | 0 | 104 | 1537 |
| 127.0.0.1 | 5434 | postgres | 1 | 78 | 0 | 104 | 7895 |
+-----------+------+----------+------+---------+-----------+--------+-------+
$
ローカルホストのポート5432, ポート5433, ポート5434で動作している3つのPostgreSQLインスタンスに接続して、各インスタンスのトランザクションの統計情報を1回表示して終了します。
$ pt-xact-stat --host-list 127.0.0.1:5432,127.0.0.1:5433,127.0.0.1:5434 -d postgres
Sat Mar 28 21:05:48 JST 2015
+-----------+------+----------+------+---------+-----------+--------+-------+
| HOST | PORT | DBNAME | CONN | COMMITS | ROLLBACKS | B_READ | B_HIT |
+-----------+------+----------+------+---------+-----------+--------+-------+
| 127.0.0.1 | 5432 | postgres | 1 | 12 | 0 | 104 | 1400 |
| 127.0.0.1 | 5433 | postgres | 1 | 4 | 0 | 104 | 976 |
| 127.0.0.1 | 5434 | postgres | 1 | 4 | 0 | 104 | 976 |
+-----------+------+----------+------+---------+-----------+--------+-------+
$