我想将特定的表转储到我的远程服务器数据库中,效果很好,但是其中一个表是9m行,我得到:
Lost connection to MySQL server during query when dumping table `table_name` at row: 2002359
因此,在在线阅读后,我了解到我需要增加我的max_allowed_packet,并有可能将其添加到我的命令中。
所以我运行以下命令来转储我的表:
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万条记录…不太大。
尝试将--quick选项添加到mysqldump命令中;它在大型桌子上工作得更好。它将行从结果集流到输出,而不是将整个表都包含在表中,然后将其写出。
--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压缩。
--compress
gzip
服务器也可能超时了与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" | \ ...
直到获得所有行。颈部疼痛,但可以。