Главная > Теория и практика > XtraBackup - резервное копирование для innoDB

XtraBackup - резервное копирование для innoDB

percona-xtradb

В системах с высокими нагрузками особое внимание следует уделять резервному копированию (бекапам) данных. Зачастую самая важная часть данных находиться в СУБД. Проблема заключается в том, что копирование данных нужно проводить незаметным для работающей системы образом. Блокировка данных на момент создания бекапа тут не работает, т.к. время блокирования будет неприемлемым.

Одним из популярных решений является репликация, которая обеспечивает высокую степень надежности и почти нулевую потерю данных при сбое основного сервера. Но репликация требует аппаратных затрат, к тому же резервный сервер должен не уступать по характеристикам основному серверу, иначе от репликации не будет толку.

Другой подход резервного копирования - это использование специальных утилит, которые позволяют делать снимки состояния СУБД на жесткий диск, и восстанавливать состояние обратно по такому снимку. На этом остановимся подробнее.

Поскольку MySQL является одним из самых популярных решений в Web’е сегодня, рассмотрим инструменты для бекапов для этой СУБД.
XtraBackup - это утилита от Percona Labs, предназначенная для горячих бекапов таблиц InnoDB и XtraDB.

Установка

Качаем самую свежую версию отсюда и устанавливаем:

wget http://www.percona.com/mysql/xtrabackup/0.9/deb/xtrabackup_0.9_amd64.deb
dpkg --install xtrabackup_0.9_amd64.deb

Готово. После этого станет доступна утилита xtrabackup, с помощью которой и делаются бекапы.

Создание бекапов

Xtrabackup создает копии файлов данных таблиц innoDB (xtraDB), а также текущего бинлог файла. Для начала нужно создать директорию для бекапов:

mkdir /home/backup/db

Для запуска процесса создания бекапа:

xtrabackup --defaults-file=/etc/mysql/my.cnf --datadir=/var/lib/mysql \
 --target-dir=/home/backup/db --backup

Некоторые пояснения:

  • –defaults-file - путь к конфигурационному файлу MySQL
  • –datadir - путь к папке данных MySQL
  • –target-dir - директория для бекапов

Спустя определенное время (зависит от размера данных), получим снимок в папке для бекапов, из которого можно восстановится:

xtrabackup  Ver 0.9 Rev 83 for 5.0.84 pc-linux-gnu (x86_64)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: Target instance is assumed as followings.
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 134217728
xtrabackup: use O_DIRECT
>> log scanned up to (0 1283875749)
Copying ./ibdata1
     to /home/backup/db/ibdata1
>> log scanned up to (0 1283877656)
>> log scanned up to (0 1283878467)
>> log scanned up to (0 1283880148)
>> log scanned up to (0 1283881355)
>> log scanned up to (0 1283883263)
>> log scanned up to (0 1283885187)
>> log scanned up to (0 1283887688)
        ...done
xtrabackup: The latest check point (for incremental): '0:1283888607'
>> log scanned up to (0 1283890956)
xtrabackup: Stopping log copying thread.
xtrabackup: Transaction log of lsn (0 1283872324) to (0 1283890956) was copied.

Восстановление из бекапов

Для восстановления, необходимо выплнить команду с опцией “–prepare”:

xtrabackup --prepare --target-dir=/home/backup/db/ --datadir=/var/lib/mysql

xtrabackup  Ver 0.9 Rev 83 for 5.0.84 pc-linux-gnu (x86_64)
xtrabackup: cd to /home/backup/db
xtrabackup: This target seems to be not prepared yet.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(0 1284705008)
xtrabackup: Temporary instance for recovery is set as followings.
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 1
xtrabackup:   innodb_log_file_size = 2097152
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
InnoDB: Log scan progressed past the checkpoint lsn 0 1284705008
090914 20:18:59  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Doing recovery: scanned up to log sequence number 0 1284717711 (0 %)
090914 20:18:59  InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
090914 20:19:00  InnoDB: Started; log sequence number 0 1284717711

[notice (again)]
  If you use binary log and don't use any hack of group commit,
  the binary log position seems to be:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
090914 20:19:00  InnoDB: Starting shutdown...
090914 20:19:01  InnoDB: Shutdown completed; log sequence number 0 1284717711

Команду восстановления данных нужно выполнить дважды, после чего будут созданы лог файлы для MySQL. После этого нужно скопировать лог файл и файл данных в папку MySQL (по умолчанию - /var/lib/mysql).

Инкрементальные бекапы

Понятно, что делать полный бекап на больших объемах будет крайне ресурсоемко, поэтому XtraBackup обладает возможностью инкрементальных бекапов и восстановления. Для этого, Вам сначала необходимо сделать полный бекап, а затем в отдельную папку - т.н. дельта бекап:

xtrabackup --defaults-file=/etc/mysql/my.cnf --target-dir=/home/backup/dbdelta \
 --incremental-basedir=/home/backup/db --backup

Для восстановления нужно выполнить следующую команду:

xtrabackup --target-dir=/home/backup/dbdelta \
 --incremental-basedir=/home/backup/db --prepare

Полезные ссылки

Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com
  1. 16 Сентябрь 2009 в 14:43 | #1

    Спасибо за статью на русском, добавил на вас ссылку http://adw0rd.ru/2009/mysqldump-and-cheat-sheet/

  2. Валерий
    23 Сентябрь 2009 в 16:17 | #2

    Здравствуйте! а в чем преимущества перед mysqldump?

  3. 23 Сентябрь 2009 в 16:28 | #3

    @Валерий
    Здравствуйте!
    1. MySQLDump очень ресурсоемкая, т.к. делает выборки и преобразование данных в текстовый формат. Точно также восстановление из нее очень затратная операция
    2. XtraBackup делает копирование данных на физическом уровне (данные+индексы и текущий бинлог), что на порядок ускоряет восстановление, а создание дампа почти незаметно для работающего сервера (в отличии от mysqldump)

  4. Валерий
    28 Сентябрь 2009 в 14:44 | #4

    ясно. Спасибо за статьи!

  5. Andrey
    13 Октябрь 2009 в 16:37 | #5

    Подскажите как установить программу и откуда скачать для FreeBSD.

  6. 14 Октябрь 2009 в 11:55 | #6

    @Andrey
    Вот исходники для FreeBSD: http://www.percona.com/mysql/xtrabackup/0.9/FreeBSD/

  7. 19 Март 2010 в 14:12 | #7

    Спасибо за информацию… Думал, что так и придется мириться с ресурсоемкостью mysqldump при работе с InnoDB

  8. 23 Август 2010 в 00:03 | #8

    InnoDB: Error: tablespace id is 102403 in the data dictionary
    InnoDB: but in file ./super_db/buf_last_seeder.ibd it is 102405!
    100822 16:59:19 InnoDB: Assertion failure in thread 34372329920 in file fil/fil0fil.c line 720
    InnoDB: We intentionally generate a memory trap.
    InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
    InnoDB: If you get repeated assertion failures or crashes, even
    InnoDB: immediately after the mysqld startup, there may be
    InnoDB: corruption in the InnoDB tablespace. Please refer to
    InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
    InnoDB: about forcing recovery.
    Аварийное завершение(core dumped)

  9. 23 Август 2010 в 00:16 | #9

    раз через раз вылетает а иногда нормально копирует

  1. Пока что нет уведомлений.