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

概要

トランザクションログファイルを安全にアーカイブ処理します。

archive_command パラメータから呼び出すコマンドとして利用します。

実行方法

pt-archive-xlog <XLOGFILEPATH> <DESTDIR>

オプション

特になし。

出力項目

アーカイブ成功時には 0 を、失敗時には 1 を返却します。

実行例

postgresql.confarchive_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 スレーブノードの状態です。 startupbackupcatchupstreaming のいずれかを取る。
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

概要

ネットワークトラフィックをキャプチャし、PostgreSQLのセッションを検出してクエリおよびパフォーマンス情報を表示します。

tcpdumpを実行するため、 root 権限が必要です。

実行方法

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
pgperf.purge_snapshots()関数
概要

パフォーマンス統計情報の古いスナップショットを一括して削除します。

定義
integer pgperf.purge_snapshots(interval period);
引数
引数名 引数型 内容
period interval 削除するスナップショットの期間

period で指定された期間(インターバル)より前に作成されたスナップショットを削除します。

interval 型の記述方法の詳細については、PostgreSQLのマニュアルを参照してください。

pgperf.get_interval()関数
概要

指定した2つのスナップショットの間隔を秒数で取得します。

パフォーマンス分析を行うスクリプト等を作成する際、この値を使用することによって容易に単位秒あたりの数値に変換することができます。

定義
integer pgperf.get_interval(integer snapid1, integer snapid2)
引数
引数名 引数型 内容
snapid1 integer スナップショットID
snapid2 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 ディレクトリ以下にあり、かつ、
  • ファイル名が数字で構成されるもの(例: 12341234.1)、および末尾に _vm または _fsm が付与されているファイル(例: 1234_vm1234_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 |
+-----------+------+----------+------+---------+-----------+--------+-------+

$

リリースノート

バージョン0.2.1

  • Python 2.7がデフォルトのRed Hat Enterprise Linux 7、CentOS 7およびUbuntu 14.04 LTSをサポート対象として追加。
  • ヘルプメッセージの修正。 (pt-index-usage, pt-set-tablespace, pt-table-usage)

バージョン0.2.0

  • 最初のリリースバージョン