в backup, debian, mysql

Использование Percona XtraBackup при большом количестве таблиц в БД

percona-xtrabackup
При наличии очень большого количества таблиц в базе данных MySQL и включенной опции innodb_file_per_table (подробнее) могут возникнуть проблемы с созданием резервных копий. Давайте разберемся!

Речь идет о следующей ошибке при создании резервной копии БД:

...
InnoDB: Operating system error number 24 in a file operation.
InnoDB: Error number 24 means 'Too many open files' 
InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html 
InnoDB: File ./sbtest/sbtest132841.ibd: 'open' returned OS error 124. Cannot continue operation 
InnoDB: Cannot continue operation.

Давайте посмотрим, сколько же это «Too many open files»:

find /var/lib/mysql/ -name "*.ibd" | wc -l
1000005

Далее следует узнать какое максимальное количество файлов можно держать открытыми в системе:

cat /proc/sys/fs/file-max
1635229

Примечание. Если это число небольшое, то Percona XtraBackup вполне может «монополизировать» файлы, что повлечет за собой некорректную работу остальных сервисов.

Увеличить максимальное количество файлов, которые могут быть открыты в системе можно так:

sysctl -w fs.file-max=5000000 && echo "fs.file-max=5000000" >> /etc/sysctl.conf

Также можно увеличить лимит на количество открытых файлов процессом Percona XtraBackup, оптимальный вариант — использовать параметр --open-files-limit. Например, можно добавить в конфигурационный файл /etc/mysql/my.cnf следующее:

...
[xtrabackup]
open-files-limit=2000000
...

Также можно изменить этот параметр в командной строке или запускать ulimit -n 2000000 перед стартом резервного копирования. Перед запуском предложенной команды нужно убедиться, что у пользователя есть необходимые привилегии для изменения лимита открытых файлов.

Еще один вариант изменения лимитов — добавить в конфигурационный файл /etc/security/limits.conf строки:

...
mysql hard nofile 2000000
mysql soft nofile 2000000

На одном из хостов при выполнении команды ulimit -n 2000000 столкнулся с ошибкой:

ulimit -n 2000000
-su: ulimit: open files: cannot modify limit: Operation not permitted

Это лечится увеличением значения параметра fs.nr_open (лимит ядра на количество запускаемых процессов), например:

cat /proc/sys/fs/nr_open
1048576
sysctl -w fs.nr_open=2000000 && echo "fs.nr_open=2000000" >> /etc/sysctl.conf
fs.nr_open = 2000000
cat /proc/sys/fs/nr_open
2000000

После всех проделанных изменений вы сможете без проблем бекапить базы данных MySQL с миллионами таблиц утилитой Percona XtraBackup.

А что делать, если нет возможности позволить Percona XtraBackup открывать такое количество файлов? В таком случае на свой страх и риск можно использовать опцию --open-files-limit (подробнее) и не делать никаких DDL во время бекапа!

Добавить комментарий