首先,找一台监控机,确保有登陆各从库查看复制状态的权限。
比如在一台主机名为Admin的机器上,编写监控脚本slavedm.sh,保存为如 /server/daemon/slavedm.sh



slavedm.sh源码:

  1. #!/bin/sh  
  2. #  
  3. # Slave Daemon  
  4. # @version 1.0  
  5. # @author Hellex <[email]Hellex@live.com[/email]>  
  6. #  
  7.  
  8. #从库服务器配置,分别是主机名,端口,用户名,密码,请一一对应  
  9. mysql_host=("db2" "db3" "db4" "db5" "db6" "db7" "db8" "db9" "db10" "db11" "db12" "db13")  
  10. mysql_port=(3306 3306 3306 3306 3306 3306 3406 3306 3307 3406 3309 3310)  
  11. mysql_user=("dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser")  
  12. mysql_password=("dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword")  
  13.  
  14. #loop for checking  
  15. len=${#mysql_host[*]}  
  16. i=0  
  17. while  [ $i -lt $len ]  
  18. do  
  19.     #get slave status  
  20.     status=`/usr/local/webserver/mysql/bin/mysql  -h${mysql_host[$i]} -u${mysql_user[$i]} -p${mysql_password[$i]} -P${mysql_port[$i]} -e"SHOW SLAVE STATUS\G"`  
  21.  
  22.     #check SQL Thread  
  23.     if (echo "$status"|egrep "Slave_IO_Running: *Yes" 2>&1 > /dev/null) && (echo "$status"|egrep "Slave_SQL_Running: *No" 2>&1 > /dev/null)  
  24.     then  
  25.  
  26.        #log error  
  27.        sql_error=`echo "$status"|egrep "Last_SQL_Error:" | awk -F 'Last_SQL_Error:' '{printf $2}'`  
  28.        sql_erroro=`echo "$status"|egrep "Last_SQL_Errno:" | awk -F 'Last_SQL_Errno:' '{printf $2}'`  
  29.        echo `date +%y%m%d%H%M%S`"    "${mysql_host[$i]}:${mysql_port[$i]}"    "${sql_erroro}"    "${sql_error} >> /server/daemon/slavedm.log  
  30.  
  31.        #stop slave  
  32.        /usr/local/webserver/mysql/bin/mysql  -h${mysql_host[$i]} -u${mysql_user[$i]} -p${mysql_password[$i]} -P${mysql_port[$i]} -e"STOP SLAVE" 2>&1 > /dev/null  
  33.  
  34.        #skip error  
  35.        /usr/local/webserver/mysql/bin/mysql  -h${mysql_host[$i]} -u${mysql_user[$i]} -p${mysql_password[$i]} -P${mysql_port[$i]} -e"SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1" 2>&1 > /dev/null  
  36.  
  37.        #start slave  
  38.        /usr/local/webserver/mysql/bin/mysql  -h${mysql_host[$i]} -u${mysql_user[$i]} -p${mysql_password[$i]} -P${mysql_port[$i]} -e"START SLAVE" 2>&1 > /dev/null  
  39.  
  40.     fi  
  41.     let i++  
  42. done 

slavedm.sh脚本做的工作就是检查从库复制的IO及SQL进程,当IO进程正常,SQL不正常的时候,说明SQL执行有错误,这时候脚本自动把错误记录下来。
格式如:yymmddHHMMSS    主机名:端口    错误代码    错误信息
这些错误会记录到slavedm.log文件
记录完错误之后,slavedm.sh执行跳过错误语句
/usr/local/webserver/mysql/bin/mysql工具的地址请根据自己的情况更改,这里就不设为变量了。


给slavedm.sh添加可执行权限:

  1. #chmod +x /server/daemon/slavedm.sh 

我们来做一下测试
登陆主库,在test库建一个test3表,并给它加一个index

  1. mysql> use test  
  2. Database changed  
  3.  
  4. mysql> create table test3 (id int(10));  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.  
  7. mysql> alter table test3 add index id(id);  
  8. Query OK, 0 rows affected (0.01 sec)  
  9. Records: 0  Duplicates: 0  Warnings: 0 

登陆其中一台从库,假如db11

  1. mysql> use test  
  2. Database changed  
  3.  
  4. mysql> show tables;  
  5. +----------------+  
  6. | Tables_in_test |  
  7. +----------------+  
  8. | test1          |   
  9. | test2          |   
  10. | test3          |   
  11. +----------------+  
  12. rows in set (0.00 sec)  
  13. --可以看到test3出现在test库里,我们把它的索引删除,然后再回到主库删除索引,以引发复制错误 
  14. mysql> alter table test3 drop index id;  
  15. Query OK, 0 rows affected (0.01 sec)  
  16. Records: 0  Duplicates: 0  Warnings: 0 

回到主库

  1. mysql> alter table test3 drop index id;  
  2. Query OK, 0 rows affected (0.05 sec)  
  3. Records: 0  Duplicates: 0  Warnings: 0 

再看db11

  1. mysql> show slave status\G  
  2.  
  3. --......省略其他部份  
  4.              Slave_IO_Running: Yes  
  5.             Slave_SQL_Running: No 
  6.  
  7.                Last_SQL_Errno: 1091  
  8.                Last_SQL_Error: Error 'Can'DROP 'id'check that column/key exists' on query. Default database: 'test'. Query: 'alter table test3 drop index id'  
  9. 1 row in set (0.00 sec)  
  10.  
  11. --可以看到复制错误了 

然后我们到监控机执行slavedm.sh

  1. #/server/daemon/slavedm.sh 

再看db11

  1. mysql> show slave status\G  
  2.  
  3. --......省略其他部份  
  4.              Slave_IO_Running: Yes  
  5.             Slave_SQL_Running: Yes  
  6. --可以看到复制恢复正常了 

看监控日志

  1. #cat /server/daemon/slavedm.log  
  2. 081130192001    db11:3306     1091     Error 'Can't DROP 'id'; check that column/key exists' on query. Default database: 'test'. Query: 'alter table test3 drop index id' 

说明slavedm.sh脚本功能很正常。
我们把slavedm.sh添加到crontab,每5分钟执行一次

  1. #crontab -e 

添加以下内容

  1. #slave daemon  
  2. 0-55/5 * * * * /server/daemon/slavedm.sh 
此文章由 flyinweb 于 2010-12-10 16:52:37 编辑

本日志由 flyinweb 于 2009-06-24 08:48:15 发表,目前已经被浏览 4265 次,评论 0 次;

作者添加了以下标签: Last_SQL_ErrorLast_SQL_ErrorNo

引用通告:http://www.517sou.net/Article/98/Trackback.ashx

评论订阅:http://www.517sou.net/Article/98/Feeds.ashx

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)