web-dev-qa-db-ja.com

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

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

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

3
Sean Preston

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

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

  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 
     
    

    または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 
     
    

    上記に類似したsuでpostgresになる

  8. dump_file.sqlを新しいサーバーのユーザー名などに適合させます。そこで適切な所有権を持つ空のデータベースを作成します
  9. データベースを新しいサーバーにスキャンします:
     Sudo -u postgres psql -p/path/to/socket/for/new/directory new_database_name 
     
    

    もう一度、上記と同様のsuを使用してpostgres特権を取得します

それはあなたを設定するか、少なくともそこに到達するための良い道を示すはずです。

15
Bernd Haug