一尘不染

即使使用max_allowed_pa​​cket参数,使用mysqldump时也会失去与mysql的连接

mysql

我想将特定的表转储到我的远程服务器数据库中,效果很好,但是其中一个表是9m行,我得到:

Lost connection to MySQL server during query when dumping table `table_name` at row: 2002359

因此,在在线阅读后,我了解到我需要增加我的max_allowed_pa​​cket,并有可能将其添加到我的命令中。

所以我运行以下命令来转储我的表:

mysqldump -uroot -h my.host -p'mypassword' --max_allowed_packet=512M db_name table_name | gzip  > dump_test.sql.gz

并且由于某种原因,我仍然得到:

Lost connection to MySQL server during query when dumping table `table_name` at row: 2602499

难道我做错了什么?

它的记录很奇怪,只有900万条记录…不太大。


阅读 340

收藏
2020-05-17

共1个答案

一尘不染

尝试将--quick选项添加到mysqldump命令中;它在大型桌子上工作得更好。它将行从结果集流到输出,而不是将整个表都包含在表中,然后将其写出。

 mysqldump -uroot -h my.host -p'mypassword' --quick --max_allowed_packet=512M db_name table_name | \
 gzip  > dump_test.sql.gz

您也可以尝试将--compress选项添加到mysqldump命令。这使得它对MySQL服务器使用对网络更友好的压缩连接协议。注意,您仍然需要gzip管道。MySQL的压缩协议不会导致转储脱离mysqldump压缩。

服务器也可能超时了与mysqldump客户端的连接。您可以尝试重置超时时间。通过其他方式连接到服务器并发出这些查询,然后运行mysqldump作业。

这些将超时设置为一个日历日。

    SET GLOBAL wait_timeout=86400;
    SET GLOBAL interactive_timeout=86400;

最后,如果您的服务器(通过路由器和防火墙)距离您的计算机较远,则可能会中断mysqldump的连接。一些劣质的路由器和防火墙对NAT(网络地址转换)会话具有时间限制。他们应该在使用过程中使这些会话保持活动状态,但有些则不会。也许您正在达到公司为外部连接配置的时间或大小限制。

尝试登录更靠近服务器的计算机并mysqldump在该计算机上运行。然后使用其他方法(sftp?)将您的gz文件复制到您自己的计算机上。

或者,您可能必须分段此文件的转储。您可以执行以下操作(未调试)。

mysqldump  -uroot -h my.host -p'mypassword'  \ 
          db_name table_name --skip-create-options --skip-add-drop-table \
          --where="id>=0 AND id < 1000000" | \
          gzip....

然后用这些行重复。

          --where="id>=1000000 AND id < 2000000" | \

          --where="id>=2000000 AND id < 3000000" | \
          ...

直到获得所有行。颈部疼痛,但可以。

2020-05-17