Вопрос или проблема
Недавно мы столкнулись с ошибкой, которая теперь всегда возникает при попытке создать дамп базы данных, работающей на 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
и
Это не помогает. У кого-нибудь есть другие решения? Обходные пути?
Спасибо за ваши ответы,
да, это работало раньше, мы используем 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
-
Настройки подключения: Значения
wait_timeout
,interactive_timeout
,net_read_timeout
иnet_write_timeout
могут оказывать значительное влияние на стабильность соединения. В вашем случае, несмотря на то что вы установили высокие значения для этих параметров, существуют другие факторы, которые также могут вызывать разрывы соединения. -
Проблемы с памятью: При увеличении
max_allowed_packet
до 2GB вы увеличиваете максимальный размер пакета данных, который MySQL может обрабатывать. Однако, если ваши таблицы очень большие, а память сервера ограничена, это может привести к ошибкам. -
Проблемы с InnoDB: Если ваша база данных содержит поврежденные строки или таблицы, это может быть потенциальной причиной возникновения ошибок. Установка параметра
innodb_force_recovery
на 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
-
Проверка и восстановление InnoDB:
Если вы подозреваете, что ваша база данных повреждена, выполните следующие шаги:-
Установите параметр
innodb_force_recovery
на 1 через MySQL клиент:SET GLOBAL innodb_force_recovery = 1;
-
Попробуйте выполнить дамп снова с помощью
mysqldump
. Если это сработает, после завершения дампа верните параметр в 0:SET GLOBAL innodb_force_recovery = 0;
-
-
Разделение дампа на части:
Если таблицы очень большие, рассмотрите возможность создания дампа по частям. Вы можете воспользоваться опцией--tables
и указать только конкретные таблицы. -
Используйте другие инструменты:
В качестве альтернативы вы можете рассмотреть возможность использования таких инструментов, какmydumper
, которые могут лучше справляться с созданием дампов для больших баз данных. -
Мониторинг и ведение журналов:
Включите журналы MySQL для тщательного мониторинга соединений и выявления более детальной информации о том, что происходит в момент возникновения ошибок.
Заключение
Расследование проблемы с mysqldump
в MySQL требует комплексного подхода и внимания к деталям. Следуйте рекомендованным шагам и внимательно следите за состоянием сервера и базы данных. Если после всех проведенных изменений ошибка продолжает возникать, возможно, стоит рассмотреть возможность обращения к профессионалу для дальнейшей диагностики и устранения ошибок.