mysqldump постоянно дает сбой – ubuntu 20.04

Вопрос или проблема

Недавно мы столкнулись с ошибкой, которая теперь всегда возникает при попытке создать дамп базы данных, работающей на mysql Ver 8.0.40-0ubuntu0.20.04.1 для Linux на x86_64 (Ubuntu 20.04). Эта база данных используется Matomo. Ошибка, которая всегда возникает, иногда связана с одними и теми же/разными таблицами и разными строками:

mysqldump: Ошибка 2013: Соединение с сервером MySQL потеряно во время запроса при дампе таблицы `[TABLE]` на строке: [ROW-number]

Команда Mysqldump:

 mysqldump --compression-algorithms=zlib --quick --single-transaction db_name.sql

Мы пробовали разные настройки

[mysqld]
max_allowed_packet=2048M

wait_timeout = 86400
interactive_timeout = 86400

net_read_timeout=4800
net_write_timeout=4800

[mysqldump]
    max_allowed_packet = 2048M

Также пробовали рекомендации с этих сайтов:

mysqldump-Ошибка-2013-Потеря-соединения-с-сервером-MySQL

и

mysql-дамп scaler

Это не помогает. У кого-нибудь есть другие решения? Обходные пути?

Спасибо за ваши ответы,

да, это работало раньше, мы используем InnoDB, что помогло, так это

Установить innodb_force_recovery на 1 (либо в вашем пользовательском .cnf, либо установить в команде базы данных):

SET GLOBAL innodb_force_recovery = 1;

Это помогло восстановиться от повреждений InnoDB и позволило выполнить дамп.

После завершения дампа сбросьте innodb_force_recovery,

Сбросьте innodb_force_recovery на 0:

mysql> SET GLOBAL innodb_force_recovery = 0;

В /etc/mysql/, ваш пользовательский *.cnf:

innodb_force_recovery = 0       #  Предоставить помощь в восстановлении от повреждений InnoDB и может позволить вам выполнить mysql dump

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

mysql> SET GLOBAL innodb_force_recovery = 0;

Или в вашем скрипте дампа, bash и т.д.:

# mysql --defaults-extra-file="$your_mysql_password_cfg" -e "SET GLOBAL innodb_force_recovery = 0;"

Другие значения, которые могут улучшить производительность и настройки, связанные с дампами mysql, рекомендованы на других сайтах и т.д.:

[mysqld]    
innodb_buffer_pool_size = 45GB    # 70-80% от общего объёма ОЗУ
max_allowed_packet= 2G   # max_allowed_packet - максимальный размер 2GB
wait_timeout = 28800
interactive_timeout = 28800
net_read_timeout = 1200         # 20 минут
net_write_timeout= 1200         # 20 минут
net_buffer_length = 64K

[mysqldump]
# max_allowed_packet - наибольшее допустимое значение (2GB)
max_allowed_packet = 2G

Ответ или решение

Проблема, с которой вы сталкиваетесь при использовании mysqldump для создания дампа вашей базы данных на MySQL 8.0.40, заключается в ошибке 2013, что указывает на потерю соединения с сервером MySQL во время выполнения запроса. Эта проблема нередко возникает в результате различных факторов, и её решение требует тщательного анализа конфигурации и состояния вашей базы данных.

Основные причины возникновения ошибки 2013

  1. Настройки подключения: Значения wait_timeout, interactive_timeout, net_read_timeout и net_write_timeout могут оказывать значительное влияние на стабильность соединения. В вашем случае, несмотря на то что вы установили высокие значения для этих параметров, существуют другие факторы, которые также могут вызывать разрывы соединения.

  2. Проблемы с памятью: При увеличении max_allowed_packet до 2GB вы увеличиваете максимальный размер пакета данных, который MySQL может обрабатывать. Однако, если ваши таблицы очень большие, а память сервера ограничена, это может привести к ошибкам.

  3. Проблемы с InnoDB: Если ваша база данных содержит поврежденные строки или таблицы, это может быть потенциальной причиной возникновения ошибок. Установка параметра innodb_force_recovery на 1 позволяет игнорировать некоторые ошибки, что может помочь выполнить дамп, но может не решить основную проблему.

Рекомендации по устранению проблемы

  1. Оптимизация настроек MySQL:
    Убедитесь, что настройки в вашем конфигурационном файле MySQL (/etc/mysql/my.cnf) оптимизированы:

    [mysqld]
    innodb_buffer_pool_size = 45G  # Около 70-80% от общего объема оперативной памяти
    max_allowed_packet = 2G         # Максимальный размер пакета
    wait_timeout = 28800
    interactive_timeout = 28800
    net_read_timeout = 1200         # 20 минут
    net_write_timeout = 1200        # 20 минут
    net_buffer_length = 64K
    
    [mysqldump]
    max_allowed_packet = 2G
  2. Проверка и восстановление InnoDB:
    Если вы подозреваете, что ваша база данных повреждена, выполните следующие шаги:

    • Установите параметр innodb_force_recovery на 1 через MySQL клиент:

      SET GLOBAL innodb_force_recovery = 1;
    • Попробуйте выполнить дамп снова с помощью mysqldump. Если это сработает, после завершения дампа верните параметр в 0:

      SET GLOBAL innodb_force_recovery = 0;
  3. Разделение дампа на части:
    Если таблицы очень большие, рассмотрите возможность создания дампа по частям. Вы можете воспользоваться опцией --tables и указать только конкретные таблицы.

  4. Используйте другие инструменты:
    В качестве альтернативы вы можете рассмотреть возможность использования таких инструментов, как mydumper, которые могут лучше справляться с созданием дампов для больших баз данных.

  5. Мониторинг и ведение журналов:
    Включите журналы MySQL для тщательного мониторинга соединений и выявления более детальной информации о том, что происходит в момент возникновения ошибок.

Заключение

Расследование проблемы с mysqldump в MySQL требует комплексного подхода и внимания к деталям. Следуйте рекомендованным шагам и внимательно следите за состоянием сервера и базы данных. Если после всех проведенных изменений ошибка продолжает возникать, возможно, стоит рассмотреть возможность обращения к профессионалу для дальнейшей диагностики и устранения ошибок.

Оцените материал
Добавить комментарий

Капча загружается...