最近,我尝试通过 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。