У меня есть система RHEL 5 со свежим новым жестким диском, который я только что выделил для сервера MySQL. Для начала я использовал "mysqldump --host otherhost -A | mysql", хотя я заметил, что man-страница никогда явно не рекомендует пробовать это (использование mysqldump в файл недопустимо. Мы говорим о 500 ГБ базы данных).
Этот процесс через случайные промежутки времени дает сбой, жалуясь на то, что открыто слишком много файлов (в этот момент mysqld получает соответствующий сигнал, умирает и возрождается).
Я попытался поднять его в sysctl и ulimit, но проблема не исчезла. Что мне с этим делать?






mysqldump по умолчанию выполняет блокировку всех задействованных таблиц для каждой таблицы. Если у вас много таблиц, количество файловых дескрипторов может превышать количество файловых дескрипторов серверного процесса mysql.
Попробуйте --skip-lock-tables или, если требуется блокировка, --lock-all-tables.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
--lock-all-tables, -xLock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.
Сообщается, что mysqldump выдает эту ошибку для больших баз данных (1, 2, 3). Объяснение и обходной путь от Ошибки MySQL:
[3 Feb 2007 22:00] Sergei Golubchik This is not really a bug.
mysqldump by default has --lock-tables enabled, which means it tries to lock all tables to be dumped before starting the dump. And doing LOCK TABLES t1, t2, ... for really big number of tables will inevitably exhaust all available file descriptors, as LOCK needs all tables to be opened.
Workarounds: --skip-lock-tables will disable such a locking completely. Alternatively, --lock-all-tables will make mysqldump to use FLUSH TABLES WITH READ LOCK which locks all tables in all databases (without opening them). In this case mysqldump will automatically disable --lock-tables because it makes no sense when --lock-all-tables is used.
Редактировать: Пожалуйста, проверьте обходной путь Дэйва для InnoDB в комментарии ниже.
Если ваша база данных такая большая, у вас есть несколько проблем.
Вы должны заблокировать таблицы, чтобы выгрузить данные.
mysqldump займет очень-очень много времени, и в это время ваши таблицы должны быть заблокированы.
импорт данных на новый сервер также займет много времени.
Поскольку ваша база данных будет по существу непригодной для использования во время выполнения №1 и №2, я бы рекомендовал остановить базу данных и использовать rsync для копирования файлов на другой сервер. Это быстрее, чем использование mysqldump, и намного быстрее, чем импорт, потому что у вас нет дополнительных операций ввода-вывода и ЦП для создания индексов.
В производственной среде Linux многие люди помещают данные Mysql в раздел LVM. Затем они останавливают базу данных, делают снимок LVM, запускают базу данных и на досуге копируют состояние остановленной базы данных.
Я только что перезапустил сервер «MySql», и тогда я мог безупречно использовать команду mysqldump.
Подумал, что это может быть полезным советом здесь.
Или, если вы используете таблицы innodb, попробуйте --single-transaction, что позволяет избежать как проблемы запуска дескрипторов файлов, так и блокировки всех ваших таблиц.