Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- BINDIR='/home/anastasia/newprojects/postgresql_bin/bin'
- DATADIR='/tmp/backuptest/postgresql_data'
- TMPDIR='/tmp/backuptest'
- PGCONFIG='/home/anastasia/newprojects/postgresql_bin/bin/pg_config'
- PGSRCDIR='/home/anastasia/newprojects/postgrespro'
- # Будем делать всё в пределах временной тестовой директории
- cd $TMPDIR
- $BINDIR/initdb -D $DATADIR
- $BINDIR/pg_ctl -D $DATADIR -l logfile start
- sleep 5
- # --- Сборка из исходников---
- git clone git@git.postgrespro.ru:pgpro-dev/pg_probackup.git --branch stable --depth 1
- cd pg_probackup
- PATH="$BINDIR:$PATH"
- export PATH
- make install -s USE_PGXS=1 PG_CONFIG=$PGCONFIG top_srcdir=$PGSRCDIR
- cd $TMPDIR
- # --- Первоначальная настройка pg_probackup ---
- $BINDIR/pg_probackup init -B $TMPDIR/backup_path
- # Создадим отдельную роль для выполнения бэкапов.
- echo "CREATE ROLE backup WITH LOGIN;
- GRANT USAGE ON SCHEMA pg_catalog TO backup;
- GRANT EXECUTE ON FUNCTION current_setting(text) TO backup;
- GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup;
- GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup;
- GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup;
- GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup;
- GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup;
- GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup;
- GRANT EXECUTE ON FUNCTION txid_current() TO backup;
- GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup;
- GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;" | $BINDIR/psql -d postgres
- # --- Автономные бэкапы ---
- # Настроим репликацию для роли backup
- echo "ALTER ROLE backup WITH REPLICATION;" | $BINDIR/psql postgres
- echo 'local replication backup trust' >> $DATADIR/pg_hba.conf
- echo 'max_wal_senders = 3' >> $DATADIR/postgresql.conf
- echo "wal_level = replica" >> $DATADIR/postgresql.conf
- $BINDIR/pg_ctl -D $DATADIR -l logfile restart
- sleep 5
- # Создадим инстанс для хранения автономных бэкапов
- $BINDIR/pg_probackup add-instance -B $TMPDIR/backup_path -D $DATADIR --instance test_autonomous
- # Сразу установим в конфиге нужные параметры подключения к базе, чтобы не писать их каждый раз
- $BINDIR/pg_probackup set-config -B $TMPDIR/backup_path --instance test_autonomous -d postgres -U backup
- # Создадим полный бэкап
- $BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_autonomous -b FULL --stream
- # Посмотрим информацию о сделанном бэкапе
- $BINDIR/pg_probackup show -B $TMPDIR/backup_path --instance test_autonomous
- # Проверим, что бэкап подлежит восстановлению с помощью команды validate
- $BINDIR/pg_probackup validate -B $TMPDIR/backup_path --instance test_autonomous
- # Восстановим бэкап
- $BINDIR/pg_probackup restore -B $TMPDIR/backup_path --instance test_autonomous -D $TMPDIR/restore_postrgesql_data
- # Остановим старый инстанс и запустим новый.
- $BINDIR/pg_ctl -D $DATADIR -l logfile stop
- sleep 5
- $BINDIR/pg_ctl -D $TMPDIR/restore_postrgesql_data -l restore_logfile start
- sleep 5
- # Убедимся, что инстанс запущен и работает
- echo "select count(*) from pg_class;" | $BINDIR/psql postgres
- $BINDIR/pg_ctl -D $TMPDIR/restore_postrgesql_data -l restore_logfile stop
- sleep 5
- # --- Архивные бэкапы ---
- # Создадим инстанс для хранения архивных бэкапов
- $BINDIR/pg_probackup add-instance -B $TMPDIR/backup_path -D $DATADIR --instance test_archive
- # Сразу установим нужные параметры подключения к базе, чтобы не писать их каждый раз
- $BINDIR/pg_probackup set-config -B $TMPDIR/backup_path --instance test_archive -d postgres -U backup
- # Настроим архивацию WAL журналов в постгресе.
- # Заметьте в archive_command используетя специальная комнада pg_probackup arhive-push.
- # Она создана для того, чтобы упростить работу c путями.
- # Кроме того, выполняются дополнительные проверки, совместимости данного инстанса pg_probackup и кластера postgresql.
- echo "archive_mode = on" >> $DATADIR/postgresql.conf
- echo "archive_command = '$BINDIR/pg_probackup archive-push -B $TMPDIR/backup_path --instance test_archive --wal-file-path %p --wal-file-name %f'" >> $DATADIR/postgresql.conf
- $BINDIR/pg_ctl -D $DATADIR -l logfile restart
- sleep 5
- ## Сделаем полный архивный бэкап.
- $BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_archive -b FULL
- $BINDIR/pg_probackup show -B $TMPDIR/backup_path --instance test_archive
- $BINDIR/pg_probackup show -B $TMPDIR/backup_path
- # Проверим, что бэкап подлежит восстановлению с помощью команды validate
- $BINDIR/pg_probackup validate -B $TMPDIR/backup_path --instance test_archive
- # Восстановим бэкап
- $BINDIR/pg_probackup restore -B $TMPDIR/backup_path --instance test_archive -D $TMPDIR/restore_archive_postrgesql_data
- # Остановим старый инстанс и запустим новый.
- $BINDIR/pg_ctl -D $DATADIR -l logfile stop
- sleep 5
- $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile start
- sleep 5
- # У меня с первого раза не получилось. Не найдена команда pg_probackup.
- #LOG: database system was interrupted; last known up at 2017-06-15 13:20:35 MSK
- #LOG: creating missing WAL directory "pg_xlog/archive_status"
- #LOG: starting archive recovery
- #sh: 1: pg_probackup: not found
- #FATAL: could not restore file "00000001000000000000000A" from archive: command not found
- #LOG: startup process (PID 7844) exited with exit code 1
- #LOG: aborting startup due to startup process failure
- #LOG: database system is shut down
- # Настроим переменную окружения
- PATH="$BINDIR:$PATH"
- export PATH
- # Альтернативный способ - указать полный путь к pg_probackup в TMPDIR/restore_archive_postrgesql_data/recovery.conf
- # Запустим снова
- $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile start
- sleep 5
- # Теперь всё работает.
- # В restore_archive_logfile можно видеть ошибки archive_command. Это нормально.
- # Они возникают из-за того, что мы восстановили инстанс из бэкапа как есть вместе с конфигами.
- # Эта проверка не позволяет перезаписать уже существующий архив в каталоге бэкапов.
- # Для устранения ошибок нужно поменять настройки archive_command на восстановленном кластере.
- #ERROR: Refuse to push WAL segment 00000002.history into archive. Instance parameters mismatch.Instance 'test_archive' should have PGDATA = $DATADIR instead of $TMPDIR/restore_archive_postrgesql_data
- #LOG: archive command failed with exit code 1
- #DETAIL: The failed archive command was: $BINDIR/pg_probackup archive-push -B $TMPDIR/backup_path --instance test_archive --wal-file-path pg_xlog/00000002.history --wal-file-name 00000002.history
- echo "select count(*) from pg_class;" | $BINDIR/psql postgres
- $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile stop
- sleep 5
- # --- Дополнительная информация ---
- # В предыдущем пункте мы уже настроили всё, что нужно для автономных бэкапов. Давайте создадим один в test_archive.
- #$BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_archive -b FULL --stream
- # Но заметьте, что сделать архивный бэкап в test не получится.
- # Мы зависнем на ожидании завершения archive_command, которая не настроена для инстанса test_autonomous.
- #$BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_autonomous -b FULL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement