ファイルシステムのバックアップからPostgreSQLデータベースを回復する

ファイルシステムのバックアップからPostgreSQLデータベースを回復する

PostgreSQL 8.3 データ ディレクトリのバックアップがあります。このバックアップから新しい PostgreSQL インスタンスにデータベースをコピーする必要があります。古いサーバーの問題のため、データベースの pg_dump を実行できません。

問題のデータベースのディレクトリがわかりました。たとえば、MySQL では通常、サーバーをシャットダウンし、ディレクトリをコピーして再起動するだけで、データベースが使用可能になります。しかし、これは PostgreSQL では機能しません。これは、データベースが global/pg_database ファイルにリストされていないためだと思われます。このファイルは PostgreSQL の起動時に自動生成されるようですが、データベースが存在することをシステムに伝えるにはどうすればよいのでしょうか。

答え1

PostgreSQLでは、クラスタデータディレクトリは自己完結型のユニットであり、ドキュメントに記載されているように、部分的に確実に復元することはできないことに注意してください。ここ

最善の策は、古いサーバーの完全なデータ ディレクトリを使用して、その上でサーバーを起動し、そこから取得したデータベースのダンプから復元することです。

  1. 新しいホストの設定に適合する postgresql.conf を取得します (ここで変更する古いデータ ディレクトリと新しいデータ ディレクトリのファイルを確認してください)。
  2. 古いインストールの PostgreSQL スーパーユーザーのユーザー名 (おそらく postgres) を確認します。
  3. 既に存在しない場合は、新しいホストにこのユーザー名 (UNIX ユーザー) を作成します。
  4. uid が古いサーバーのものと一致する必要がある場合は、そのユーザーに古いデータ ディレクトリを付与 (chown) します。
  5. 古いデータ ディレクトリの pg_hba.conf を構成して、ローカル ユーザーから同じ postgres ユーザー名への接続を許可します (通常はこれがデフォルトですが、確認してください)。
  6. 古いデータ ディレクトリのスーパーユーザーと同じ名前を持つ UNIX ユーザーとして古いデータベース クラスターを実行します (例: ユーザー postgres の場合)。
    sudo -u postgres postgres -D old_data_directory
    # or with su:
    su postgres
    postgres -D old_data_directory
    
  7. 通常のユーザー名 postgres を使用して、古いデータベースをダンプします。
    sudo -u postgres pg_dump -p /path/to/socket/for/old/directory database_name > dump_file.sql
    # becoming postgres with su analogous to above
    
  8. dump_file.sqlを新しいサーバーのユーザー名などに合わせて変更し、適切な所有権を持つ空のデータベースを作成します。
  9. データベースを新しいサーバーにスキャンします。
    sudo -u postgres psql -p /path/to/socket/for/new/directory new_database_name
    # once again, getting postgres privileges using su analogous to above
    

そうすれば準備は整うはずです、あるいは少なくともそこに到達するための良い道筋が示されるはずです。

関連情報