mysqldump | mysql выдает ошибку «слишком много открытых файлов». Зачем? - PullRequest
5 голосов
/ 17 сентября 2008

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

Этот процесс завершается неудачно через определенные промежутки времени, жалуясь на то, что открыто слишком много файлов (в этот момент mysqld получает соответствующий сигнал, умирает и возрождается).

Я попытался поднять его в sysctl и ulimit, но проблема сохраняется. Что мне с этим делать?

Ответы [ 3 ]

8 голосов
/ 17 сентября 2008

mysqldump по умолчанию выполняет блокировку каждой таблицы для каждой таблицы. Если у вас много таблиц, которые могут превышать количество файловых дескрипторов процесса сервера MySQL. Попробуйте --skip-lock-tables или, если блокировка необходима, --lock-all-tables.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -х 

 Блокировка всех таблиц во всех базах данных. Это достигается путем получения глобальной блокировки чтения на время всего дампа. Эта опция автоматически отключает --single -action и --lock-таблицы. 
3 голосов
/ 17 сентября 2008

mysqldump сообщает об этой ошибке для больших баз данных ( 1 , 2 , 3 ). Объяснение и обходной путь от MySQL Bugs :

[3 февраля 2007 22:00] Сергей Голубчик Это не совсем ошибка.

В mysqldump по умолчанию включен параметр --lock-tables, что означает, что он пытается заблокировать все таблицы на быть сброшенным перед началом дампа. И делать LOCK TABLES t1, t2, ... для действительно больших количество таблиц неизбежно исчерпает все доступные файловые дескрипторы, так как LOCK нужно все столы для открытия.

Обходные пути: --skip-lock-tables полностью отключит такую ​​блокировку. С другой стороны, --lock-all-tables заставит mysqldump использовать FLUSH TABLES WITH READ LOCK, который блокирует все таблицы во всех базах данных (без их открытия). В этом случае mysqldump будет автоматически отключите --lock-tables, потому что нет смысла, когда используется --lock-all-tables.

Редактировать : Пожалуйста, проверьте обходной путь Дэйва для InnoDB в комментарии ниже.

0 голосов
/ 18 сентября 2008

Если ваша база данных настолько велика, у вас есть несколько проблем.

  1. Вы должны заблокировать таблицы для сброса данных.

  2. mysqldump займет очень очень много времени, и ваши таблицы должны быть заблокированы в течение этого времени.

  3. импорт данных на новый сервер также займет много времени.

Поскольку ваша база данных будет практически непригодна для использования, пока # 1 и # 2 происходят, я бы фактически рекомендовал остановить базу данных и использовать rsync для копирования файлов на другой сервер. Это быстрее, чем использование mysqldump, и намного быстрее, чем импорт, потому что у вас нет добавленных операций ввода-вывода и ЦП для генерации индексов.

В производственных средах под Linux многие люди помещают данные Mysql в раздел LVM. Затем они останавливают базу данных, делают снимок LVM, запускают базу данных и копируют состояние остановленной базы данных на досуге.

...