背景: Maatkit是一个Perl写的Mysql开源管理工具,maatkit提供的工具包,让我们更方便的管理mysql,详细的用法请查看官网http://www.maatkit.org/ ,最近公司开始大批量应用mysqlmaster-slave,为了方便管理主从复制的生产环境,学习了两个使用的工具,mk-table-checksum和mk-table-sync。
一.安装maatkit
# cd maatkit-2725/
# perl Makefile.PL
# make
# make install
二.mk-table-checksum
1 作用:检查主从数据库是否一致
我们在做完主从之后,虽然主从的3个复制进程正常运行,但是我们不能完全保证主从数据库的一致性,利用mk-table-checksum来检查一致性。
2 用法:
(1)在主从数据库创建负责检查的用户,我试过,只有赋予all privileges才能启用检查
grant all privileges on databases.* to maatkit_user@'host' identified by 'password'
(2)执行命令
/usr/local/bin/mk-table-checksum -d databases -t table h=master-ip,u=maatkit_user,p=password,P=3306 h=slave-ip,u=maatkit_user,p=password,P=3306
输出:
DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG
DB skucost 0 172.16.10.71 MyISAM NULL 2260122823 1 0 NULL NULL
DB skucost 0 192.168.0.229 MyISAM NULL 2260122823 5 0 NULL NULL
checksum 值一样代表着master和slave的两个表是一致。否则,则不一致。
三 mk-table-sync
1 作用:修复不一致的表
在检查出不一样的表的时候,我们需要执行修复动作,强制让这两个表保持同步。
2 用法
/usr/local/bin/mk-table-sync --execute --print --charset=utf8 --no-check-slave h=master-ip,u=maatkit_user,p=password,P=3306 h=slave-ip,u=maatkit_user,p=password,P=3306 -d databases -t table
注意:
(1) --no-check-slave这个参数,如果你不加这个参数,会提示报错,因为这个工具默认是不允许在从库上修改数据的,但我们这里为了不在主库上dump出来,再到从库上导入进去,加了这个参数。
(2)master 和slave 的位置要保持源和目标的关系,否则调换位置,则会出现以slave的表来修复master的表,那样就完蛋了。
剩下的很多工具,需要时间去学习和实践,让我们更方便的管理mysql。
四 脚本
以下是自己写的比较简单的脚本,可以结合crontab,在数据库空闲时间执行检查和alter
#!/bin/bash
date1=`date +%Y%m%d_%H%M%S`
log_path="/var/log/maatkit/DB"
database="DB"
master_ip="192.168.0.229"
slave_ip="172.16.10.71"
[ ! -d ${log_path} ] && mkdir -p ${log_path}
/usr/local/bin/mk-table-checksum -d DB h=192.168.0.229,u=maatkit_user,p=password,P=3306 h=172.16.10.71,u=maatkit_user,p=password,P=3306 --count |/usr/local/bin/mk-checksum-filter >> ${log_path}/${database}_${date1}.log
count_diff_cets=`cat ${log_path}/${database}_${date1}.log |wc -l`
if [ ${count_diff_cets} -ge 2 ]
then
sed -n -e 'n' -e 'p' ${log_path}/${database}_${date1}.log|awk '{print $2}'|
while read i
do
/usr/bin/sendEmail -f "Mysql_ALTER<[email protected]>" -s smtp.gmail.com:587 -xu XXXXX -xp XXXXPASSOWRD -t [email protected] -u "${slave_ip} mysql slave problem" -m "${slave_ip} mysql slave from ${master_ip} check by script: $0,maatkit-checksum have found different tables with $i `date`"
/usr/local/bin/mk-table-sync --execute --print --charset=utf8 --no-check-slave h=192.168.0.229,u=maatkit_user,p=password h=172.16.10.71,u=maatkit_user,p=password -d DB -t $i
done
fi