Организация резервного копирования БД MySQL


Tagged , ,

Очень интересная на мой взгляд статья. Написана не мной, но ссылка на оригинал внизу.
—-
Для любого администратора, который отвечает за работоспособность БД MySQL важным фактором является корректный backup данной БД.
Утилита mysqldump, которая входит в дистрибутив MySQL и служит для организации базового backup`ирования небольших БД, меня не устраивает.
Причины достаточно просты:
— можно указать 1 кодировку для БД, что ведет к таким косякам, например данные в БД в cp1251, кодировка при реализации backup — latin1 в итоге получаем полный дамп «????» вместо данных.
— в результате работы утилиты mysqldump получается текстовый файл с sql коммандами, а если БД у вас несколько десятков GB, то восстановление может занять несколько часов или даже дней.

Поэтому я выбрал для себя и для реализации стратегии резервирования данных технологию мгновенных снимков ФС (snapshots). Технология мгновенных снимков ФС позволяет реализовать полноценное резервирование БД, быстрое восстановление данных БД в случае отказа дисковой подсистемы, ошибки ПО, оборудования и т.д.

Snapshots доступны как для Linux в виде lvm snapshots, так и для FreeBSD. Базовая ФС для FreeBSD — UFS2 достаточно давно поддерживает технологию мгновенных снимков ФС. Далее я опишу основную логику создания резервных копий БД и приведу примеры простых скриптов для реализации функции резервирования БД при помощи снапшотов.

Основная логика создания резервных копий БД:

1) Размещаем файлы БД в рамках 1 файловой системы (это необходимо для получения консистентной копии файлов БД).
2) Подключаем к БД, выполняем команду «flush tables with read lock», дожидаемся выполнения данной команды. Сохраняем в текстовый файл вывод команды «show master status». ПОДКЛЮЧЕНИЕ К БД НЕ ДОЛЖНО ЗАКРЫВАТЬСЯ, иначе блокировка таблиц на запись будет снята и вы получите не консистентный backup БД.
3) Создаем снапшот при помощи базовых утилит для вашей ФС.
4) Выполняем команду «unlock tables» в подключении к БД. Теперь можно полностью отключиться от БД.
5) Монтируем snapshot раздел, копируем в него конфигурационные файлы для БД и текстовый файл с выводом команды «show master status». Далее копируем примонтированный раздел при помощи утилит tar или rsync, или при помощи вашего агента резервного копирования.
6) После завершения копирования данных с snapshot раздела, отмонтируем и удаляем его.

Пример скрипта создания backup БД при помощи snapshot`ов для ОС FreeBSD:

#!/usr/local/bin/bash

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/doktor/bin

cd /usr/local/comcom/mysqlbackup

DATE=`date +%Y%m%d%H%M`
MOUNT=/sbin/mount
SNAPPART=/usr
MYSQL=/usr/local/bin/mysql

(echo "FLUSH TABLES WITH READ LOCK;"; echo "! ${MOUNT} -u -o snapshot /${SNAPPART}/.snap/backup /${SNAPPART}"; echo "UNLOCK TABLES;" ) | ${MYSQL} &&
mdconfig -a -t vnode -f /${SNAPPART}/.snap/backup -u 4 &&
mount -r /dev/md4 /mnt/ &&
tar -cvzf /usr/local/comcom/mysqlbackup/all_db_snap_${DATE}.tar.gz /mnt/db/mysql &&
sleep 5 && umount -f /mnt/ &&
mdconfig -d -u 4 && rm -f /${SNAPPART}/.snap/backup && echo "MySQL Backup complite."

Скрипт достаточно простой. Конфигурационный файл для БД уже находится в директории БД, поэтому дополнительное копирование не производим. Также так как не используется репликация, то и вывод команды «show master status» не нужен.

Для реализации резервирования при помощи snapshot`ов в ОС Linux я рекомендую использовать скрипт mylvmbackup. Данный скрипт много раз использовался мной в различных проектах, нареканий на него нет. Работает как часы. Насколько я знаю, данный скрипт используют администраторы компании Percona и The Planet.
При использовании LVM в Linux — главное не забывать оставлять свободное место в несколько GB для snapshot раздела в рамках Volume Group.

Оригинал тут

Share:

No comments

RSS / trackback

Respond