7月13日追記:移行先ディレクトリへのアクセス権限について
一般的なEnterpriseDB社のインストーラで入れた後、PostgreSQLのデータディレクトリの場所だけ変える簡単な例のメモです。簡単とは言え「サービス」の設定変更が必要で、その際Windowsのレジストリを修正するので、ExcelやAccessのファイルのコピベのようにはいきません。 でも本質は、PostgreSQLが起動する時にデータの場所をちゃんと教える、それだけのこと。面倒or難しそうに見えるのはWindows自体の変な仕組みにあると思います(だからポータブル版がいいのですが、今回は置いといて)。以下Windows 7 32bit + PostgreSQL 9.3.5、管理者権限ユーザで行った経過です。
データベース停止と、データディレクトリのコピー
PostgreSQLを停止する簡単な方法は、pgAdminのメニューから行うことです。下の画像のように、データベースを選択 → 右クリック → サーバ停止を選択。メニューの言語やフォントが普通と少し違うのは、自分の個人的なカスタマイズなので気にしないで下さい。
サーバ停止は、次で説明する「サービス」画面でも可能です。ともかくいったん停めてデータディレクトリへの書き込みを全て終了させてから、好きな場所にディレクトリごとコピー(移動でもいいけど、万一に備えて)。今回、インストール時は下のようにC:/PostgreSQL/9.3/に入れており、そこのdataが元のデータディレクトリになります。
Cドライブ
 ┗ PostgreSQL
   ┗ 9.3
    ┣ bin
    ┣ data ← 元のデータディレクトリ
    ┣ doc
    ┣ ……

7月13日追記:移行先ディレクトリへのアクセス権限について

移行先ディレクトリを準備したら、ユーザ「Network Service」またはグループ「Authenticated Users」にアクセス権限(フルコントロールまたは変更)があるか確認し、なければ付与します。 Network ServiceはWindows版PostgreSQLの「サービス」の実行ユーザで、これがグループ「Authenticated Users」に所属しています(参考:VBForums : Is NT AUTHORITY/NETWORK SERVICE considered an authenticated user?)。Win版PostgreSQLインストーラでは、データディレクトリにNetwork Serviceのフルコントロール権限が設定されていると思います。
実際のところ、今回の作業は管理者ユーザで行うのが一般的で(標準ユーザでは普通サービス修正できない)、Windows7では管理者ユーザで作ったファイルやディレクトリに自動的にAuthenticated Usersグループの読み書き権限が与えられるようです。だから今まで、移行先ディレクトリへの読み書き権限を気にしなくとも問題が起きなかったですが、そうでない場合を考えて追記しました。 (追記おわり)
PostgreSQLの「サービス」を確認
Windowsの「サービス」設定画面は、コントロールパネルからも開けますが階層が深くて不便なので、「ファイル名を指定して実行」にservices.mscと入力して ↓ 実行するといいです。以下、途中で出るセキュリティ関連のダイアログはすべて省略しています。
たくさん表示される「サービス」から、postgresql-9.3という名前のを ↓ 見つけてダブルクリック ↓ PostgreSQLのサービスの詳細が出ます。中ほどの「実行ファイルのパス」がPostgreSQL起動時のコマンドで、いろいろ引数がありますが-D の次がデータディレクトリの場所。これを引っ越し先のディレクトリに変えればいいわけですが、この画面では変更できません。そこで次に、レジストリを修正します。
この詳細画面で「サービスの状態」が停止になっていない場合は、ボタンで停止できます。pgAdminを使わず最初からそうやっても可。あと、PostgreSQL起動コマンドpg_ctl.exeの詳細は下記にあります。 » PostgreSQL 9.3.2文書 : pg_ctl -- PostgreSQLサーバの初期化、起動、停止、制御
レジストリ修正
先ほどと同様「ファイル名を指定して実行」に ↓ regeditと入力することで、レジストリエディタを起動します。 レジストリをルートから辿るのは面倒なので、メニューの編集 → 検索画面を開きます。探すためのキーワードは、先ほどのPostgreSQLサービスの詳細に行き当たれば何でもよく、pg_ctlあたりが少ない文字数かつ他ともかぶりにくく、良いかと。一応、修正する場所は ↓ です。
\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\postgresql-9.3
当該レジストリを見つけたら ↓ ImagePathというキーを開きます。これがPostgreSQL起動コマンドで、-D の次を、新しいデータディレクトリの場所に書き替えます。修正はこれだけ。 ところでレジストリには、同じ内容のPostgreSQLサービス詳細が別の場所にもあると思います(~ControlSet001でなくCurrentControlSetとか)。場合によってはCurrentControlSetを修正しないと反映されない、あるいはWindowsを再起動するまで変わらない等、いろいろなケースがあるかもしれず、自分も正直よく分かりません。ともかく今回はControlSet001を編集するだけで済みました。レジストリについては下記が詳しいです。 » 0から楽しむパソコン講座 : レジストリについて
サービス画面からPostgreSQLを再起動
先ほどのサービス設定画面に戻り、メニューで操作 → 最新の情報に更新してPostgreSQL 9.3のサービス詳細を開きます。この「実行ファイルのパス」が修正したレジストリどおりになっていたら成功、反映されていない場合はWindowsを再起動してみて、それでも駄目なら…困りますね(爆 ともかく今回は ↓ きちんと反映されてました。コマンドに書き込んだデータディレクトリに、実際にデータがあるのを確認してPostgreSQLサービスの開始ボタンを押します。正常に開始できれば、お疲れ様でした。
結果の確認
PostgreSQLを新しいデータディレクトリで開始できたら、ディレクトリ直下にpostmaster.pidという小さなファイルができているはずで ↓ これが起動中のPostgreSQLの標識のようなものです。 ↓ 念のためpsqlで接続しshow data_directory;を打って確認したところ。なおpsqlの最初に出ている警告は、自分が設定したコマンドプロンプト上の文字コード(コードページ)のせいで、今回の内容とは無関係です。