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
一切正常 - 当我们不得不从这些备份中恢复时,我们已经遇到过事故。
我在 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
一切正常 - 当我们不得不从这些备份中恢复时,我们已经遇到过事故。