Добавляем ключ:
apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
Узнаем версию linux
lsb_release -c
Добавляем в sources.list реппозитории (если релиз не wheezy то поменять строки на нужный)
nano /etc/apt/sources.list deb http://repo.percona.com/apt wheezy main deb-src http://repo.percona.com/apt wheezy main
Обновляем и устанавливаем
apt-get update && apt-get -y install percona-toolkit percona-xtrabackup netcat-openbsd
Создание бекапов
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).
И задать права:
chown -R 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
Если ругается на размер лога то:
Правильное изменение размера лога innodb (innodb_log_file_size)
Во время работы innodb записывает все измененные данные не сразу в файлы баз данных, а первоначально сбрасывает все в бинарный лог (опция innodb_log_file). Это позволяет повысить скорость работы, т.к. операция записи в файл таблицы более трудоемкая, чем в файл лога. К тому же ведение лога позволяет записывать в файл таблицы последовательными кусками данных, быстрее обслуживать клиентов mysql (данные принял, записал в лог, отчитался клиенту что все ОК)
При аварийном завершении сервера данный лог файл позволяет откатить поврежденные (незавершенные) транзакции. Чем больше лог файл — тем больше операций в нем хранится, и тем больше время для просмотра/анализа корректности последнего запершения работы необходимо innodb.
По-умолчанию бинарный лог-файл innodb имеео объем 5 Мб:
mysql -e "show variables like 'innodb_log_file_size'" +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | innodb_log_file_size | 5242880 | +----------------------+---------+
Для изменения его объема необходимо выполнить следующие операции (от пользователя root):
1. Корректно останавливаем работу mysql сервера:
# для Debian (Ubuntu) /etc/init.d/mysql stop
2. Изменяем/добавляем параметр в конфигурационном файле ( /etc/mysql/my.cnf — Debian (Ubuntu), /etc/my.cnf — CentOS):
[mysqld] innodb_log_file_size = 64M
3. Важно! Переименовать существующие лог-файлы. Иначе при загрузке innodb будет рапортовать, что логфайл поврежден :
mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0_old mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1_old
4. Запустить mysql сервер.
# для Debian (Ubuntu) /etc/init.d/mysql start
5. Проверить отсутствие ошибок в файле лога mysql демона:
# tail -n 100 /var/log/mysqld.log
…
130730 13:17:35 InnoDB: Log file ./ib_logfile0 did not exist: new to be created InnoDB: Setting log file ./ib_logfile0 size to 64 MB InnoDB: Database physically writes the file full: wait... 130730 13:17:35 InnoDB: Log file ./ib_logfile1 did not exist: new to be created InnoDB: Setting log file ./ib_logfile1 size to 64 MB InnoDB: Database physically writes the file full: wait... 130730 13:17:37 InnoDB: highest supported file format is Barracuda. InnoDB: The log sequence number in ibdata files does not match InnoDB: the log sequence number in the ib_logfiles!
Как видно по логу, innodb создал новые бинарные логи ib_logfile0 и ib_logfile1 нового объема.