Использование Percona XtraBackup при большом количестве таблиц в БД
Feb 27, 2017 11:16 · 343 words · 2 minute read
При наличии очень большого количества таблиц в базе данных 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 во время бекапа!