我有一个 1 TB 的 MySQL 数据库,我想将其转储并重新加载。大多数数据都在一个表中。很多数据已被删除,所以我很确定如果我用 mysql 转储它,重建数据库,然后重新加载它,总大小会更小。
我正在用以下命令转储数据:
mysqldump -uroot -pXXX mydb | gzip -c > data.sql.gz
我收到这个错误
mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `MY_TABLE` at row: 596089342
我尝试了很多变化,包括增加数据包大小、进行单一转换以及通过 TCP/IP 而不是本地套接字。
mysqldump -uroot -pXXX -h 127.0.0.1 --max-allowed-packet=1024M --single-transaction mydb | gzip -c > data.sql.gz
最后,我甚至运行了 /dev/null 命令来确保它不是 gzip。所有排列都会产生相同的错误。
mysqldump -uroot -pXXX -h 127.0.0.1 mydb > /dev/null
以下是 my.cnf 中的一些设置
max_allowed_packet = 1G
interactive_timeout = 600
wait_timeout = 600
net_read_timeout=600
net_write_timeout=600
connect_timeout=600
另一件奇怪的事情是转储总是停在同一个地方。大约 6GB 的 gzip 压缩数据,并且大约在同一条记录上。当我执行 ls -l 时,文件大小总是相同的。
我被难住了。有什么下一步的建议吗?
顺便说一下,这是在 Ubuntu 11.10 上运行的 Mysql 5.1.58
将要
答案1
最后,看起来我的数据损坏了。我复制了两个与 LVM 链接的卷 (EC2 ebs)。我在复制时可能没有正确冻结卷,我怀疑它们没有正确同步。我从原始卷开始,再次运行该过程,在拍摄 EC2 快照之前小心地冻结 xfs 卷,然后将副本加载到我的新服务器上,它工作正常。
答案2
您是否尝试过使用套接字文件来绕过 TCP/IP 层,例如
# Find the socket file e.g.
$ grep "^socket" /etc/my.cnf
socket = /var/lib/mysql/mysql.sock
#
# Plug the filename into the mysqldump
$ mysqldump --socket=/var/lib/mysql/mysql.sock -uroot mydb | gzip -c > data.sql.gz
答案3
我遇到了同样的错误,服务器没有更多可用的内存,也没有交换。Mysqldump 占用了所有内存,所以我减少了 my.ini 中与内存相关的参数,因为这样可以