Archive for 十一月 2010

xtrabackup Bad file descriptor问题解决

一直使用xtrabackup来备份MySQL,之前也没有出过特别的问题,但是在备份我们的一个库的时候,出现了:Bad file descriptor的错误
具体错误类似如下:
InnoDB: Operating system error number 9 in a file operation.
InnoDB: Error number 9 means ‘Bad file descriptor’.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html
InnoDB: File operation call: ‘close’.
InnoDB: Cannot continue operation.

仔细检查,发现用户的权限有点问题;修改好了以后,再次备份,还是有问题。
然后看看这个机器跟其他机器的不同点:他的数据文件是链接到另外的mount点的,但是这个为什么会影响xtrabackup出错真是搞不懂。
有问题找google,还好搜到一篇好文章,有人也碰到了这个问题。
https://bugs.launchpad.net/percona-xtrabackup/+bug/568087

问题一样,还有人解决了,一直追到:http://bazaar.launchpad.net/~percona-dev/percona-xtrabackup/trunk/revision/133
仔细一看,这个版本是release版本之后的修改,也就是说,现成的rpm包我们是没有办法用了。
只好自己编译。
好吧,那就自己编译,还好之前在solaris上编译有经验。
这里也简单记录一下编译的一些步骤:
1、133版 http://bazaar.launchpad.net/~percona-dev/percona-xtrabackup/trunk/revision/133 下只有xtrabackup.c下载,我们可以自己到http://launchpad.net/percona-xtrabackup/release-1.2/1.2/+download/xtrabackup-1.2.tar.gz下载1.2版的源码。并把里面的xtrabackup.c替换掉。
2、xtrabackup-1.2/utils对应的目录里面有build51tree.sh, buildtree.sh分别是在linux下编译5.0和5.1版xtrabackup的脚本
3、正常的话,按照xtrabackup-1.2/Makefile里面的默认的配置是MySQL Plugin并使用XTRADB。而我并不想这样,所以我注释掉了DEFS+=  -DXTRADB_BASED和#MySQL Plugin下面的那些编译项。但是编译还是报错,查看了之前solaris编译时的注意实现发现要注释掉#MySQL 5.1下的第二个INNODBOBJS=。不知道为什么Makefile这边有两个这样的INNODBOBJS=,管它,注释掉第二个以后编译就成功。
用新版本备份,备份成功。

其实后面看了一下这个版本修改的代码:
2326
2326

2327
2327
/* close */
2328
2328
printf(”        …done\n”);
2329

os_file_close(src_file);

2329
if (!node->open) {

2330
os_file_close(src_file);

2331
}
2330
2332
os_file_close(dst_file);
2331
2333
ut_free(buf2);
2332
2334
return(FALSE);
2333
2335
error:
2334

if (src_file != -1)

2336
if (src_file != -1 && !node->open)
2335
2337
os_file_close(src_file);
2336
2338
if (dst_file != -1)
2337
2339
os_file_close(dst_file);
就那么几行,是因为没有判断节点是否还打开,结果导致出错,唉,程序的异常处理确实需要比程序本身的逻辑复杂很多啊。
不过还是没有想明白为什么这台机器就有问题,其他的都没有问题。

may your success.

date +%k注意输出的空格

最近一直在搞备份脚本,每次测试都通过,没有任何问题,结果把它放在crontab里面让它凌晨2点调度,却怎么样也运行不起来,最后发现是date +%k输出跟想象中的不一样。凌晨2点date +%k输出为 2(空格2)。

对应的脚本段为:
CURRENT_HOUR=date "+%k"
if [ “X${CURRENT_HOUR}” == “X${WHOLE_BACKUP_HOUR}” ];then
备份
fi
WHOLE_BACKUP_HOUR是一个整数值。
白天测试的时候,总是不会出错,但是凌晨调度执行就一直调度不成功。
最后发现是date +%k返回的是当前的小时值。如果是凌晨2点,那么返回的是 2(空格2)和整数值2比较肯定是对不上的。如果是10点以后,那么都不会出错。唉,不细心的后果啊

may your success.