`

(转)mysqldump意外原因

阅读更多
mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份失败的情况。
以下是我们经常遇到的问题:

1、Lost connection to MySQL server at ‘reading initial communication packet’:
这个主要是因为DNS不稳定导致的。如果做了网络隔离,MySQL处于一个相对安全的网络环境,那么开启skip-name-resolve选项将会最大程度避免这个问题。

2、Lost connection to MySQL server at ‘reading authorization packet’:
从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中,网络波动会导致握手失败。增加connect_timeout可以解决这个问题;然而增加connect_timeout并不能防止网络故障的发生,反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请求。

3、Lost connection to MySQL server during query:
这个问题具备随机性,而淘宝MySQL的应用场景决定了我们无法多次备份数据以便重现问题。
然而我们注意到这个问题一般会在两种情况下会发生。一种是mysqldump **** | gzip ****;另外一种是mysqldump **** > /nfs-file
注意,不管是gzip还是nfs都有一种特点,那就是它们影响了mysqldump的速度。从这个角度思考,是不是mysqldump从MySQL接受数据包的速度不够快导致Lost connection to MySQL server during query错误呢?

为了定位到问题,我搭建了一个测试环境:
test@192.168.0.1:3306
CREATE TABLE `test` (
`id` bigint(20) NOT NULL auto_increment,
`b` varchar(2000) default NULL,
`c` varchar(2000) default NULL,
`d` varchar(2000) default NULL,
`e` varchar(2000) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test(b,c,d,e) values (lpad(‘a’,1900,’b'), lpad(‘a’,1900,’b'), lpad(‘a’,1900,’b'), lpad(‘a’,1900,’b'));
多次复制数据使测试环境达到一定数据量。

192.168.0.2:
编写一个c++程序
#include <stdio.h>
#include <mysql.h>

using namespace std;

int main()
{
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row;
my_bool reconnect = 0;

mysql_init(&conn);
mysql_options(&conn, MYSQL_OPT_RECONNECT, &reconnect);

if(!mysql_real_connect(&conn, “192.168.0.1″, “test”, “test”, “test”, 3306, NULL, 0))
{
fprintf(stderr, “Failed to connect to database: %s\n”, mysql_error(&conn));
exit(0);
}
else
{
fprintf(stdout, “Success to connect\n”);
}

mysql_query(&conn, “show variables like ‘%timeout%’”);
result = mysql_use_result(&conn);
while(row=mysql_fetch_row(result))
{
fprintf(stdout, “%-10s: %s\n”, row[0], row[1]);
}
mysql_free_result(result);
fprintf(stderr, “\n”);

mysql_query(&conn, “select SQL_NO_CACHE * from test.test”);
result = mysql_use_result(&conn);
while((row=mysql_fetch_row(result))!=NULL)
{
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
fprintf(stdout, “%s\n”, row[0]);
sleep(100);
}
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
mysql_free_result(result);
mysql_close(&conn);
return 1;
}

在这段代码里,sleep函数用来模拟NFS的网络延迟和gzip的运算时间。执行一段时间之后,Lost connection to MySQL server during query出现了,程序意外终止。在数据处理足够快的情况下,又会是怎样的结果?

将sleep的时间改为1,重新编译后发现程序能够完整跑完。根据《MySQL Timeout解析》上对net_write_timeout的解释,我们可以发现,mysqldump处理数据过慢(NFS、gzip引起)会导致MySQL主动断开连接,此时mysqldump就会报Lost connection to MySQL server during query错误。经过多次测试,确定这个错误是由于net_write_timeout设置过短引起。

(补充:
在使用mysqldump的时候(尤其是向NFS上备份的时候),很多人都被’mysqldump:Got error:2013: Lost connection to MySQL server during query when dumping table’的问题困扰,在Manual中对这个问题有一些简单的说明。

在向NFS上备份的时候,数据的流向是这样的:MySQL Server端从数据文件中检索出数据,然后分批将数据返回给mysqldump客户端,然后mysqldump将数据写入到NFS上。一般地,向NFS上写入数据的速度较之Server端检索发送数据的速度要慢得多,这就会导致mysqldump无法及时的接受Server端发送过来的数据,Server端的数据就会积压在内存中等待发送,这个等待不是无限期的,当Server的等待时间超过net_write_timeout(默认是60秒)时它就失去了耐心,mysqldump的连接会被断开,同时抛出错误Got error: 2013: Lost connection。

增加net_write_timeout可以解决上述的问题的。在实践中发现,在增大net_write_timeout后,Server端会消耗更多的内存,有时甚至会导致swap的使用(并不确定是不是修改net_write_timeout所至)。建议在mysqldump之前修改net_write_timeout为一个较大的值(如1800),在mysqldump结束后,在将这个值修改到默认的60。

分享到:
评论

相关推荐

    windows mysqldump.zip

    《Windows环境下MySQL数据库备份与恢复:mysqldump详解》 在信息技术领域,数据库管理...正确理解和运用这些知识,能够有效地保障数据安全,减少因意外情况导致的数据丢失风险,为企业的业务持续运行提供坚实的保障。

    mysql mysqldump数据备份和增量备份

    MySQL 数据备份是数据库管理中的重要环节,用于保护数据安全,防止意外丢失。本文将详细介绍如何使用 `mysqldump` 工具进行全量备份和增量备份,以及如何结合shell脚本来实现定时备份。 首先,全量备份是备份数据库...

    MySQL数据迁移使用MySQLdump命令

    4. **数据完整性**:在进行数据迁移前,最好对源数据库进行备份,以防意外发生。 5. **大数据库处理**:对于大数据量的数据库,可能需要考虑分批导出和导入,或者使用更高效的数据迁移工具,如`percona-xtrabackup`...

    MySQL数据库使用mysqldump导出数据详解

    同时,定期备份是数据库管理的重要策略,可以避免因意外情况导致的数据丢失。 总的来说,mysqldump是MySQL数据库管理中不可或缺的工具,熟练掌握其使用方法,能够有效提升数据库管理效率,保障数据的安全性和可靠性...

    Mysql数据备份与mysqldump增量备份.pdf

    一旦发生意外,如硬件故障、人为误操作等导致数据丢失或损坏,可能会给企业带来不可估量的损失。因此,建立一套完善的数据备份方案对于保障业务连续性和数据安全具有重要意义。本文将详细介绍 MySQL 数据库备份的一...

    mysql数据库转换成oracle

    1. **数据备份**:在转换前,确保对MySQL数据库进行完整备份,以防意外丢失数据。 2. **数据导出**:使用MySQL的`mysqldump`命令,将MySQL数据库的数据和结构导出为SQL脚本。例如: ``` mysqldump -u [username] ...

    delphi备份和还原MySql数据库.zip

    总的来说,通过Delphi结合MySQL提供的工具,我们可以高效地实现数据库的备份与还原功能,保护数据免受意外损失。这个源码提供了一个实践的起点,开发者可以根据自己的需求进行定制和扩展,以适应各种项目环境。希望...

    详解 linux mysqldump 导出数据库、数据、表结构

    在Linux环境中,MySQL数据库是广泛使用的开源关系型...同时,定期备份数据库是保障数据安全的重要措施,确保在出现意外情况时能快速恢复。感谢您阅读这篇文章,希望对您的工作有所帮助,也感谢您对我们站点的支持!

    mysql转oracle

    此外,还要注意在转换前备份源数据库,以防意外情况发生。 总的来说,将MySQL数据迁移到Oracle是一项技术含量较高的任务,需要对两种数据库系统有深入理解,并且可能需要借助特定的转换工具。通过合理的规划和执行...

    Mysql转Sqlserver.rar

    1. **数据备份**:在开始迁移前,确保对MySQL数据库进行全面备份,以防意外丢失。 2. **数据导出**:使用MySQL的`mysqldump`工具生成数据和结构的SQL脚本。 3. **结构转换**:分析SQL脚本,根据SQL Server的语法特点...

    解决MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题

    阅读MySQL的错误日志,找出崩溃的具体原因。在本例中,日志显示InnoDB尝试恢复时,发现一个表(`ob_termmeta`)的`.ibd`文件已经存在于两个不同的表空间中,这是不正常的。 2. **备份数据**: 在尝试任何修复操作...

    8-MySQL用户管理[归类].pdf

    首先,数据备份是保障数据库安全的关键步骤,因为即使在采取了各种管理措施后,仍有可能因意外情况如停电或人为错误导致数据丢失。因此,定期备份数据至关重要,一旦数据丢失或出现错误,可以通过备份恢复,从而降低...

    mysql数据库备份文件

    在日常操作中,数据库备份至关重要,因为它可以保护数据免受意外损失,比如硬件故障、软件错误或人为误操作。标题提到的"mysql数据库备份文件"正是针对这一需求而进行的操作,确保数据的安全和恢复能力。 描述中...

    数据备份还原

    了解并熟练掌握`mysqldump`和`source`命令的使用,能够有效地保护你的MySQL数据库,避免因意外操作导致的重大损失。在实际工作中,还可以结合自动化工具和计划任务进行定期备份,确保数据的安全性。

    MySQL定时备份方案(利用Linux crontab)

    MySQL定时备份方案是确保数据安全的关键措施,尤其是在面临意外数据丢失的风险时。本文将详细介绍如何利用Linux的crontab功能来实现MySQL数据库的自动化备份。首先,我们需要了解几个核心技术要点: 1. **数据库...

    史上最全的MYSQL备份方法

    对于大型系统,建议定期自动备份并存储在安全的地方,以防止硬件故障或意外的数据破坏。 在进行备份时,有几点需要注意: - **验证备份**:备份后应立即验证其完整性,确保可以成功恢复。 - **版本兼容性**:确保...

    简单的Mysql数据备份

    数据库中的数据可能会因为硬件故障、软件错误、恶意攻击或者意外删除等原因丢失。定期备份可以确保在这些情况发生时,我们有足够的恢复点来恢复数据。备份策略通常包括完整备份、增量备份和差异备份,以平衡数据恢复...

    MySQL数据勤备份.pdf

    MySQL的内置工具`mysqldump`提供了方便的数据备份功能,可以帮助用户在意外情况发生时迅速恢复数据。 `mysqldump`是一个命令行工具,它可以创建一个包含数据库数据的独立文本文件。这个工具支持多种选项来定制备份...

    Linux中MySQL的异地自动备份.pdf

    数据的丢失可能是由于硬件损坏、软件BUG、人为错误等原因引起的。 MySQL 数据库备份可以帮助我们恢复丢失的数据,避免数据的丢失带来的损失。 MySQL 数据库备份的方法 MySQL 数据库备份有多种方法,包括使用 ...

Global site tag (gtag.js) - Google Analytics