Archive for 九月 2010

xtrabackup 多实例MySQL备份

花了两个晚上,10来个小时,来测试如何让xtrabackup在多实例的MySQL上成功备份出来,最终找到了一个办法:–defaults-file=”fake/my.cnf.1″,也就是传递一个假的mysql配置文件,让它读取对应的实例数据,备份出来。这样,对每个实例做一个假的mysql配置文件,传给它让它备份出来。

其实我想到的第一个办法就是这个办法。但是作为程序员出身的我,有点追求完美的程序员,始终感觉这种方法太臭了。于是我开始尝试:
1、修改innobackupex-1.5.1的perl文件。
发现innobackupex-1.5.1脚本里面mysqld是写死的,也就是说它就只支持一个实例。好吧,那我就把mysqld全部修改成参数,然后通过参数传递进去(顺便再次温习了一下perl的GetOptions函数,呵呵)。这样总行把?不行。测试的结果报错,说
fatal error: OR no ‘datadir’ option in group ‘mysqld1’ in MySQL options
对应的代码如下:
if (!exists $config{$group}) {
# no group
print STDERR “$prefix fatal error: no ‘$group’ group in MySQL options\n”;
print STDERR “$prefix fatal error: OR no ‘datadir’ option in group ‘$group’ in MySQL options\n”;
exit(1);
}
而检查了以后发现是另外一个问题:
xtrabackup: Error: Please set parameter ‘datadir’
xtrabackup报错了,恩,只好仔细看看文件看看脚本了,发现read_config_file函数里面这么说的:
if ($option_defaults_file) {
$options = $options . ” –defaults-file=\”$option_defaults_file\” “;
}

$options = $options . “–print-param”;

# read file to an array, one line per element
#file_to_array($filename, \@lines);
$cmdline = “$option_ibbackup_binary $options”;
@lines = $cmdline;
大家特别注意:”$option_ibbackup_binary $options”,翻译成白话文就是xtrabackup [–defaults-file=#] –print-param,也就是说innobackupex-1.5.1它自己没有处理mysql配置文件的地方,他让xtrabackup去处理,它只管拿现成的。他把这些东西通通放到hash map里面,通过get_option从hash里面获得datadir,innodb_data_home_dir等一系列信息。而xtrabackup解析文件的时候就报错,找不到mysqld组,所以,修改innobackupex-1.5.1是不可行的。

2、如果xtrabackup报错,那么修改xtrabackup的源文件来让它不报错可不可以列?
修改源码的事情比较不靠谱,就算我修改了,并且运行良好,xtrabackup以后的更新和bug修复我就赶不上了。先看看把,也许修改起来简单的。一看,虽然就一个xtrabackup.c文件,但是没有找到比较好下手的地方。罢了罢了,回归到骗人的把戏上吧。

3、骗人的把戏
查看xtrabackup的时候,倒是发现可以在my.cnf上配置xtrabackup的组,把备份的一些参数信息这样传给它。现在就有两个办法,
a、在mysql配置文件中放一个xtrabackup的组,把各个实例的配置信息轮询的更新到组里面,让xtrabackup备份
b、针对每个实例新建一个假的mysql配置文件,让xtrabackup的备份每次读取不同的文件来备份
呵呵,当然是第二个办法好了,于是测试开始,妈的,一直出错,传递的–default-file文件给它,它就是不读,倔强的报错。最后竟然发现是–defaults-file少了一个s,悲剧。好,这个搞定以后就没有什么问题了。建立两个假的mysql配置文件,让它备份把。
[pickup.lichun@alibaba-26841 xtrabackup-1.2]$ xtrabackup –defaults-file=’/tmp/my.cnf’ –print-param
# This MySQL options file was generated by XtraBackup.
[mysqld]
datadir = “/data/mysqldata1/mydata”
tmpdir = “/data/mysqldata1/tmpdir/”
innodb_data_home_dir = “/data/mysqldata1/innodb_ts”
innodb_data_file_path = “ibdata1:256M:autoextend”
innodb_log_group_home_dir = “/data/mysqldata1/innodb_log”
innodb_log_files_in_group = 2
innodb_log_file_size = 536870912

may your success.