Архивация WAL в postgres не работает

Я включил архивирование WAL в файле конфигурации postgres. Когда я перезапустил службу Postgres, восстановление 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

В журналах не было записей о восстановлении, и две строки, которые я удалил, не были восстановлены.


person Kiran    schedule 22.02.2018    source источник
comment
Первое, что приходит: $PGDATA - это /usr/local/pgsql/data, поэтому я ожидаю, что каталог wals будет /usr/local/pgsql/data/pg_wal.. Вы создали символическую ссылку туда из /var/lib/pgsql/wals/?..   -  person Vao Tsun    schedule 22.02.2018
comment
Я изменил его местоположение и перезапустил службу postgres, но в журналах все еще нет записей восстановления wal.   -  person Kiran    schedule 22.02.2018


Ответы (2)


pg_basebackup может перехватывать все сегменты WAL во время резервного копирования. Я использую basebackup в формате tar с опцией «-X stream», и все работает хорошо. См. здесь - pg_basebackup — скрипт bash для резервного копирования и архивирования в Google хранилище Работает отлично - я делаю резервную копию базы данных размером 4,5+ ТБ, что занимает почти 2 дня.

Восстановление описано здесь - pg_basebackup / pg-barman — восстановить резервную копию tar

Все работает - у нас уже были случаи, когда приходилось восстанавливать из этих бэкапов.

person JosMac    schedule 22.02.2018
comment
Я постараюсь и дам вам знать, если возникнут какие-либо проблемы - person Kiran; 22.02.2018
comment
Я хотел непрерывное архивирование журналов, всякий раз, когда вставляются новые данные, журнал WAL должен создаваться, чтобы в случае сбоя базы данных postgres мы могли восстановить предыдущее стабильное состояние. - person Kiran; 25.02.2018
comment
В этом случае вам нужен pg-barman. Это может непрерывно архивировать журналы WAL — docs.pgbarman.org/release/2.3/#wal -streaming Мы тоже его используем, я добавлю несколько комментариев по этому поводу... - person JosMac; 26.02.2018
comment
Я проверил нашу реализацию, все описано в мануале pg-barman. Вам нужно создать пользователей (barman и streaming_barman) и разрешить слоты репликации и отправители wal на db (разрешено по умолчанию на стр. 10) и установить файл конфигурации для данного сервера на barman. Барман просто запускает /usr/lib/postgresql/10/bin/pg_receivewal и автоматически собирает весь журнал WAL — между резервными копиями. Старые WAL удаляются автоматически. когда вы делаете новый бэкап - т.е. новый PIT для бармена. Работает как шарм.. :-) - person JosMac; 27.02.2018

WAL, содержащий две удаленные строки, вероятно, еще не заархивирован.

archive_command запускается всякий раз, когда 16-мегабайтный сегмент WAL заполнен или что-то вызывает переключение журнала.

Чтобы иметь возможность восстановить последние изменения, которые еще не были заархивированы, вам необходимо скопировать содержимое pg_wal в каталог pg_wal в восстановленной базовой резервной копии.

Вы также можете рассмотреть возможность потоковой репликации или pg_receivewal, если вы не можете позволить себе потерять транзакции.

person Laurenz Albe    schedule 22.02.2018