このエントリはPostgreSQL Advent Calendar2013の19日目になります。今回は便利ツールとして、今年作ったpgsqlenvの解説を書いてみました。
このツールは、いわゆるPostgreSQLに特化したhomebrew環境を構築するもので、コマンドでインストール、初期化、起動、終了そのほかの作業が行えます。githubで公開しています。
インストールは簡単で、gitから取得し、取得したあとでそこにパスを通すだけです。以下の例では、~/git/以下に展開するようにしています。
$ cd ~/git/
$ git clone http://github.com/yutakat/pgsqlenv/
$ export PATH=$PATH:~/git/pgsqlenv
pgsqlenv [オプション] コマンド バージョン [引数...]
が基本になります。オプションは2種類、-a (全体に実行)と-f (強制実行)があります。
例えば実際にバージョン9.3.2(最新)をインストールして起動させたい場合、以下の順でコマンドを実行します。
な お、ソースコードから自動でcontribこみでコンパイルしますので、ネットワーク接続などや、ダウンロードツールとしてのwget(指定)gccだのbison, flexだののインストールは必須になります。ソースコードは~/.pgsqlenv/pgsql-build/以下に、バイナリは~ /.pgsqlenv/versions/{バージョン名}/以下に格納され、PGDATAも~/.pgsqlenv/versions/{バージョン 名}/data/に自動的に設定されます。
各バージョンの管理もバラバラに行っていますので、同時に他のバージョンもインストール可能です。たとえばこのあと9.2.6をインストールしたい場合は同様に以下のようにします。
管理
複数のインストールを管理する機能もそれなりに充実しています。まっ先に重複して困るのはポート番号で、今先ほどインストールした9.2.6を起動しようとしても、デフォルトのポート番号5432を共有しているせいで動作しないはずです。これを簡単に変更できるよう、ポート番号の管理には専用のコマンドportとsetportを用意しています。
起動、終了、状態の取得はstart,stop,statusコマンドを使います。
PostgreSQLの各種コマンドを実行するためには、該当バージョンに自動で接続できるpsqlコマンドがあります。
ものぐさ向けの人には、自動で自分のユーザ名と同名のDBとユーザを作ってくれるsuperコマンドもあります。
同様に、cmdコマンドでpsql以外のコマンドも実行できます。たとえばpgbenchとかも以下の通り。
pg_dump等も実行できますので、先程作った9.2.6のデータを9.3.2に移行するのも以下のようなコマンドで簡単にできます。
基本的なところはまあ動作するように作ってありますが、まだまだ細かい部分で改善の余地があります
同 時に複数のPostgreSQLを使う、というのは実際にはあまりないとは思いますが、バージョンアップの検討、複数の案件がある場合、あるいは勉強のた めなど、意外に役にたつシーンは多いのではないでしょうか。これを機会に、ぜひ導入してpostgresqlでちょっと遊ぶのに役立てていただければ幸い です。
このツールは、いわゆるPostgreSQLに特化したhomebrew環境を構築するもので、コマンドでインストール、初期化、起動、終了そのほかの作業が行えます。githubで公開しています。
インストール
インストールは簡単で、gitから取得し、取得したあとでそこにパスを通すだけです。以下の例では、~/git/以下に展開するようにしています。
$ cd ~/git/
$ git clone http://github.com/yutakat/pgsqlenv/
$ export PATH=$PATH:~/git/pgsqlenv
使い方
pgsqlenv [オプション] コマンド バージョン [引数...]
が基本になります。オプションは2種類、-a (全体に実行)と-f (強制実行)があります。
例えば実際にバージョン9.3.2(最新)をインストールして起動させたい場合、以下の順でコマンドを実行します。
$ pgsqlenv install 9.3.2
downloading...OK
configuring...DONE
building...DONE
regression test...DONE
installing...DONE
building contrib...DONE
installing contrib...DONE
$ pgsqlenv initdb 9.3.2
9.3.2 : initdb completed
$ pgsqlenv start 9.3.2
9.3.2 : OK
な お、ソースコードから自動でcontribこみでコンパイルしますので、ネットワーク接続などや、ダウンロードツールとしてのwget(指定)gccだのbison, flexだののインストールは必須になります。ソースコードは~/.pgsqlenv/pgsql-build/以下に、バイナリは~ /.pgsqlenv/versions/{バージョン名}/以下に格納され、PGDATAも~/.pgsqlenv/versions/{バージョン 名}/data/に自動的に設定されます。
各バージョンの管理もバラバラに行っていますので、同時に他のバージョンもインストール可能です。たとえばこのあと9.2.6をインストールしたい場合は同様に以下のようにします。
$ pgsqlenv install 9.2.6
$ pgsqlenv initdb 9.2.6
管理
複数のインストールを管理する機能もそれなりに充実しています。まっ先に重複して困るのはポート番号で、今先ほどインストールした9.2.6を起動しようとしても、デフォルトのポート番号5432を共有しているせいで動作しないはずです。これを簡単に変更できるよう、ポート番号の管理には専用のコマンドportとsetportを用意しています。
$ pgsqlenv -a port
9.2.6 :5432
9.3.2 :5432
$ pgsqlenv setport 9.2.6 54392
9.2.6 :54392
$ pgsqlenv setport 9.3.2 54393
9.3.2 :54393
$ pgsqlenv -a port
9.2.6 :54392
9.3.2 :54393
起動、終了、状態の取得はstart,stop,statusコマンドを使います。
$ pgsqlenv status 9.2.6
9.2.6 :Not Running
$ pgsqlenv stop 9.3.2
9.3.2 :OK
$ pgsqlenv -a start
9.2.6 : OK
9.3.2 : OK
PostgreSQLの各種コマンドを実行するためには、該当バージョンに自動で接続できるpsqlコマンドがあります。
$ pgsqlenv psql 9.2.6 postgres
psql (9.2.6)
Type "help" for help.
postgres=# select version();
version
----------------------------------------------------------------------------------------------
PostgreSQL 9.2.6 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.7.2-5) 4.7.2, 64-bit
(1 row)
postgres=#
ものぐさ向けの人には、自動で自分のユーザ名と同名のDBとユーザを作ってくれるsuperコマンドもあります。
$ pgsqlenv super 9.2.6
9.2.6 : DONE
$ pgsqlenv psql 9.2.6
psql (9.2.6)
Type "help" for help.
yutaka=#
同様に、cmdコマンドでpsql以外のコマンドも実行できます。たとえばpgbenchとかも以下の通り。
yutaka@www:~$ pgsqlenv cmd 9.2.6 createdb bench
yutaka@www:~$ pgsqlenv cmd 9.2.6 pgbench -i bench
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_branches_pkey" for table "pgbench_branches"
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_tellers_pkey" for table "pgbench_tellers"
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_accounts_pkey" for table "pgbench_accounts"
vacuum...done.
yutaka@www:~$ pgsqlenv cmd 9.2.6 pgbench bench
starting vacuum...end.
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: 10
number of transactions actually processed: 10/10
tps = 292.269472 (including connections establishing)
tps = 324.422528 (excluding connections establishing)
pg_dump等も実行できますので、先程作った9.2.6のデータを9.3.2に移行するのも以下のようなコマンドで簡単にできます。
yutaka@www:~$ pgsqlenv -f initdb 9.3.2
9.3.2 : waiting for server to shut down.... done
server stopped
initdb completed
yutaka@www:~$ pgsqlenv setport 9.3.2 54393
9.3.2 :54393
yutaka@www:~$ pgsqlenv start 9.3.2
9.3.2 : OK
$ pgsqlenv cmd 9.2.6 pg_dumpall | pgsqlenv psql 9.3.2 postgres
(省略)
yutaka@www:~$ pgsqlenv cmd 9.3.2 pgbench bench
starting vacuum...end.
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: 10
number of transactions actually processed: 10/10
tps = 91.455329 (including connections establishing)
tps = 96.065171 (excluding connections establishing)
制限等
基本的なところはまあ動作するように作ってありますが、まだまだ細かい部分で改善の余地があります
- ポート番号の指定はinitdb時に消えます
- 本来pg_dumpは移行先で実行する必要がありますが、バージョンをまたがって接続するような機能がありません。
- 既存のマイナーバージョンのアップグレードには対応していません。8.4.5と8.4.6は完全に別バージョンとして取り扱われます。
最後に
同 時に複数のPostgreSQLを使う、というのは実際にはあまりないとは思いますが、バージョンアップの検討、複数の案件がある場合、あるいは勉強のた めなど、意外に役にたつシーンは多いのではないでしょうか。これを機会に、ぜひ導入してpostgresqlでちょっと遊ぶのに役立てていただければ幸い です。