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 ユーザが重複しているといったエラーが出るかもしれませんが、無視しても構いません。
移動前のデータベースディレクトリを削除する
移動前のデータベースディレクトリを、そのまま単純に削除します。これで、作業は完了です。