Posts tagged ‘mysqld_multi’

mysql character_sets_dir

我们有一套环境使用的是MySQL的多实例,并且我们MySQL不是放在MySQL认为应该放的目录:/usr/local/mysql下,所以今天又一个悲剧了。
数据库主机创建了一个ascii为字符集的表,主机创建成功,但是传到备机执行的时候,出错:
110510 17:14:55 [Warning] Slave: Unknown character set: ‘ascii’ Error_code: 1115
也就是说备机没有ascii字符集。
好吧,那就SHOW CHARACTER SET来看看,确实没有。
但是主机确实是有的,主备机的SHOW CHARACTER SET是不一样的。。。

好吧,其实我们备机使用的是多实例,主机是单实例。并且备机的MySQL采用的是二进制包的绿色安装。
那么这里就有一个问题,我们使用的mysqld_multi启动MySQL时它采用的是什么样的默认配置,这样的配置是否都是正确的
我们其实并不是非常肯定。
这里ascii字符集就是一个问题。

mysql的字符集配置详细请见:http://dev.mysql.com/doc/refman/5.1/en/charset-configuration.html
这里我们的备机用mysqld_multi启动以后,
show variables like ‘character_sets_dir’;
显示为:/usr/local/mysql/share/charsets。
而这个目录根本就不存在。

解决这个问题其实有三个办法:
1、mkdir -p /usr/local/mysql/share/; ln -s /path/to/correct/share/charsets /usr/local/mysql/share/charsets。
2、修改mysqld_multi,使得指向正确的目录。(目前这个办法没有走通,有待跟进)
3、在my.cnf中添加:character_sets_dir=/path/to/correct/share/charsets/
由于这个参数是read-only的,你只能重启MySQL来使它生效了

唉,其实作为一个MySQL DBA,连MySQL的这些配套的脚本都没有详细的搞清楚,有点汗颜,需要好好看一下。
如果你嫌麻烦,还是建议你把MySQL的二进制包放在MySQL指定的/usr/local/mysql下把,避免意外。

may your success

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.