你的位置:面向PHP >> 资讯 >> 数据库 >> Mysql >> 详细内容 在线投稿

mysqldump意外终止的原因以及解决方法

热度105票  浏览24次 【共0条评论】【我要评论 时间:2010年2月10日 13:31
文章信息

来源:转载

*`y m1E7V9b&`/c0mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份 失败的情况。面向PHP"k3D9caU X
以下是我们经常遇到的问题:面向PHPG4e"i~'Bw+f

面向PHPK"U#y(ifb

1、Lost connection to MySQL server at ‘reading initial communication packet’:面向PHPKVn"~%G'k'IG,R"chc1y;`
这个主要是因为DNS不稳定导致的。如果做了网络隔离,MySQL处于一个相对安全的网络环境,那么开启skip-name-resolve选项将会最大 程度避免这个问题。面向PHP/\7l8|t$k9T1U

XH CS"j D+n02、Lost connection to MySQL server at ‘reading authorization packet’:面向PHPZ f!jLOKEr_
从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中,网络波动会导致握手失败。增加connect_timeout可以解决这个问题; 然而增加connect_timeout并不能防止网络故障的发生,反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请 求。面向PHPT'k rg,[` Y&t

面向PHP| N2? V)BM~

3、Lost connection to MySQL server during query:
V6y5H@ `0 这个问题具备随机性,而淘宝MySQL的应用场景决定了我们无法多次备份数据以便重现问题。
_esb w$FWDqu0 然而我们注意到这个问题一般会在两种情况下会发生。一种是mysqldump **** | gzip ****;另外一种是mysqldump **** > /nfs-file
!NNG iIpV!WAYo0 注意,不管是gzip还是nfs都有一种特点,那就是它们影响了mysqldump的速度。从这个角度思考,是不是mysqldump从MySQL接受数 据包的速度不够快导致Lost connection to MySQL server during query错误呢?面向PHP!W;g6VU:d,j
面向PHPi!Y2M$w?;Ns-A
为了定位到问题,我搭建了一个测试环境:
k cw"Ax*C5S0 test@192.168.0.1:3306
~ k,b%Y G*Pi0面向PHP A6cb*?K9n[N3r

CREATE TABLE `test` (
w?_|&C0 `id` bigint(20) NOT NULL auto_increment,面向PHP^7o"Hr ^!Z'g(R7_[%~
`b` varchar(2000) default NULL,
)d9Jp&j`Q^ Y XG(M0 `c` varchar(2000) default NULL,面向PHPExGr/]5[jx0R
`d` varchar(2000) default NULL,面向PHPlt,r,Frr8d3@UB
`e` varchar(2000) default NULL,
Orqt}/B?(q {'`g D)Z$D0 PRIMARY KEY (`id`)面向PHP%P3z%X(v1s
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
面向PHPf7ZJ,F!~

insert into test(b,c,d,e) values (lpad(’a',1900,’b'), lpad(’a',1900,’b'), lpad(’a',1900,’b'), lpad(’a',1900,’b'));
,O!H&p5R(l^8ehv0 多次复制数据使测试环境达到一定数据量。

.OMv2j5e Hj1hD+zt0 面向PHPp#n v)vg}4r

192.168.0.2:
6NTc1Rhg8?0 编写一个c++程序

c+P:V,P SE0
#include <stdio.h>
R@ e#["n P,g0 #include <mysql.h>

/q0OE6QCJ)f,aQ0using namespace std;

Ga ^/aC K_0

`E/jb1Qj7OM0int main()面向PHPaj e7Me)kD4^1AK&O
{面向PHP"|O8t0L;F @!~
MYSQL conn;
*LL*Ll i0 MYSQL_RES *result;
O)S+UZ ]p0 MYSQL_ROW row;面向PHPODvC7f;u
my_bool reconnect = 0;

P8P2\K0ulbd0 面向PHP~#x|k-lOz

mysql_init(&conn);面向PHP g"h{ k+Y4g O
mysql_options(&conn, MYSQL_OPT_RECONNECT, &reconnect);面向PHP[xz-_ S6Z

%LZ2y{8gq skt0if(!mysql_real_connect(&conn, “192.168.0.1″, “test”, “test”, “test”, 3306, NULL, 0))面向PHPT|(iZ FFBxb X
{
2rg,iU9V.vI0 fprintf(stderr, “Failed to connect to database: %s\n”, mysql_error(&conn));面向PHP7i9wG0jC*K]}
exit(0);
I5T{mFc0d0 }
C?9UZMk7~0 else面向PHP!{.H#l JHN0S
{面向PHP(^"hOYV(s+V
fprintf(stdout, “Success to connect\n”);
7N3J9wG_'@/VR0 }面向PHPPNd/X l!l

%j*loTa7h1w0mysql_query(&conn, “show variables like ‘%timeout%’”);
2RL+w"R!`/j.h)^0 result = mysql_use_result(&conn);面向PHP3du+F']}3k `/E
while(row=mysql_fetch_row(result))面向PHP"E9V:F'D$TXl q u I
{面向PHP\a M*S0]D
fprintf(stdout, “%-10s: %s\n”, row[0], row[1]);
I3W b)`hC Im0 }面向PHP f q/j4p,[T6j.h
mysql_free_result(result);
N"`J.HH z0 fprintf(stderr, “\n”);

4dG~Stj)Z0

[N/^o Lec&j"`|0mysql_query(&conn, “select SQL_NO_CACHE * from test.test”);
8A4d+XK&?.z'{fz0 result = mysql_use_result(&conn);
q+DL$O `"t!c&~+f0 while((row=mysql_fetch_row(result))!=NULL)面向PHP&^ Pn!l\zA
{
%v r%W FSHh!To6Lc0 fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
I:d {&a!S,d.L0 fprintf(stdout, “%s\n”, row[0]);面向PHP|&S!KS]o {G6GM*WzU
sleep(100);面向PHP3qUB"wI7_2a6Gy@
}面向PHP:s0[O&rS+A;aFA
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));面向PHPA$?*FX7K
mysql_free_result(result);面向PHP\Q oH t9?R
mysql_close(&conn);
F-ro9A q0j0 return 1;
[^M;~ L0 }

!KoZE8s#@0
面向PHP&B:ip7^ lW+`F

面向PHP_Few1W%Y~;n

面向PHPh u:g'{ Q

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

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

TAG: 解决 mysqldump 意外
顶:5 踩:8
对本文中的事件或人物打分:
当前平均分:-0.48 (33次打分)
对本篇资讯内容的质量打分:
当前平均分:-1.3 (33次打分)
【已经有26人表态】
10票
感动
2票
路过
1票
高兴
3票
难过
2票
搞笑
4票
愤怒
2票
无聊
2票
同情
上一篇 下一篇
发表评论

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】