免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2936 | 回复: 4
打印 上一主题 下一主题

刚写的一个自动跳过从库复制SQL进程错误脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-30 19:01 |只看该作者 |倒序浏览
首先,找一台监控机,确保有登陆各从库查看复制状态的权限。
比如在一台主机名为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. mysql_host=("db2" "db3" "db4" "db5" "db6" "db7" "db8" "db9" "db10" "db11" "db12" "db13")
  9. mysql_port=(3306 3306 3306 3306 3306 3306 3406 3306 3307 3406 3309 3310)
  10. mysql_user=("dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser" "dmuser")
  11. mysql_password=("dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword" "dmpassword")

  12. #loop for checking
  13. len=${#mysql_host[*]}
  14. i=0
  15. while  [ $i -lt $len ]
  16. do
  17.     #get slave status
  18.     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"`

  19.     #check SQL Thread
  20.     if (echo "$status"|egrep "Slave_IO_Running: *Yes" 2>&1 > /dev/null) && (echo "$status"|egrep "Slave_SQL_Running: *No" 2>&1 > /dev/null)
  21.     then

  22.        #log error
  23.        sql_error=`echo "$status"|egrep "Last_SQL_Error:" | awk -F 'Last_SQL_Error:' '{printf $2}'`
  24.        sql_erroro=`echo "$status"|egrep "Last_SQL_Errno:" | awk -F 'Last_SQL_Errno:' '{printf $2}'`
  25.        echo `date +%y%m%d%H%M%S`"    "${mysql_host[$i]}:${mysql_port[$i]}"    "${sql_erroro}"    "${sql_error} >> /server/daemon/slavedm.log

  26.        #stop slave
  27.        /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

  28.        #skip error
  29.        /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

  30.        #start slave
  31.        /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

  32.     fi
  33.     let i++
  34. 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. mysql> create table test3 (id int(10));
  4. Query OK, 0 rows affected (0.00 sec)

  5. mysql> alter table test3 add index id(id);
  6. Query OK, 0 rows affected (0.01 sec)
  7. Records: 0  Duplicates: 0  Warnings: 0
复制代码


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

  1. mysql> use test
  2. Database changed

  3. mysql> show tables;
  4. +----------------+
  5. | Tables_in_test |
  6. +----------------+
  7. | test1          |
  8. | test2          |
  9. | test3          |
  10. +----------------+
  11. 3 rows in set (0.00 sec)
  12. [color=Blue]可以看到test3出现在test库里,我们把它的索引删除,然后再回到主库删除索引,以引发复制错误[/color]
  13. mysql> alter table test3 drop index id;
  14. Query OK, 0 rows affected (0.01 sec)
  15. 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.              Slave_IO_Running: Yes
  4.             Slave_SQL_Running: No

  5.                Last_SQL_Errno: 1091
  6.                Last_SQL_Error: Error 'Can't DROP 'id'; check that column/key exists' on query. Default database: 'test'. Query: 'alter table test3 drop index id'
  7. 1 row in set (0.00 sec)

  8. [color=Blue]可以看到复制错误了[/color]
复制代码


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

  1. #/server/daemon/slavedm.sh
复制代码


再看db11

  1. mysql> show slave status\G

  2. ......省略其他部份
  3.              Slave_IO_Running: Yes
  4.             Slave_SQL_Running: Yes
  5. [color=Blue]可以看到复制恢复正常了[/color]
复制代码



看监控日志

  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
复制代码

[ 本帖最后由 Hellex 于 2008-11-30 19:22 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-30 20:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-11-30 22:06 |只看该作者
IO 错误就不行了。

论坛徽章:
0
4 [报告]
发表于 2008-12-01 09:15 |只看该作者
原帖由 yueliangdao0608 于 2008-11-30 22:06 发表
IO 错误就不行了。



这只是写了对SQL进程错误的处理

其他的比如延时监控之类的可以照着改

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
5 [报告]
发表于 2008-12-01 13:46 |只看该作者
不错。根据需求改改就很好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP