mysqldump:错误 2013:转储表时查询期间与 MySQL 服务器失去连接

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 [email protected] "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。

相关内容