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.