web-dev-qa-db-ja.com

生の物理ファイルからpostgreSQLデータベースを回復する

次の問題があり、修正する方法があるかどうかを知る必要があります。

私のクライアントには、会社を運営するメインシステムで彼のpostgreSQLデータベースのバックアップ計画を購入することを断るほど安く、いつか起こると思っていたため、ブラックアウト中に一部のOSファイルがクラッシュし、OSを再インストールする必要があります。

このクライアントにはデータベースのバックアップはありませんでしたが、PostgreSQLのメインディレクトリを保存できました。私はデータベースが何らかの方法でpostgresメインフォルダーのデータディレクトリに格納されていることを読みました。

私の質問は:データフォルダーからのみデータベースを回復する方法はありますか? PostgreSQL 8.2がインストールされたWindows環境(XP Service Pack 2)で作業していて、新しいサーバーにPostgreSQLを再インストールする必要があります。新しい環境でデータベースを再作成し、古いデータベースを新しいデータベースインスタンスに接続する必要があります。エンジンがデータベースを保存する方法が原因でSQL Serverでそれが可能であることは知っていますが、私はpostgresの手がかりがありません。

何か案は?彼らは大歓迎です。

26
Alvos

データフォルダ全体がある場合は、必要なすべてが揃っています(アーキテクチャが同じである限り)。何かをコピーしなかった場合に備えて、これを一掃する前に別のマシンで復元してみてください。

データディレクトリをディスクに保存するだけです。 Postgresを起動するときに、データディレクトリの場所を伝えるパラメータを設定します( wiki.postgresql.org を参照)。または、新規インストールの元のデータディレクトリを削除し、その場所にコピーを配置します。

20
Konrad Garus

これは可能です。「postgresインストールフォルダー内の」「データ」フォルダーを古いコンピューターから新しいコンピューターにコピーする必要がありますが、いくつか注意する点があります。

まず、ファイルをコピーする前に、Postgresサーバーサービスを停止する必要があります。したがって、コントロールパネル->管理ツール->サービスの順に選択し、Postgresサービスを見つけて停止します。ファイルのコピーと権限の設定が完了したら、もう一度起動します。

次に、データファイルの権限を設定する必要があります。 postgresサーバーは実際には別のユーザーアカウントで実行されるため、データフォルダーにコピーするだけではファイルにアクセスできません。したがって、ファイルの所有権を「postgres」ユーザーに変更する必要があります。私は subinacl を使用する必要があり、最初にインストールしてから、次のようなコマンドプロンプトから使用しました(最初に、インストールしたフォルダーに移動します)。

subinacl /subdirectories "C:\Program Files\PostgreSQL\8.2\data\*" /setowner=postgres

(エクスプローラから所有権を変更することも可能です:最初に、フォルダオプションで[シンプルファイル共有を使用する]を無効にする必要があります。次に、[セキュリティ]タブがフォルダの[プロパティ]ダイアログに表示され、そこに権限を設定するオプションがあります。所有権を変更しましたが、その方法で変更することはできませんでした)。

これで、サーバーサービスを手動で再開した後、サーバーサービスを開始できない場合は、通常、イベントビューア(管理ツール->イベントビューア)で理由を確認できます。 Postgresはエラーイベントをスローし、それを検査すると問題が何であるかについての手がかりが得られます(postmaster.pidファイルについて不平を言う、ただ削除するなど)。

5
kolufild

私はそうしますが、最もトリッキーな部分は所有者の許可を変更することでした:

  1. 管理ツールからサービスに移動
  2. postgresサービスを見つけてダブルクリックします
  3. ログオン時にローカルシステムに変更
  4. その後、再起動します
0
user2615084

質問は非常に古いですが、私が見つけた効果的な方法を共有したいと思います。

「pg_dump」でバックアップを取得しておらず、古いデータがフォルダーである場合は、次の手順を試してください。 Postgresデータベースで、「pg_database」テーブルにレコードを追加します。マネージャープログラムまたは「に挿入」。必要なチェックを行い、次の挿入クエリを変更して実行します。

クエリは、機能した後にOIDを返します。この番号の名前でフォルダを作成します。古いデータをこのフォルダにコピーすると、使用の準備が整います。



    /*
    ------------------------------------------
    *** Recover From Folder ***
    ------------------------------------------
    Check this table on your own system.
    Change the differences below.
    */
    INSERT INTO
      pg_catalog.pg_database(
      datname, datdba, encoding, datcollate, datctype, datistemplate, datallowconn,
      datconnlimit, datlastsysoid, datfrozenxid, datminmxid, dattablespace, datacl)
    VALUES(
                             -- Write Your collation  
      'NewDBname', 10, 6, 'Turkish_Turkey.1254', 'Turkish_Turkey.1254',
      False, True, -1, 12400, '536', '1', 1663, Null);

    /*
    Create a folder in the Data directory under the name below New OID.
    All old backup files in the directory "data\base\Old OID" are the directory with the new OID number
    Copy. The database is now ready for use.
    */
    select oid from pg_database a where a.datname = 'NewDBname';

0
Zeki Gürsoy