DATE : 2006/08/13 (Sun)
ある日データディレクトリのある C ドライブの空き領域を確かめてみました。すると、残り600MB程度しかありません。そこで、空いている別のドライブへとデータディレクトリを移動しようと思い立ちました。
実際はもっとスマートな方法があるのかもしれませんが、とりあえずこの方法でできたので、忘れないうちにメモしておこうと思います。
なお、PostgreSQL のバージョンは 8.1.4、OS は Windows XP Home Edition SP2 を対象としています。
大まかには、次のような手順になります。
- データベースをファイルに書き出す
- データベースクラスタを新たに作成する
- PostgreSQL データベースサーバのサービスを修正する
- データベースクラスタにデータベースを復元する
- 古いデータベースディレクトリを削除する
データベースをファイルに書き出す
PostgreSQL の全データベースを書き出すために、pg_dumpall コマンドを使います。例えば、db.out ファイルにデータベースを書き出すには、次のようにコマンドを実行します。(ここで、行頭の「>」はプロンプトを表します)
> pg_dumpall > db.out
データベースクラスタを新たに作成する
データベースクラスタとは、1つのサーバで管理されるデータベースの集まりのことを言います。ここでは、別のドライブに新しいデータベースクラスタを作成します。
具体的には、initdb コマンドを使用してデータベースクラスタを作ります。
ただし、initdb は管理者権限のあるユーザでは起動できません。PostgreSQL では、セキュリティ上の理由から、管理者権限ではデータベースサーバに関わる処理を実行できません。
しかし、Windows 版の PostgreSQL の場合、インストール時に PostgreSQL 用のアカウントが作られています。初期設定では postgres なので、ここでは postgres アカウントとします。そのため、initdb を postgres アカウントで実行します。
具体的には、postgres アカウントで起動したコマンドプロンプトで initdb を実行することになります。スタートメニューからの場合は、コマンドプロンプトのところで右クリックメニューを開き、「別ユーザとして実行(A)...」で起動します(もしくは、runas コマンドで別ユーザとしてのコマンドプロンプトを開きます)。
D ドライブ直下の data フォルダをデータディレクトリにする場合は、次のようにコマンドを実行します。(ただし、data フォルダは未作成か、空でなければなりません)
> initdb -D d:/data -E UTF8 --locale=C -U postgres
-d オプションはデータディレクトリ、-E オプションはデータベースクラスタの文字エンコーディングを表します。
PostgreSQL データベースサーバのサービスを修正する
ここで、PostgreSQL データベースサーバが起動している場合は、停止させておきます。
コントロールパネルからサービスの一覧を開き、「PostgreSQL Database Server 8.1」のプロパティ内にある「実行ファイルのパス」欄を見ると、-D オプションに移動前のデータベースディレクトリのパスが設定されています。そのため、-D オプションの設定を、新たに作成したデータベースディレクトリに設定し直します。
しかし、「実行ファイルのパス」欄は編集不可になっています。そこで、レジストリから「実行ファイルのパス」を編集します。
スタートメニューの「ファイル名を指定して実行(R)...」で、「regedit」と入力してレジストリエディタを起動します。
レジストリの「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgsql-8.1」の「ImagePath」を変更します。
変更後、「PostgreSQL Database Server 8.1」を起動できれば、変更は完了です。
データベースクラスタにデータベースを復元する
次のコマンドを実行して、新しいデータベースクラスタにデータベースを復元します。
> psql -U postgres -f db.out
db.out には postgres ユーザの情報も格納されています。そのため、postgres ユーザが重複しているといったエラーが出るかもしれませんが、無視しても構いません。
移動前のデータベースディレクトリを削除する
移動前のデータベースディレクトリを、そのまま単純に削除します。これで、作業は完了です。
参考文献
DATE : 2006/08/12 (Sat)
pg_hba.conf ファイルを編集すると、クライアントがデータベースサーバにアクセスする際の認証方式を設定することができます。(通常、pg_hba.conf は、データディレクトリ直下にあります)
何も設定していない場合の pg_hba.conf は次のようになっています。(Windows XP SP2 上の PostgreSQL 8.14 の場合)
# TYPE DATABASE USER CIDR-ADDRESS METHOD # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust
ここで、それぞれの列は次のような内容となっています。
- TYPE
- 接続方法を表します。host は、TCP/IP 接続を表しています(ただし、通常は localhost からの TCP/IP 接続のみ行えます)。
- DATABASE
- 認証の対象とするデータベースの名前を表します。all は、全てのデータベースを表します。
- USER
- 認証の対象とするユーザ(ロール)の名前を表します。all は、全てのユーザ(ロール)を表します。
- CIDR-ADDRESS
- 認証の対象とする IP アドレスの範囲です。上の例では、PostgreSQL サーバを実行しているマシン自身の IP アドレスを表しています。
- METHOD
- 認証方式を表します。trust は、認証を行わない、つまり、パスワードなしでデータベースサーバにアクセスできることを表します。
ここで、ローカルからのアクセスでも認証を行うには、上の設定を次のように変更します。
# TYPE DATABASE USER CIDR-ADDRESS METHOD # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
各設定の METHOD を、trust から md5 に変えました。こうすることで、パスワード認証を行うことができます。なお、md5 とは、クライアントとサーバの間でパスワードを暗号化してやりとりする方式です。ちなみに、password と設定すると、パスワードを平文でやりとりします。(他の方法は、参考文献を参照してください)
1人でデータベースを扱う場合は Trust 認証でもよいのですが、複数人で扱う可能性のある場合は、パスワード認証にした方がよさそうです。