• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PostgresのPITR)

PostgresのPITRについての質問

このQ&Aのポイント
  • 本番機と待機用のサーバでPostgresのデータを冗長化する際の疑問点について質問があります。
  • 本番機のログファイルが16MBになるまで掃き出されないため、本番機が消滅した場合には16MB分のログがなくなる可能性があるのかという疑問です。
  • 自作シェルで本番機のログファイルを待機用のサーバへ1分ごとにコピーする場合、archive_commandによる冗長化は必要かどうかを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada59
  • ベストアンサー率74% (29/39)
回答No.1

【質問 1】への回答 はい、アーカイブ先のディレクトリに保管されていない WAL ファイル分の更新は消失します。また、更新の頻度が高い場合には 1 つ以上の WAL ファイル分の更新が消失する可能性があります。 なお、WAL ファイルがアーカイブ先のディレクトリに保管されるのはサイズが 16MB になったときではありません。WAL ファイルは最初からデフォルトで 16MB 分のサイズが確保されており、メモリ上の更新がディスクに反映されて不要になった場合 (完了済み WAL ファイルになった場合) にアーカイブ先のディレクトリに保管されます。 【質問 2】への回答 前述のように WAL ファイルのサイズは最初から 16MB であり、完了済み WAL ファイルになっていない状態で保管しても、正常に復旧できない可能性があります。 WAL ファイルを強制的にアーカイブ先のディレクトリに保管する方法がいくつかあります。 1 つは以下のように pg_switch_xlog 関数を実行することです。 =# SELECT pg_switch_xlog(); もう 1 つは archive_timeout パラメータを設定することです。前回 WAL ファイルがアーカイブ先のディレクトリに保管されてから archive_timeout パラメータに指定した時間を経過するとアーカイブ先のディレクトリへの保管が強制的に行われます。ただ、WAL ファイルのサイズは 16MB に固定されているため、あまりに短い時間を指定してしまうとディスク容量を圧迫してしまいます。 いずれにしても PITR (ウォームスタンバイ) では WAL ファイルがアーカイブ先のディレクトリに保管されるのは非同期なので更新が消失することは回避できません。 9.0 で追加されたストリーミングレプリケーションを使用すれば、16MB の WAL ファイル単位ではなく WAL レコード単位でデータを同期できるので、消失する更新はより少なくなります。とは言え、ストリーミングレプリケーションも非同期なので更新が消失することは回避できません。 更新の消失を回避するには、pgpool-II などの同期レプリケーションのミドルウェアを使用するか、現在、開発中の 9.1 で追加される同期のストリーミングレプリケーションを使用する必要があります。

tama2002
質問者

お礼

詳しく説明いただきまして、ありがとうございます。 おかげで、わからなかった事がほとんど、理解できたのですが、1点だけ質問があります。 WAL ファイルがアーカイブ先のディレクトリに保管されるタイミングですが、 >メモリ上の更新がディスクに反映されて不要になった場合 とありますが、ディスクに反映されるのは、どのくらいの量(単位、頻度)なのでしょうか? たとえば、メモリ上の更新が100MBあり、これがディスクに反映されたとすると、 16MB分のアーカイブログがたくさん出来るのかと想像します。 とすると、ディスクに反映されないうちは、この100MB分が消失すると思われますが、 どうでしょうか? すみません、わかりづらくなってしまいましたが、 知りたいのはメモリ上の更新がディスクに反映されるタイミングです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yamada59
  • ベストアンサー率74% (29/39)
回答No.2

【No.1 の回答へのお礼での質問】への回答 メモリ上のすべての更新をディスクに反映する処理のことをチェックポイント処理と呼びます。チェックポイント処理は、完了済み WAL ファイルが checkpoint_segments パラメータに指定された個数を超えたとき、または、前回のチェックポイント処理の実行から checkpoint_timeout パラメータに指定された時間を過ぎたときに実行されます。 ただ、チェックポイント処理ですべての更新を一気に反映すると、一時的にディスク I/O への高負荷が発生してしまうので、チェックポイント処理とは別に少しずつディスクに反映させる writer プロセスが動作しています。 また、チェックポイント処理は CHECKPOINT コマンドで手動で実行することもできます。 ディスクに未反映の更新がメモリ上に存在しており、チェックポイント処理が実行されていない場合には、完了済み WAL ファイルとなっておらず、アーカイブ先のディレクトリに保管されません。従って、アーカイブ先のディレクトリに保管する前の WAL ファイルが消失した場合には、その WAL ファイル分の更新は復旧することができません。

