前置き
9月末からMySQLの空間データを試し始め、忙しくてまだデータインポートしか記事にできていませんが、待望のPostgreSQL 9.5がベータ版になりWindows上でも使えるようになったので先に書きます。
これまでポータブルなPostgreSQL実行環境としてPostgreSQL Portableというパッケージの使用や、いったんインストーラで入れたのを手動でポータブル化したりしました(関連記事:5月23日)。今回はまた違う方法として、EnterpriseDB社のサイトで配布されているZIPを使い、手動で①ファイルの配置、②データベース初期化、③起動・再起動・終了用バッチファイル作成」と三つの作業をします。
ポータブルと言っても別途Visual C++のランタイムが必要で、今回は既にPCに入ってる前提。というか手元のPCでランタイムがない(ほとんどソフトウェアを入れてないような)PCがなく、必要なファイルを特定したくてもできない状況でした。そのうち調べて書きます。
実行環境
- Windows7 32bit
- コマンドプロンプトの代わりにConEmu 150513を使用
関連サイト・記事一覧
インストーラでなくZIP版をダウンロード
前項に挙げたEnterpriseDB - Download PostgreSQL BinariesからWindows用を入手。ボタンをクリックすれば即ダウンロードできます。ただメニューのマウスオーバでボタンが隠れたり(画像二つ目)、ダウンロード後に別のページに飛んだり(同三つ目)、昔より分かりづらくなりました。
ダウンロードしたpostgresql-9.5.0-beta1-windows-binaries.zipは、PostgreSQL本体、psqlなどクライアントツール、pgAdmin、contrib(付属の拡張機能)などが揃ってます。
ZIPのサイズは約50MB、全部解凍すると180MB近くになりますが、今回はbin、libおよびshareフォルダだけ使用。これがあればデータベースサーバ起動とpsql、contribが使えるはず。ただしcontribは未確認で、いずれpostgres_fdwなどをインストールする際に確認して記事にします。
↓ bin、lib、shareフォルダだけを解凍し適当な場所に配置。フォルダは後から自由に移動できます。サイズは約60MBでした。次はデータベース初期化。
initdbコマンドでデータベースを初期化
解凍したbinフォルダ内にあるinitdbを手動で実行します。5月2日の記事ではバッチファイル化したけど、どうせ一行だし再実行することはめったにないので、今回は ↓ こんな風にコンソールで行いました。-Dに続くパスがデータフォルダ。またデフォルトロケールをCに設定。
$ cd
R:\pgsql_9.5.0_beta1
$ "bin/initdb" -U postgres -D data -E utf8 --locale=C
データベースシステム内のファイルの所有者は"*****"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。
データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索設定はenglishに設定されました。
データベージのチェックサムは無効です。
ディレクトリdataを作成しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 128MB
selecting dynamic shared memory implementation ... windows
設定ファイルを作成しています ... ok
data/base/1にtemplate1データベースを作成しています ... ok
pg_authidを初期化しています ... ok
依存関係を初期化しています ... ok
システムビューを作成しています ... ok
システムオブジェクトの定義をロードしています ... ok
照合順序を作成しています ... このプラットフォームではサポートされません
変換を作成しています ... ok
ディレクトリを作成しています ... ok
組み込みオブジェクトに権限を設定しています ... ok
情報スキーマを作成しています ... ok
PL/pgSQL サーバサイド言語をロードしています ... ok
template1データベースをバキュームしています ... ok
template1からtemplate0へコピーしています ... ok
template1からpostgresへコピーしています ... ok
データをディスクに同期しています...ok
警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ン、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。
Success. You can now start the database server using:
"bin\pg_ctl" -D "data" -l logfile start
問題なければ最後にSuccess.と表示されて終わります。作成されたデータフォルダの中に ↓ postgresql.confなど設定ファイルもあり。この時点ではサーバはまだ起動していません。
サービスでなく、バッチファイル一つで起動・再起動・終了を制御
プログラム、データと同じ場所にバッチファイルを作り、これ一つでPostgreSQLの起動・再起動・終了をコントロールさせます。プログラムとデータの場所をバッチファイルからの相対パスで書き、親フォルダ全体を自由に移動できるように。
バッチファイルは5月3日の記事と同じで、最初にPIDファイルの有無でサーバが起動中か否か判断し、未起動なら自動的に開始してpress [R] to restart PostgreSQL, [Q] to quit : とプロンプトを出して待機。既に起動していればその旨のメッセージを出して止まります。後はCtrl-C等でバッチ自身を強制終了させればOK。スマートじゃないけど。
↓ 起動時の様子。ログをファイルに出す指定をしてないので(pg_ctlのオプションで可能)コンソールにログが出てバッチファイルの出すプロンプト表示に割り込んでます。動作自体は変わりなく、R打鍵で再起動、Qで終了、それ以外は再度プロンプトを出します。
サーバは起動中です。
press [R] to restart PostgreSQL, [Q] to quit :
LOG: database system was shut down at 2015-10-12 21:24:38 JST
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
上の状態から再起動させてみると ↓ こんな感じ。
付属のpsqlは日本語メッセージが正常(文字化けなし)
9.4の時はpsqlの日本語メッセージが文字化けして、ライブラリを差し替えたり(3月12日)GNU Octave付属のを使ったり(7月21日)しましたが、9.5.0 Beta 1付属のpsqlは正常。たぶん他のコマンドラインツールも、またインストーラ版に付属のも同じだと思います。
$ cd
R:\pgsql_9.5.0_beta1
$ "bin/psql" -U postgres
psql (9.5beta1)
"help" でヘルプを表示します.
postgres=# SELECT version();
version
----------------------------------------------------------------
PostgreSQL 9.5beta1, compiled by Visual C++ build 1800, 32-bit
(1 行)