尝试在您的mysqldump
命令中添加--quick
选项;它与大型表格配合效果更好。它会将结果集中的行直接流式传输到输出,而不是一次性将整个表读入内存,然后写出。
mysqldump -uroot -h my.host -p'mypassword' --quick --max_allowed_packet=512M db_name table_name | \
gzip > dump_test.sql.gz
你也可以尝试在你的 mysqldump 命令中添加 --compress
选项。这使其使用更加网络友好的压缩连接协议到 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" | \
...
直到你获得所有的行。虽然有点繁琐,但这样做是有效的。
table_name
的第2926704行时出现了Lost connection to MySQL server during query
错误。这让我感到非常烦恼... - JohnBigs