Резервное копирование баз данных в СУБД PostgreSQL (On-line backup)
В данной статье я хочу поделиться подходом к вопросу резервного копирования баз данных в СУБД PostgreSQL, применяемым мной во многих проектах.
Для резервного копирования данных так же можно использовать утилиту pg_dump или pg_dumpall, но ее применение не гарантирует целостность полученных данных, на больших базах данных для ее работы необходимо большое количество памяти, во время ее использования происходят блокировки таблиц и объектов, что не применимо в высоконагруженных системах, в которых активно используются транзакции и происходит постоянное изменение и добавление данных.
Если у вас больше одного сервера, наряду к вышеописанным способами, рекомендуется также использовать Master — (multi)Slave архитектуру, при которой все действия (insert / delete / update / create / drop) на Master сервере дублируются (реплицируются) на slave сервер(ы), которые в дальнейшем можно / нужно использовать под READ-ONLY и тяжелые запросы, чтобы лишний раз не нагружать Master сервер.
Master сервер должен быть один, Slave серверов может быть сколько угодно много.
Встроенная асинхронная Master — (multi)Slave репликация в PostgreSQL появилась, начиная с версии PostgreSQL 8.2, и с каждым выходом новой версии дорабатывается и совершенствуется.
В предыдущих версиях, для организации Master — (multi)Slave репликации применялось различное дополнительное программное обеспечение: slony, londiste (от компании Skype), pgpool и другое, а начиная с версии PostgreSQL 8.2 Master — (multi)Slave репликация добавлена в основной код и доступна из коробки.
Из последних значимых достижений в данном вопросе стоит отметить добавления режима синхронной репликации Master — (multi)Slave, который ожидается в новой версии PostgreSQL 9.1 и не требует установки дополнительных модулей и программного обеспечения. Реализация данного режима интересна тем, что есть возможность включения постоянного синхронного режима работы репликации, как на конкретный Slave сервер или группу Slave серверов, так и во время конкретного запроса или части запроса внутри DML блока, при включении которого, часть данных будет реплицирована в синхронном режиме, а при выключении данного режима в этом же DML блоке, в асинхронном режиме. (Данный режим с примерами применения и результатами тестированием я опишу в следующих статьях).
Ниже привожу скрипт для автоматического создания base backup, который можно запускать или вручную или по cron:
Немного теории.
На текущий момент в СУБД PostgreSQL существует два способа резервного копирования баз данных без остановки сервера СУБД или блокировки (lock) работы с данными (On-line backup):- Base backup (полный бекап)
- On-line backup (архивирование WAL — Write-Ahead Log (Журнал опережающей записи или архивные журналы, по аналогии с СУБД Oracle))
Для резервного копирования данных так же можно использовать утилиту pg_dump или pg_dumpall, но ее применение не гарантирует целостность полученных данных, на больших базах данных для ее работы необходимо большое количество памяти, во время ее использования происходят блокировки таблиц и объектов, что не применимо в высоконагруженных системах, в которых активно используются транзакции и происходит постоянное изменение и добавление данных.
Если у вас больше одного сервера, наряду к вышеописанным способами, рекомендуется также использовать Master — (multi)Slave архитектуру, при которой все действия (insert / delete / update / create / drop) на Master сервере дублируются (реплицируются) на slave сервер(ы), которые в дальнейшем можно / нужно использовать под READ-ONLY и тяжелые запросы, чтобы лишний раз не нагружать Master сервер.
Master сервер должен быть один, Slave серверов может быть сколько угодно много.
Встроенная асинхронная Master — (multi)Slave репликация в PostgreSQL появилась, начиная с версии PostgreSQL 8.2, и с каждым выходом новой версии дорабатывается и совершенствуется.
В предыдущих версиях, для организации Master — (multi)Slave репликации применялось различное дополнительное программное обеспечение: slony, londiste (от компании Skype), pgpool и другое, а начиная с версии PostgreSQL 8.2 Master — (multi)Slave репликация добавлена в основной код и доступна из коробки.
Из последних значимых достижений в данном вопросе стоит отметить добавления режима синхронной репликации Master — (multi)Slave, который ожидается в новой версии PostgreSQL 9.1 и не требует установки дополнительных модулей и программного обеспечения. Реализация данного режима интересна тем, что есть возможность включения постоянного синхронного режима работы репликации, как на конкретный Slave сервер или группу Slave серверов, так и во время конкретного запроса или части запроса внутри DML блока, при включении которого, часть данных будет реплицирована в синхронном режиме, а при выключении данного режима в этом же DML блоке, в асинхронном режиме. (Данный режим с примерами применения и результатами тестированием я опишу в следующих статьях).
Переходим к практике.
Base backup (полный бекап).
- Создание каталога для хранения WAL:
mkdir -p /var/lib/pgsql/9.0/backups/archive
- Установка прав доступа на каталог хранения base backup для пользователя postgres:
chown –R postgres /var/lib/pgsql/9.0/backups/base
- Создание контрольной точки в WAL:
SELECT pg_start_backup('$PG_BACKUP_DIR/$DATE_TIME_PREFIX');
- Архивирование системного каталога данных /var/lib/pgsql/9.0/data/:
tar cvjf /var/lib/pgsql/9.0/backups/base/[BASE BACKUP NAME].tar.bz2 /var/lib/pgsql/9.0/data
- Удаление контрольной точки в WAL:
SELECT pg_stop_backup();
On-line backup (архивирование WAL).
- Создание каталога для хранения WAL:
mkdir -p /var/lib/pgsql/9.0/backups/archive
- Установка прав доступа на каталог хранения WAL для пользователя postgres:
chown –R postgres /var/lib/pgsql/9.0/backups/archive
- В файле конфигурации /var/lib/pgsql/9.0/data/postgresql.conf добавить строчки:
archive_command = 'test ! -f /var/lib/pgsql/9.0/backup_in_progress || cp -i %p /var/lib/pgsql/9.0/backups/archive/%f < /dev/null' archive_mode = on wal_level = archive
- Перегрузить postgresql
/etc/init.d/postgresql-9.0 restart
- В каталоге /var/lib/pgsql/9.0/backups/archive должны появиться WAL.
Ниже привожу скрипт для автоматического создания base backup, который можно запускать или вручную или по cron:
<font color="black">#!/bin/sh PG_DIR=<font color="#A31515">"/var/lib/pgsql/9.0"</font> PG_DATA_DIR=<font color="#A31515">"$PG_DIR/data"</font> PG_BACKUP_DIR=<font color="#A31515">"$PG_DIR/backups"</font> PG_BASE_BACKUP_DIR=<font color="#A31515">"$PG_BACKUP_DIR/base"</font> PG_ARCHIVE_BACKUP_DIR=<font color="#A31515">"$PG_BACKUP_DIR/archive"</font> DATE=<font color="#A31515">"/bin/date"</font> DATE_TIME_PREFIX=`$DATE +%Y%m%d%H%M%S` PG_BASE_BACKUP_FILE=<font color="#A31515">"$DATE_TIME_PREFIX.tar"</font> PSQL=<font color="#A31515">"/usr/bin/psql"</font> TAR=<font color="#A31515">"/bin/tar"</font> CHMOD=<font color="#A31515">"/bin/chmod"</font> TOUCH=<font color="#A31515">"/bin/touch"</font> RM=<font color="#A31515">"/bin/rm"</font> BZIP2=<font color="#A31515">"/usr/bin/bzip2"</font> MKDIR=<font color="#A31515">"/bin/mkdir"</font> ECHO=<font color="#A31515">"/bin/echo"</font> <font color="#0000ff">if</font> [[ -f $PG_DIR/backup_in_progress ]]; then $ECHO <font color="#A31515">"Error: Backup in progress."</font> exit 1 fi <font color="#0000ff">if</font> [[ ! -d $PG_BASE_BACKUP_DIR ]]; then $ECHO <font color="#A31515">"Directory $PG_BASE_BACKUP_DIR doesn't exists. Trying create it."</font> $MKDIR -p $PG_BASE_BACKUP_DIR $CHMOD 0700 $PG_BASE_BACKUP_DIR fi $TOUCH $PG_DIR/backup_in_progress $PSQL -c <font color="#A31515">"SELECT pg_start_backup('$PG_BASE_BACKUP_DIR/$DATE_TIME_PREFIX');"</font> $TAR cvf $PG_BASE_BACKUP_DIR/$PG_BASE_BACKUP_FILE $PG_DATA_DIR $PSQL -c <font color="#A31515">"SELECT pg_stop_backup();"</font> $TAR rf $PG_BASE_BACKUP_DIR/$PG_BASE_BACKUP_FILE $PG_ARCHIVE_BACKUP_DIR $CHMOD 0600 $PG_BASE_BACKUP_DIR/$PG_BASE_BACKUP_FILE $BZIP2 -9 $PG_BASE_BACKUP_DIR/$PG_BASE_BACKUP_FILE $RM -f $PG_ARCHIVE_BACKUP_DIR/* $RM -f $PG_DIR/backup_in_progress exit 0 </font> <font color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font color="gray">Source Code Highlighter</font></a>.</font>
0 комментариев