Contents


前置き

9月末からMySQLの空間データを試し始め、忙しくてまだデータインポートしか記事にできていませんが、待望のPostgreSQL 9.5がベータ版になりWindows上でも使えるようになったので先に書きます。

これまでポータブルなPostgreSQL実行環境として
PostgreSQL Portableというパッケージの使用や、いったんインストーラで入れたのを手動でポータブル化したりしました(関連記事:523日)。今回はまた違う方法として、EnterpriseDB社のサイトで配布されているZIPを使い、手動で①ファイルの配置、②データベース初期化、③起動・再起動・終了用バッチファイル作成」と三つの作業をします。

ポータブルと言っても別途Visual C++のランタイムが必要で、今回は既にPCに入ってる前提。というか手元のPCでランタイムがない(ほとんどソフトウェアを入れてないような)PCがなく、必要なファイルを特定したくてもできない状況でした。そのうち調べて書きます。


実行環境



関連サイト・記事一覧




インストーラでなくZIP版をダウンロード

前項に挙げたEnterpriseDB - Download PostgreSQL BinariesからWindows用を入手。ボタンをクリックすれば即ダウンロードできます。ただメニューのマウスオーバでボタンが隠れたり(画像二つ目)、ダウンロード後に別のページに飛んだり(同三つ目)、昔より分かりづらくなりました。


ダウンロードしたpostgresql-9.5.0-beta1-windows-binaries.zipは、PostgreSQL本体、psqlなどクライアントツール、pgAdmin、contrib(付属の拡張機能)などが揃ってます。


ZIPのサイズは約50
MB、全部解凍すると180MB近くになりますが、今回はbin、libおよびshareフォルダだけ使用。これがあればデータベースサーバ起動とpsql、contribが使えるはず。ただしcontribは未確認で、いずれpostgres_fdwなどをインストールする際に確認して記事にします。


bin、lib、shareフォルダだけを解凍し適当な場所に配置。フォルダは後から自由に移動できます。サイズは約60
MBでした。次はデータベース初期化。


initdbコマンドでデータベースを初期化

解凍したbinフォルダ内にあるinitdbを手動で実行します。52日の記事ではバッチファイル化したけど、どうせ一行だし再実行することはめったにないので、今回は ↓ こんな風にコンソールで行いました。-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の起動・再起動・終了をコントロールさせます。プログラムとデータの場所をバッチファイルからの相対パスで書き、親フォルダ全体を自由に移動できるように。
example_start_pg95beta1.batSelectRawtextBitbucket
@echo off

set pgdir=./
set ctl=%pgdir%/bin/pg_ctl
set dir=%pgdir%/data
set pid=%dir%/postmaster.pid

if exist "%pid%" (
    echo postmaster.pid exists and PostgreSQL have been started possibly.
    goto ask
) else (
    "%ctl%" -D "%dir%" start
)

:ask
set /p inp="press [R] to restart PostgreSQL, [Q] to quit : "
if "%inp%"=="R" (
    "%ctl%" -D "%dir%" restart
    goto ask
) else if "%inp%"=="Q" (
    "%ctl%" -D "%dir%" stop
    goto :eof
)
goto ask

バッチファイルは
53日の記事と同じで、最初に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の日本語メッセージが文字化けして、ライブラリを差し替えたり(312日)GNU Octave付属のを使ったり(721日)しましたが、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 行)