PostgreSQLストリーミングレプリケーションを設定したいのですが、次のエラーが発生します。
FATAL: could not receive data from WAL stream:
ERROR: requested WAL segment 00000001000000000000006A has already been removed.
マスターIP:192.168.0.30
スレーブIP:192.168.0.36
マスター上:
レプリケーションのみに使用されるユーザーrep
を作成しました。
Postgres設定ディレクトリ内の関連ファイル(/opt/Postgres/9.3/data
):
pg_hba.conf
:
Host replication rep 192.168.0.36/32 trust
postgresql.conf
:
listen_addresses = 'localhost,192.168.0.30'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on
postgres
サービスを再開しました。
スレーブ:
postgres
サービスを停止して、2つのファイルに変更を適用しました。
pg_hba.conf
:
Host replication rep 192.168.0.30/32 trust
postgresql.conf
:
listen_addresses = 'localhost,192.168.0.36'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on
私が行った初期データベースを複製するために:
マスター上:
バックアップラベルを作成するための内部postgres backup startコマンド:
psql -c "select pg_start_backup('initial_backup');"
...データベースデータをスレーブに転送する場合:
rsync -cva --inplace --exclude=*pg_xlog* /opt/Postgresql/9.3/data/ 192.168.0.36:/opt/Postgresql/9.3/data/
...内部バックアップを停止してクリーンアップする場合:
psql -c "select pg_stop_backup();"
スレーブ上:
以下を作成しましたrecovery.conf
:
standby_mode = 'on'
primary_conninfo = 'Host=192.168.0.30 port=5432 user=rep password=yourpassword'
trigger_file = '/tmp/postgresql.trigger.5432'
スレーブでpostgres
サービスを開始すると、エラーなしで開始されますが、まだ待機しています。
ps -ef | grep -i postgres
postgres 12959 1 0 13:39 ? 00:00:00 /opt/PostgreSQL/9.3/bin/postgres -D /opt/PostgreSQL/9.3/data
postgres 12969 12959 0 13:39 ? 00:00:00 postgres: logger process
postgres 12970 12959 0 13:39 ? 00:00:00 postgres: startup process waiting 00000001000000000000006A
一方、マスター上:
ps -ef | grep -i postgres
postgres 5930 1 0 13:39 ? 00:00:01 /opt/PostgreSQL/9.3/bin/postgres -D /opt/PostgreSQL/9.3/data
postgres 5931 5930 0 13:39 ? 00:00:00 postgres: logger process
postgres 5933 5930 0 13:39 ? 00:00:00 postgres: checkpointer process
postgres 5934 5930 0 13:39 ? 00:00:00 postgres: writer process
postgres 5935 5930 0 13:39 ? 00:00:00 postgres: wal writer process
postgres 5936 5930 0 13:39 ? 00:00:00 postgres: autovacuum launcher process
postgres 5937 5930 0 13:39 ? 00:00:00 postgres: archiver process
postgres 5938 5930 0 13:39 ? 00:00:00 postgres: stats collector process
スレーブでのpsql
コマンドは、
psql.bin: FATAL: the database system is starting up
-> cd pg_logは待機の理由を示します:-
FATAL: could not receive data from WAL stream: ERROR: requested WAL segment has already been removed
00000001000000000000006A segment is not in master's pg_xlog but it is in slaves pg_xlog
このエラーを解決するにはどうすればよいですか?
PostgreSQLドキュメントの ストリーミングレプリケーション から:
ファイルベースの継続的アーカイブなしでストリーミングレプリケーションを使用する場合、スタンバイが受信する前にサーバーが古いWALセグメントをリサイクルする可能性があります。これが発生した場合、スタンバイは新しいベースバックアップから再初期化する必要があります。これを回避するには、
wal_keep_segments
を、WALセグメントが早くリサイクルされないようにするのに十分な大きさの値に設定するか、スタンバイ用のレプリケーションスロットを構成します。スタンバイからアクセス可能なWALアーカイブを設定する場合、スタンバイが十分なセグメントを保持している場合、スタンバイは常にアーカイブを使用して追いつくことができるため、これらのソリューションは必要ありません。