web-dev-qa-db-ja.com

Postgresqlストリーミングレプリケーションエラー:WALセグメントが削除されました

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

このエラーを解決するにはどうすればよいですか?

4
danish

PostgreSQLドキュメントの ストリーミングレプリケーション から:

ファイルベースの継続的アーカイブなしでストリーミングレプリケーションを使用する場合、スタンバイが受信する前にサーバーが古いWALセグメントをリサイクルする可能性があります。これが発生した場合、スタンバイは新しいベースバックアップから再初期化する必要があります。これを回避するには、wal_keep_segmentsを、WALセグメントが早くリサイクルされないようにするのに十分な大きさの値に設定するか、スタンバイ用のレプリケーションスロットを構成します。スタンバイからアクセス可能なWALアーカイブを設定する場合、スタンバイが十分なセグメントを保持している場合、スタンバイは常にアーカイブを使用して追いつくことができるため、これらのソリューションは必要ありません。

3
user126897