postgres 中的 WAL 归档不起作用

WAL archiving in postgres is not working

我在 postgres 配置文件中启用了 WAL 归档。当我重新启动 Postgres 服务时,WAL 恢复不起作用。日志中没有 wal 恢复条目。

我遵循的步骤:

Created directory for wal:
mkdir -p  /var/lib/pgsql/wals/
mkdir -p  /var/lib/pgsql/backups/
chown postgres:postgres -R /var/lib/pgsql/backups/
chown postgres:postgres -R /var/lib/pgsql/wals/

Edited the postgresql.conf with the below changes:
wal_level=archive
archive_mode=on
archive_command = 'test ! -f /var/lib/pgsql/wals/%f && cp %p /var/lib/pgsql/wals/%f'

sudo service postgresql restart 10
sudo su - postgres
pg_basebackup -D /var/lib/pgsql/data #created base backup
tar -C /var/lib/pgsql/data/ -czvf /var/lib/pgsql/backups/pg_basebackup_backup.tar.gz .

在我的数据库中删除了两行数据并停止了 postgres 服务

sudo service postgresql stop 10

提取基本备份

tar xvf /var/lib/pgsql/backups/pg_basebackup_backup.tar.gz -C /var/lib/pgsql/data

使用以下内容创建recovery.conf并重新启动 postgres 服务

echo "restore_command = 'cp /var/lib/pgsql/wals/%f %p'">/var/lib/pgsql/recovery.conf
cp /var/lib/pgsql/recovery.conf /var/lib/pgsql/data/
sudo service postgresql stop 10
sudo service postgresql start 10

日志中没有 wal 恢复条目,我删除的两行没有恢复。

包含两个已删除行的 WAL 可能尚未存档。

archive_command 是 运行 每当 16 MB WAL 段已满或某些东西强制日志切换时。

为了能够恢复尚未存档的最新更改,您必须将 pg_wal 的内容复制到还原的基础备份中的 pg_wal 目录。

你也可以考虑流式复制或者pg_receivewal如果你不能承受丢失事务。

pg_basebackup 可以在备份期间捕获所有 WAL 段。我使用带有“-X stream”选项的 tar 格式的 basebackup 并且一切正常。看这里 - pg_basebackup – bash script for backup and archiving on Google storage 它工作得很好——我备份了 4.5+ TB 的数据库,这需要将近 2 天的时间。

此处描述恢复 - pg_basebackup / pg-barman – restore tar backup

一切正常 - 当我们不得不从这些备份中恢复时,我们已经遇到过事故。