mysqldump | MySQL дает ошибку «слишком много открытых файлов».Почему?

StackOverflow https://stackoverflow.com/questions/83242

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть система RHEL 5 с новым жестким диском, который я только что выделил для сервера MySQL.Чтобы начать работу, я использовал «mysqldump --hostotherhost -A | mysql», хотя заметил, что на странице руководства никогда явно не рекомендуется пробовать это (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, -x

Заблокируйте все таблицы во всех базах данных.Это достигается путем получения глобальной блокировки чтения на время всего дампа.Эта опция автоматически отключает --single-transaction и --lock-tables.

Другие советы

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

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

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

Обходные пути:--skip-lock-tables полностью отключит такую ​​блокировку.В качестве альтернативы,-заблокировать все таблицы заставит MySqldump для использования смазочных таблиц с блокировкой чтения, которая блокирует все таблицы во всех базах данных (без их открытия).В этом случае MySQldump автоматически отключает таблицы-заблокировать, потому что это не имеет смысла, когда используется все стойки-блокировки.

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

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

  1. Вам придется заблокировать таблицы, чтобы сбросить данные.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top