日期:2014-05-16  浏览次数:20725 次

mysql主从数据不一致的解决方法

转载自 http://hi.baidu.com/thinkinginlamp/blog/item/84f30cf4470979e77609d79a.html

?

当使用MySQL主从服务器时。一个必须考虑的问题就是要有方法检测数据是否已经出现了不一致,幸好mk-table-checksum提供了这样的功能:

先安装依赖的模块:DBI,DBD::mysql(相关链接):

perl -MCPAN -e 'install DBI'
perl -MCPAN -e
'install DBD::mysql'

如果自动安装不好使,就手动下载安装,地址:http://search.cpan.org/

再安装Maatkit软件包,基本步骤很简单:

tar
zxvf maatkit-3519.tar.gz
cd
maatkit-3519

剩下的就是Perl软件安装的固定打法:

perl Makefile.PL
make
make
install

下面进入正题,看看如何核对主从服务器的数据一致性,操作都在主服务器上完成,所以是localhost:

mk-table-checksum
--createreplicate --replicate=test.checksum
localhost

需要说明的是test.checksum表示的是test数据库的checksum数据表(也可以使用别的数据库或数据表,只要保证它在主从服务器间没被忽略复制即可),有了createreplicate参数,系统会自动创建这个表,里面会保存一些核对数据,手册里还有很多其他的参数可以使用,恕不详述。

命令执行速度的快慢要视数据量的大小而定,执行完之后,就可以用下面的命令来查询是否存在不一致:

mk-table-checksum
--replicate=test.checksum --replcheck 1
localhost

其实就是查询test.checksum表里this_crc != master_crc的行,所以你也可以不用上面的命令而是手动查找。

需要说明的是replcheck参数指明了核对的级联深度,比如1表示此服务器和它的从服务器。

至于如何同步不一致的数据,可以使用Maatkit提供的另一个软件:mk-table-sync:

mk-table-sync --execute --replicate
test.checksum
localhost

注意:如果你用的MySQL不支持触发器语法的话,记得在上面的命令里加上--ignore-triggers参数。

提示:虽然我们的操作都是在主服务器上完成的,但是mk能通过两个途径来自动找到从服务器,一个是SHOW
PROCESSLIST,另一个是SHOW SLAVE HOSTS(不过这个方法要求在从服务器上设定report-host等参数)

补充链接:OnlineDataDrift是Google针对mk-table-checksum的一个优化版本,可以看看。

BTW:ICC版二进制MySQL环境下DBD::mysql安装问题。

所谓ICC指的是Intel
C/C++ compiled,据说MySQL的ICC编译版本比一般的GCC编译版本效率要好一些。

不过如果采用ICC版本的话,在安装DBD::mysql时一不留神可能会遇到一些小问题,比如:

undefined
symbol:
_intel_fast_memcpy

究其原因,是因为MySQL是用ICC编译的,而缺省安装DBD::mysql时,使用的是GCC,所以出现未定义符号也是在所难免的事儿,解决方法是下载ICC库,解压缩安装到/usr/local/lib/icc目录。

tar zxvf
DBD-mysql-4.011.tar.gz
cd DBD-mysql-4.011

然后使用ICC参数手动安装DBD::mysql:

perl Makefile.PL
\
--cflags='-I/usr/local/mysql/include' \
--libs='-L/usr/local/mysql/lib
-lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/local/lib/icc
-lirc'

make
make install

和正常的编译参数相比,其实就是多了“-L/usr/local/icc
-lirc”而已,这样就OK了。