Advertisement
popovnv

Untitled

Jul 28th, 2017
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 8.61 KB | None | 0 0
  1. BINDIR='/home/anastasia/newprojects/postgresql_bin/bin'
  2. DATADIR='/tmp/backuptest/postgresql_data'
  3. TMPDIR='/tmp/backuptest'
  4. PGCONFIG='/home/anastasia/newprojects/postgresql_bin/bin/pg_config'
  5. PGSRCDIR='/home/anastasia/newprojects/postgrespro'
  6.  
  7. # Будем делать всё в пределах временной тестовой директории
  8. cd $TMPDIR
  9.  
  10. $BINDIR/initdb -D $DATADIR
  11.  
  12. $BINDIR/pg_ctl -D $DATADIR -l logfile start
  13. sleep 5
  14.  
  15. # --- Сборка из исходников---
  16.  
  17. git clone git@git.postgrespro.ru:pgpro-dev/pg_probackup.git --branch stable --depth 1
  18.  
  19. cd pg_probackup
  20.  
  21. PATH="$BINDIR:$PATH"
  22. export PATH
  23.  
  24. make install -s USE_PGXS=1 PG_CONFIG=$PGCONFIG top_srcdir=$PGSRCDIR
  25.  
  26. cd $TMPDIR
  27.  
  28. # --- Первоначальная настройка pg_probackup ---
  29.  
  30. $BINDIR/pg_probackup init -B $TMPDIR/backup_path
  31.  
  32. # Создадим отдельную роль для выполнения бэкапов.
  33. echo "CREATE ROLE backup WITH LOGIN;
  34. GRANT USAGE ON SCHEMA pg_catalog TO backup;
  35. GRANT EXECUTE ON FUNCTION current_setting(text) TO backup;
  36. GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup;
  37. GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup;
  38. GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup;
  39. GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup;
  40. GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup;
  41. GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup;
  42. GRANT EXECUTE ON FUNCTION txid_current() TO backup;
  43. GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup;
  44. GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;" | $BINDIR/psql -d postgres
  45.  
  46. # --- Автономные бэкапы ---
  47.  
  48. # Настроим репликацию для роли backup
  49.  
  50. echo "ALTER ROLE backup WITH REPLICATION;" | $BINDIR/psql postgres
  51.  
  52. echo 'local replication  backup trust' >> $DATADIR/pg_hba.conf
  53.  
  54. echo 'max_wal_senders = 3' >> $DATADIR/postgresql.conf
  55. echo "wal_level = replica" >> $DATADIR/postgresql.conf
  56.  
  57. $BINDIR/pg_ctl -D $DATADIR -l logfile restart
  58. sleep 5
  59.  
  60. # Создадим инстанс для хранения автономных бэкапов
  61. $BINDIR/pg_probackup add-instance -B $TMPDIR/backup_path -D $DATADIR --instance test_autonomous
  62. # Сразу установим в конфиге нужные параметры подключения к базе, чтобы не писать их каждый раз
  63. $BINDIR/pg_probackup set-config -B $TMPDIR/backup_path --instance test_autonomous -d postgres -U backup
  64.  
  65. # Создадим полный бэкап
  66. $BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_autonomous -b FULL --stream
  67.  
  68. # Посмотрим информацию о сделанном бэкапе
  69. $BINDIR/pg_probackup show -B $TMPDIR/backup_path --instance test_autonomous
  70.  
  71. # Проверим, что бэкап подлежит восстановлению с помощью команды validate
  72. $BINDIR/pg_probackup validate -B $TMPDIR/backup_path --instance test_autonomous
  73.  
  74. # Восстановим бэкап
  75. $BINDIR/pg_probackup restore -B $TMPDIR/backup_path --instance test_autonomous -D $TMPDIR/restore_postrgesql_data
  76.  
  77.  
  78. # Остановим старый инстанс и запустим новый.
  79. $BINDIR/pg_ctl -D $DATADIR -l logfile stop
  80. sleep 5
  81.  
  82. $BINDIR/pg_ctl -D $TMPDIR/restore_postrgesql_data -l restore_logfile start
  83. sleep 5
  84.  
  85. # Убедимся, что инстанс запущен и работает
  86. echo "select count(*) from pg_class;" | $BINDIR/psql postgres
  87.  
  88. $BINDIR/pg_ctl -D $TMPDIR/restore_postrgesql_data -l restore_logfile stop
  89. sleep 5
  90.  
  91.  
  92.  
  93. # --- Архивные бэкапы ---
  94.  
  95. # Создадим инстанс для хранения архивных бэкапов
  96. $BINDIR/pg_probackup add-instance -B $TMPDIR/backup_path -D $DATADIR --instance test_archive
  97. # Сразу установим нужные параметры подключения к базе, чтобы не писать их каждый раз
  98. $BINDIR/pg_probackup set-config -B $TMPDIR/backup_path --instance test_archive -d postgres -U backup
  99.  
  100. # Настроим архивацию WAL журналов в постгресе.
  101. # Заметьте в archive_command используетя специальная комнада pg_probackup arhive-push.
  102. # Она создана для того, чтобы упростить работу c путями.
  103. # Кроме того, выполняются дополнительные проверки, совместимости данного инстанса pg_probackup и кластера postgresql.
  104. echo "archive_mode = on" >> $DATADIR/postgresql.conf
  105. 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
  106.  
  107. $BINDIR/pg_ctl -D $DATADIR -l logfile restart
  108. sleep 5
  109.  
  110. ## Сделаем полный архивный бэкап.
  111. $BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_archive -b FULL
  112.  
  113. $BINDIR/pg_probackup show -B $TMPDIR/backup_path --instance test_archive
  114.  
  115. $BINDIR/pg_probackup show -B $TMPDIR/backup_path
  116.  
  117. # Проверим, что бэкап подлежит восстановлению с помощью команды validate
  118. $BINDIR/pg_probackup validate -B $TMPDIR/backup_path --instance test_archive
  119.  
  120. # Восстановим бэкап
  121. $BINDIR/pg_probackup restore -B $TMPDIR/backup_path --instance test_archive -D $TMPDIR/restore_archive_postrgesql_data
  122.  
  123. # Остановим старый инстанс и запустим новый.
  124. $BINDIR/pg_ctl -D $DATADIR -l logfile stop
  125. sleep 5
  126.  
  127. $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile start
  128. sleep 5
  129.  
  130. # У меня с первого раза не получилось. Не найдена команда pg_probackup.
  131.  
  132. #LOG:  database system was interrupted; last known up at 2017-06-15 13:20:35 MSK
  133. #LOG:  creating missing WAL directory "pg_xlog/archive_status"
  134. #LOG:  starting archive recovery
  135. #sh: 1: pg_probackup: not found
  136. #FATAL:  could not restore file "00000001000000000000000A" from archive: command not found
  137. #LOG:  startup process (PID 7844) exited with exit code 1
  138. #LOG:  aborting startup due to startup process failure
  139. #LOG:  database system is shut down
  140.  
  141. # Настроим переменную окружения
  142. PATH="$BINDIR:$PATH"
  143. export PATH
  144. # Альтернативный способ - указать полный путь к pg_probackup в TMPDIR/restore_archive_postrgesql_data/recovery.conf
  145.  
  146. # Запустим снова
  147. $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile start
  148. sleep 5
  149.  
  150. # Теперь всё работает.
  151. # В restore_archive_logfile можно видеть ошибки archive_command. Это нормально.
  152. # Они возникают из-за того, что мы восстановили инстанс из бэкапа как есть вместе с конфигами.
  153. # Эта проверка не позволяет перезаписать уже существующий архив в каталоге бэкапов.
  154. # Для устранения ошибок нужно поменять настройки archive_command на восстановленном кластере.
  155.  
  156. #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
  157. #LOG:  archive command failed with exit code 1
  158. #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
  159.  
  160. echo "select count(*) from pg_class;" | $BINDIR/psql postgres
  161. $BINDIR/pg_ctl -D $TMPDIR/restore_archive_postrgesql_data -l restore_archive_logfile stop
  162. sleep 5
  163.  
  164. # --- Дополнительная информация  ---
  165.  
  166. # В предыдущем пункте мы уже настроили всё, что нужно для автономных бэкапов. Давайте создадим один в test_archive.
  167. #$BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_archive -b FULL --stream
  168.  
  169. # Но заметьте, что сделать архивный бэкап в test не получится.
  170. # Мы зависнем на ожидании завершения archive_command, которая не настроена для инстанса test_autonomous.
  171. #$BINDIR/pg_probackup backup -B $TMPDIR/backup_path --instance test_autonomous -b FULL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement