ドキュメント のように、単純なテストPostgreSQL9.0データベースの継続的なアーカイブを設定しようとしています。 postgres.confで私は設定しました:
wal_level =アーカイブ
archive_mode = on
archive_command = 'touch/home/myusername/backup/testtouch'
archive_timeout = 30s
...そしてPostgreSQLを再起動しました。タッチでリストされたファイルは表示されません。手動でtouchコマンドを実行でき、期待どおりに機能します。
バックアップを作成しようとすると、archive_commandを永久に待機します。 psqlでは;
postgres =#SELECT pg_start_backup( 'touchtest');
pg_start_backup
-----------------
0/14000020(1行)postgres =#SELECT pg_stop_backup();
注意:pg_stop_backupのクリーンアップが完了し、必要なWALセグメントがアーカイブされるのを待っています>警告:pg_stop_backupは、必要なすべてのWALセグメントがアーカイブされるのをまだ待っています(60秒経過)
ヒント:archive_commandが正しく実行されていることを確認してください。 pg_stop_backupは安全にキャンセルできますが、データベースのバックアップはすべてのWALセグメントがないと使用できません。
これは何が原因でしょうか?どうすればトラブルシューティングできますか?
追加情報:CentOS5.4で実行しています。 rootとしてインストールされたPostgreSQL9.0.2。
更新:最初に、マニュアルと一致するようにcp -i %p /home/myusername/backup/%f </dev/null
とtest ! -f /home/myusername/backup/%f && cp %p /home/myusername/backup/%f
の両方でアーカイブを試みました。トラブルシューティングのために、より簡単なタッチコールに減らしました。
そのPostgres構成は正しく見えます
CentOSはデフォルトでユーザーディレクトリモードを700に設定しているので、それが実際に当てはまるかどうか、そしてルートユーザーとしてsuを使用してそのファイルに触れることができるかどうかを確認してください
su - postgres -c "touch /home/myusername/backup/testtouch"
それが機能する場合は、postgresで詳細ログを使用して、postgresログでさらにエラーがないか確認してください。
アーカイブコマンドには、より多くの情報が含まれている必要があります。
From PostgreSQL doco
archive_commandでは、%pはアーカイブするファイルのパス名に置き換えられ、%fはファイル名のみに置き換えられます。 (パス名は、現在の作業ディレクトリ、つまりクラスターのデータディレクトリからの相対パスです。)
archive_command = 'copy "%p" "C:\ server\archivedir \%f"'#Windows
要約すると、アーカイブコマンドスクリプトに変数を含めているように(CentOSのtouchコマンドに精通していない)私には見えません。アーカイブされるログファイルのファイル名は永久に変更されることに注意してください。アーカイブコマンドは、ファイルのアーカイブ先も知る必要があります。