mysqldump: ошибка 2013: потеря соединения с сервером MySQL во время запроса при выводе таблицы

Недавно я пытался заставить раб работать, сбрасывая через ssh базы данных.

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

Чтобы заставить работать подчиненный, я использовал следующий скрипт, который подключается к мастеру, создает дамп выбранной базы данных и восстанавливает его:

#!/bin/bash

sql_error_check()
{
    if [ $? -ne 0 ]; then
        echo "ERROR at mysql command!"
        exit 1
    fi
}


DBS=( db1 db2 db3 db4 db5... )
PASSW="SuperSecurePass"

for i in ${DBS[*]}
do
    echo "- Deleting ${i}"
    mysql -p${PASSW} -e "drop database IF EXISTS ${i}"
    sql_error_check
    echo "- Creating ${i}"
    mysql -p${PASSW} -e "create database ${i}"
    sql_error_check
    echo "- Dumping & restoring ${i}"
    ssh -C root@master.hostname "mysqldump -p${PASSW} -q --max_allowed_packet=1024M ${i}" | pv | mysql -p${PASSW} ${i}
    sql_error_check 
done

Кажется, все работает идеально, но в некоторых запросах (огромные таблицы изменений) я получаю сообщение об ошибке:

mysqldump: ошибка 2013: потеря соединения с сервером MySQL во время запроса при выводе таблицы

1 ответ

Решение было очень простым. Эта проблема возникала из-за того, что когда дамп проходит через ssh-канал и выполняется операция, такая как "alter", необходимо остановить передачу данных в ожидании завершения запроса. Время, в течение которого соединение будет ожидать новых данных, определено в my.cnf в очень низкое время (по умолчанию 30 секунд).

Чтобы исправить эту ошибку, единственное, что нужно, это изменить эти два параметра в конфигурации mysql:

net_read_timeout    = 3600 
net_write_timeout   = 3600

Это предотвратит тайм-аут соединения и выдаст сообщение об ошибке.

Согласно документу, определяется как:

Количество секунд ожидания для получения дополнительных данных из соединения перед прекращением чтения. Когда сервер читает с клиента, net_read_timeout - это значение времени ожидания, определяющее, когда следует прервать операцию. Когда сервер пишет клиенту, net_write_timeout - это значение времени ожидания, определяющее, когда следует прервать операцию. Смотрите также slave_net_timeout.

Другие вопросы по тегам