mysqldump | mysql приводит 'к слишком многим открытым файлам' ошибка. Почему?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
5
задан user15910 17 September 2008 в 13:33
поделиться

3 ответа

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

--lock-all-tables, -x

Lock 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.

8
ответ дан 13 December 2019 в 19:39
поделиться

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

[3 февраля 2007 22:00] Sergei Golubchik This не является действительно ошибкой.

mysqldump по умолчанию имеет - таблицы блокировки включили, что означает, что он пытается заблокировать все таблицы, которые будут выведены прежде, чем запустить дамп. И выполнение ТАБЛИЦ T1, T2 БЛОКИРОВКИ... для действительно большого количества таблиц неизбежно исчерпает все доступные дескрипторы файлов, поскольку БЛОКИРОВКЕ нужны все таблицы, которые будут открыты.

Обходные решения: - таблицы блокировки пропуска отключат такую блокировку полностью. С другой стороны - lock-all-tables сделает mysqldump для использования ТАБЛИЦ СБРОСА С БЛОКИРОВКОЙ ЧТЕНИЯ, которая блокирует все таблицы во всех базах данных (не открывая их). В этом случае mysqldump автоматически отключит - таблицы блокировки, потому что он не имеет никакого смысла, когда - lock-all-tables используется.

Править: Проверьте обходное решение Dave на InnoDB в комментарии ниже.

3
ответ дан 13 December 2019 в 19:39
поделиться

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

  1. Необходимо заблокировать таблицы для дампа данных.

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

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

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

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

0
ответ дан 13 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: