読者です 読者をやめる 読者になる 読者になる

tom__bo’s Blog

情報系学生がプログラミングしたり、ボルダリングしたりボルダリングしたことを書くブログ。もはやダイアリー

CPAN Authorになった (Pgtoolsリリースした)

PostgreSQL Perl

Pgtoolsというツールを作りました。

github.com



遡ること去年の夏休み、、、
はてなインターンでの課題の一部として、PostgreSQL版のPercona toolkitがあると便利!というのが始まりだった気がする。

Percona toolkitというのは海外のMySQLコンサル会社が公開している、MySQL運用のためのコマンドラインツール。
pt-xxxという便利コマンド郡で、tcpdumpやログファイルから実行されているクエリのプロファイラ結果をまとめてくれたり、オンラインでスキーマを変更してくれるツールなど、とにかくいろいろある。


www.percona.com


これを参考に以下のコマンドを作った。

  • pg_config_diff
    • PGサーバを2つ以上指定して、そのサーバ間で設定の異なる部分を指摘してくれる
$ pg_config_diff  "192.168.33.21,5432,postgres,," "192.168.33.22,,,," "192.168.33.23,5432,postgres,,dvdrental"
<Setting Name>           192.168.33.21           192.168.33.22           192.168.33.23
--------------------------------------------------------------------------------------------
max_connections          50                      100                     100
shared_buffers           32768                   16384                   65536
tcp_keepalives_idle      8000                    7200                    10000
tcp_keepalives_interval  75                      75                      10
wal_buffers              1024                    512                     2048


.

  • pg_kill
    • 実行中のクエリの正規表現による検索・強制終了
    • 危険(--killオプションをつけることでクエリを強制終了させられる)
    • 実行時間や正規表現にマッチした特定のクエリでのフィルタリングも可能
    • killする場合は対象のクエリの実行ユーザがこのコマンドで指定するユーザと同じか、指定するユーザはsuperuserでないといけない(内部でpg_terminate_backend()を実行しているため
$ pg_kill -kill -print -mq "likes'%.*%'" "192.168.32.12,5432,postgres,,dvdrental"
-------------------------------
Killed-pid: 11590
At        : 2016/03/21 01:32:29
Query     : SELECT * FROM actor WHERE last_name like '%a%';
Killed matched queries!


このクエリは特に危険で、他のコマンドもそうだが、このコマンドによって何らかの障害が起きても責任は取りません。と言ったシロモノである。。。
ただ正規表現で実行中のクエリを検索できるのは便利だと思っていて、-mq (match query)オプションで表示できた時は楽しかった。


$ pg_fingerprint queries_file
SELECT * FROM user WHERE id = ?;
SELECT * FROM user2 WHERE id = ? LIMIT ?;
SELECT * FROM user2 WHERE point = ?;
SELECT * FROM user2 WHERE expression IS ?;


このブログを書いていて、
そういえばpt-query-digest相当のコマンドを作ろうと当時は息巻いていたんだった
と思い出したので、もう一度できるか検討しようと思います。

pg-fingerprintでSQL構文解析をしようと挑戦したものの、BNFSQL版のようなアレが異常に長くて、SELECT文だけにしても心が折れたので、どうなることやら、、、



ひとまず初めてCPANに"Ship it!"できて非常に満足しています。
DBをガッツリ扱うコマンドラインツールとしてはテストが不十分だと思うので、ちょこちょこ改善しなければ(機能追加もな!)


今回はMinillaを使ってモジュールの構築からリリースまでしました。
README.mdがうまく整形できなかったり(今も)、CPANにUNAUTHORIZED RELEASEの烙印を押されたり、いろいろしたので、そのあたりの知見も理解が深まったら書くつもりです。






owari ⊂゚U┬───┬~