参考URL:
http://www.postgresql.jp/document/9.0/html/wal-configuration.html
tama2002
質問者

お礼

詳しくありがとうございました。 おかげで疑問が解決しました。 (ベストアンサーは最初の回答の方にいれておきます)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQLとPostgresの同時使用

    基本的な質問で申し訳ありません。1台のLinuxサーバ(CentOS)に、MySQLとPostgresの両方をインストールして、同時に起動し、別のデータベースとして使用することはできるのでしょうか?

  • postgresのサービスが起動しないです

    Windows Server2008に「postgresql-8.4.4」をインストールしたいと思っています。 一度、エラーなくインストールが完了したのですが、dataフォルダをDドライブに作成するはずが Cドライブに作ってしまった為、アンインストールを行いました。 作成先を直して、再インストールを行ったところ、途中で下記のエラーが表示され、 サービスの起動が出来なくなってしまいました。 A non_fatal error occured whilst loading database modules. Please check the installation log in C:\Users\Administrator\AppData\Local\Temp for details. アンインストール後に行ったこと ・net user /deleteを使用して、postgresユーザーの削除 ・Program Files(86x)のpostgresフォルダの削除 ・C:\ユーザー\Administrator\AppData内のpostgresフォルダの削除 ・dataフォルダの削除 インストールは、管理者として実行でインストールしています。 インストールする為に、まだ何かしないといけないことがあるのでしょうか? おわかりになる方、アドバイス頂けないでしょうか? 宜しくお願いします。

  • PostgreSQLのリプリケーション アーカイブ

    実行環境  OS:win7 64bit     プライマリーとスタンバイをローカルLANで接続  PosgreSQLのバージョン:9.4 以下のように設定しました。 A.プライマリのpostgres.confを修正    1.wal_level=hot_standby    2.max_wal_sender=3    3.archive_mode=off    4・wal_keep_segment=8 B.basebackupを行う C.スタンバイの設定    1.recovery.conf       standby_mode='on'       primary_conninfo='host=192.168.1.100 port=5432 user=repli possword=xxx'    2.postgres.conf       hot_stndby=on 以上のように設定すると、リプリケーションが可能ですが、 これをアーカイブモードにすると、COPYコマンドでエラーが発生します。 プライマリサーバーにアーカイブ場所を設定すればエラーは出ないのですが、 スタンバイ側に設定するとエラーになります。 アーカイブのコマンドは  プライマリのpostgres.confに   archive_mode=on   archive_command='copy "c:\\postgresql\\data\\%p" "\\standbyPC\\srch\\%f""' と設定しています。 この設定でサービスを起動すると、以下のようなLOGが出力されます。 指定されたパスが見つかりません。 2015-08-16 07:48:25 JST LOG: アーカイブコマンドがリターンコード 1で失敗しました 2015-08-16 07:48:25 JST 詳細: 失敗したアーカイブコマンドは次のとおりです: copy "c:\PostgreSQL\data\pg_xlog\000000010000000000000019" "\standbyPC\PostgreSQL\arch\000000010000000000000019"  コマンドプロンプトから実行すると、正常にコピーされます。 どこが間違っているのでしょうか?

  • HAモニタについて

    HAモニタについて質問させて下さい。 私が担当しているシステムは サーバ2台(unixサーバ)をHaモニタにて、hirdbユニット(fes,bes)の監視を行い、障害時に待機系に切り替えをすることをしています。 開発環境で以下のことってできるのでしょうか。 開発環境はサーバが一台で、本番機で障害が発生した想定でHirdbのユニットが待機系に全て片寄された状態を作りたいです。 HAモニタのマニュアルを見ると当然のことながら2台以上が前提で書かれているため、実現できないのかと若干諦めかけています。。

  • アーカイブログモードの変更について

    環境:Oracle9i 9.2.0 サーバOS:WinXp(テスト環境) サーバの容量が足りない為、アーカイブログモードを解除しようと思っています。 (1)解除の方法ってOEMでできるのでしょうか? (2)アーカイブログファイルを物理的に削除した場合は  アーカイブログモードにしていても無意味でしょうか? (3)アーカイブログファイルは日付単位で作られているように見えますが、指定した日付のデータに戻したい場合などはその日のアーカイブログファイルを使用するのでしょうか? なにぶん経験が浅く、ご迷惑をおかけしますが、 ご教授お願いいたします。

  • CD-Rの上書き追記で旧データが読出し不能に

    HDDにあった600MBのデータ(ロータスノーツのメールアーカイブデータ)をCD-Rに保存しました。 保存後、HDDのメールを消去し、しばらく経ってHDDに50MBまで溜まったメールアーカイブデータを同じCD-Rに追記しました。 その際、アーカイブデータファイル名を前回と同じものにしてしまったため、読み出せるメールデータは新しい50MB分のみとなり、古い600MB分は読み出せなくなってしまいました。 プロパティを見ると、CD-Rの容量は650MBですが、格納されているファイルは今回追記した50MB分のみです。 CD-Rには、読み出せないものの旧データが格納されているはずと思います。 読み出せなくなってしまった旧データを、再度読み出すことは可能でしょうか?

  • 印刷ログの記録について

    ここでプリントサーバや複合機について、皆様に丁寧に教えていただき、印刷すると、データ出力完了したことになるので、印刷したデータはプリントサーバや複合機には残らないとわかりました。あり がとうごさいました。 では印刷ログはどうでしょうか?データ出力後はどちらかに残るのでしょうか? 残ってた場合、印刷ログから再印刷は可能でしょうか?

  • Oracle インスタンスの exp について

    Oracle9iR2(9.2.0.8) EE を使用しています。(OS は HP-UX 64bit) テストの為、開発環境でインスタンスの定義の exp を行ったところ数分で終了しました。 ところが、いざ本番環境で同様の作業を行ったところ、3時間以上たっても終了しませんでした。 この2環境の差 ・初期化パラメータの差はアーカイブログモードか否か。(本番がアーカイブログモード) ・データ量が本番(150GB程度) >> 開発(30GB程度) 本番環境での exp 中 40MB 程度の dmp を出力するのに 60GB 程度のアーカイブログを出力しており、 event を確認すると log file sync が頻繁に発生していました。 (サイズは中断したので最終的にはもっと増える可能性が有りました。) 作業中 DB アクセスは本 exp のみで他の作業は行っていませんでした。 また、本作業中サーバの vmstat を確認していたのですが、ほぼ常時 idle 80% を占めていました。 disk 上の空容量も十分にある状態でした。 実行した exp のコマンドは下記のとおりです。(開発、本番両環境共) exp system/password@sid file=instance_def.dmp log=instance_def.log full=y compress=n rows=n direct=y 上記 exp コマンドのパフォーマンス劣化を解消する方法についてご教示願います。 インスタンスの設定を no archive log モードに変更する必要が有ったのでしょうか? または、他に何か懸念される設定や、データ量の差等の影響が有りますでしょうか。 よろしくお願いいたします。

  • 時間の差分

    初めまして。 早速質問をさせていただきたいと思います。 postgresとPHPを使って開発中です。 postgresでは、timestamp without time zone型にデータを保存しております。 それを取得して、現在の時間との差分が1分以内だったら・・・という処理を したいのですが、mktime()を使ったり、strtotime()を使ったりして ためしたのですが、うまくいきません。 //$date → postgresから取得したtimestamp $diff = time() - strtotime($date); if ($diff < 60) {   ** 処理 ** } ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • postgres 強制的に連番を取得する事は可能?

    postgres 強制的に連番を取得する事は可能ですか? 例えば、IPアドレスの最後の桁と用途を管理するテーブルがあるとします。 table_a ( item1 integer, -- IPアドレスの最後の桁 item2 character varying -- 用途 ) item1 item2 ----- ----- 1 デフォルトゲートウェイ 3 複合機 11 サーバー1 12 NAS 21 A氏のPC 22 B氏のPC 23 C氏のPC これを0から255まで空きを含めて一覧で表にしたいという場合、何か方法ありませんか? item1 item2 ----- ----- 0 1 デフォルトゲートウェイ 2 3 複合機 4 5 6 7 8 9 10 11 サーバー1 12 NAS 13 14 15 16 17 18 19 20 21 A氏のPC 22 B氏のPC 23 C氏のPC : 255 以下の2つは思いつきますが、あまりやりたくありません。 ・1件1件ぐるぐる回してSQLを発行する。 ・0から255の値を固定で持ったテーブルを別途作成し、それに対してジョインする。 1つのSQLで発行する方法はありませんか?