Windows環境でのPostgreSQLを使った案件の開発中のこと。
メンテナンス用にバックアップファイルからDBを復元できるように対応しているときにはまったのでメモを残しておこう。
DBのバックアップはWinのタスクで夜中に待避するように設定している。
復元はいざというときなのでこちらのタイミングで行いたい。
メンテ用のプログラムを作ることになり調べているとVBからは
pg_restore.exeをプロセスクラスを利用して起動することで対応ができそう。
早速試してみる。
引数にコマンドを指定することで、バックアップファイルは指定できるのだけれど復元はできず。
プロセスが止まったまま・・・あれ!?
同じ内容をコマンドプロンプトで試してみるとパスワード入力で止まっている。
どうやらこれが原因だったらしい。
しかし、パスワードの引数指定はヘルプを観たけど無い・・・o( ̄ー ̄;)ゞううむ
さらに調べてみるとPostgreSQLの設定でパスワードを保存しておくことができるのを知り試してみた。
■PostgreSQL8.4.2 ドキュメント パスワードファイル
Windowsの場合その設定ファイルのパスは、下記の通り。
ファイルの場所:%APPDATA%\postgresql\pgpass.conf
ファイル名:pgpass.conf
このファイルにユーザー名とパスワードを記述しておけばコマンドのパスワード認証が不要になるらしい。
ということでユーザー名とパスワードを記述して保存。
この状態でVBからのpg_restore.exe処理のプロセスを実行すると今度は無事にDB復元ができた。
(ノ´▽`)ノオオオオッ♪
Windows + PostgreSQLの組み合わせがここのところ続いているので
これが分かればいざというときのメンテが楽になる。
ちなみにVB側のコードはこのような感じ。
dumpFileName にバックアップのファイルをフルパスで指定
ポート番号、DB名を指定
Dim outProcess As New Process()
Dim dumpFileName As String = "D:\DBBackup\hogehoge.dump" 'バックアップファイル
-
'PostgreSQLのレストアプログラムを指定
outProcess.StartInfo.FileName = "C:\Program Files\PostgreSQL\8.4\bin\pg_restore.exe"
'指定のバックアップから復元を指定
outProcess.StartInfo.Arguments = " -i -h localhost -p ポート番号 -U postgres -w -d DB名 -c -v " & Chr(34) & dumpFileName.ToString() & Chr(34)
outProcess.StartInfo.UseShellExecute = False 'Shellを使わない
outProcess.StartInfo.CreateNoWindow = True 'Windowを開かない
outProcess.Start() 'プロセスを開始
outProcess.WaitForExit() '終了まで待機
-
outProcess.Close()
outProcess.Dispose()
outProcess = Nothing
-
- Download this code: postgresql_win_restore_sample.txt
他にも方法があることを発見 2010.04.27 20:30追記
環境変数PGPASSWORDにパスワードをセットすれば良いらしく
Environment.SetEnvironmentVariable(“PGPASSWORD”, “hogehoge”)
と定義してプロセスを実行すれば上記のPostgreSQLのパスワードファイルは指定しなくても良い
ということでこちらの方が簡単に実装できる。
ちなみにVB側のコードはこのような感じ。
環境変数PGPASSWORDにpostgresユーザーのパスワードを指定
dumpFileName にバックアップのファイルをフルパスで指定
ポート番号、DB名を指定
Dim outProcess As New Process()
Dim dumpFileName As String = "D:\DBBackup\hogehoge.dump" 'バックアップファイル
-
'PostgreSQLのpostgresユーザーのパスワードを環境変数にセット
Environment.SetEnvironmentVariable("PGPASSWORD", "hogehoge")
-
'PostgreSQLのレストアプログラムを指定
outProcess.StartInfo.FileName = "C:\Program Files\PostgreSQL\8.4\bin\pg_restore.exe"
'指定のバックアップから復元を指定
outProcess.StartInfo.Arguments = " -i -h localhost -p ポート番号 -U postgres -w -d DB名 -c -v " & Chr(34) & dumpFileName.ToString() & Chr(34)
outProcess.StartInfo.UseShellExecute = False 'Shellを使わない
outProcess.StartInfo.CreateNoWindow = True 'Windowを開かない
outProcess.Start() 'プロセスを開始
outProcess.WaitForExit() '終了まで待機
-
outProcess.Close()
outProcess.Dispose()
outProcess = Nothing
-
- Download this code: postgresql_win_restore_sample2.txt