事象
pg_rman によるバックアップ中に、以下のエラーが表示されて、処理が中断される。
$ pg_rman backup --backup-mode=full --with-serverlog --progress INFO: copying database files Processed 1183 of 1183 files, skipped 0 INFO: copying archived WAL files FATAL: cannot take a backupipped 0 DETAIL: There is a file with future timestamp from system time. Current system time may be rewound. HINT: The file is /mnt/data/pgsql/archivedir/000000020000000000000006. If this is a database file, please retry with the full backup mode. If this is a server log or archived WAL file, change the timestamp.
再現環境
CentOS 7(PostgreSQLサーバ、NFSサーバ共に)
PostgreSQL 9.6
pg_rman-1.3.4-pg96
環境やコマンドによっては、先述のエラーメッセージが異なるかもしれません。
原因
pg_rman によるバックアップ実行時、pg_rman を実行したマシンのシステム時刻と、バックアップ対象ファイルのタイムスタンプを比較し、ファイルのタイムスタンプが進んでいる場合にエラーとなるためです。
pg_rman のバックアップ対象は以下のファイル群です。
このうち、アーカイブWALファイルは本エラーの対象となりやすいです。NFSサーバをWALアーカイブ先としている場合、DBサーバとNFSサーバの時刻ずれによって、本エラーの発生する可能性があるからです。
このことは pg_rman のマニュアルにも記載されています。
WALアーカイブ先が別サーバ上に存在する場合、DBサーバよりもシステム時刻が進んでいるとバックアップ/リカバリに失敗します。
pg_rman
解決策
DBサーバとNFSサーバで同じNTPサーバを基準に時刻同期します。同じNTPサーバを基準にすることで、時刻ずれをなるべく抑えます。それでもサーバ間の時刻ずれがわずかに生じますが、今回の問題に関してはほぼ影響ないと思われます。
参考
回避パッチの提案
本問題に関連して、サーバ間の時刻ずれを考慮し、ファイルのタイムスタンプの比較に余裕時間を加えてはどうか、との提案が出ていました。
Error on Backup into a network filesystem.
ただ、この提案に対しては反応がないようです。
私としては、このパッチが受け入れられることはないように思います。なぜなら、安全・確実なバックアップを行うために取り入れた仕組みを迂回することになるためです。