php在linux下检测mysql同步状态的方法
本文实例讲述了php在linux下检测mysql同步状态的方法。分享给大家供大家参考。具体分析如下:
这里通过两个实例来介绍mysql同步状态检测实现方法。代码如下:
#!/bin/sh #checkMySQL_SlaveStatus #crontabtime00:10 MYSQL_USER="root" MYSQL_PWD="123456" MYSQL_SLAVE_LOG="/tmp/check_mysql_slave.log" EMAIL="1351010****@139.com" MYSQL_PORT=`netstat-na|grep"LISTEN"|grep"3306"|awk-F[:""]+'{print$5}'` MYSQL_IP=`ifconfigeth0|grep"inetaddr"|awk-F[:""]+'{print$4}'` MYSQL_SLAVE_STATUS=$(/usr/local/webserver/mysql/bin/mysql-uroot-psylc23hua-S/tmp/mysql.sock-e "showslavestatusG"|grep-i"running") IO_ENV=`echo$MYSQL_SLAVE_STATUS|grepIO|awk'{print$2}'` SQL_ENV=`echo$MYSQL_SLAVE_STATUS|grepSQL|awk'{print$2}'` NOW=$(date-dtoday+'%Y-%m-%d%H:%M:%S') if["$MYSQL_PORT"="3306"];then echo"mysqlisrunning!" else mail-s"warn!server:$MYSQL_IPmysqlisdown""$EMAIL" fi if["$IO_ENV"="Yes"-a"$SQL_ENV"="Yes"];then echo"Slaveisrunning!" else echo"[$NOW]Slaveisnotrunning!">>"$MYSQL_SLAVE_LOG" cat"$MYSQL_SLAVE_LOG"|mail-s"WARN!${MySQL_IP}_replicate_error""$EMAIL" fi exit0
php实例代码,代码如下:
check_rep.php:
if(emptyempty($_REQUEST["key"]))die(':)missingkey'); if($_REQUEST["key"]!='xupeng')die(':)errorkey'); include("mysql_instance.php"); include("check_status_api.php"); define("USERNAME","用户名"); define("PASSWORD","密码"); define("DEBUGMODE",false); $instances=get_instances(); if($instances){ echo<< <!--30分钟自动刷新--> END; echo" n"; if(!DEBUGMODE){ echo" n"; }else{ echo" n"; } foreach($instancesas$host){ $res=check_mysql_replication_status($host,USERNAME,PASSWORD); if(!DEBUGMODE){ switch($res["result"]){ case-4: $memo="未知异常"; break; case-3: $memo="查询失败"; break; case-2: $memo="无法连接端口"; break; case-1: $memo="状态未知"; break; case0: $memo="OK"; break; case1: $memo="同步失败"; if($res["Slave_IO_Running"]<>"Yes"){ $memo.=$res["Last_IO_Error"]."(". $res ["Last_IO_Errno"].")"; } if($res["Slave_SQL_Running"]<>"Yes"){ $memo.=$res["Last_SQL_Error"]."(". $res ["Last_SQL_Errno"].")"; } break; case2: $memo="数据库未设置同步"; break; } echo" n"; }else{ echo" n"; } } echo" <tableborder=""> <tbody> <tr> <td>instance</td> <td>result</td> <td>Slave_IO_Running</td> <td>Slave_SQL_Running</td> <td>Master_Host</td> <td>Master_Port</td> <td>Replicate_Do_DB</td> <td>memo</td> </tr> <tr> <td>instance</td> <td>result</td> <td>Slave_IO_Running</td> <td>Slave_SQL_Running</td> <td>Master_Host</td> <td>Master_Port</td> <td>Replicate_Do_DB</td> <td>Slave_IO_State</td> <td>Last_IO_Errno</td> <td>Last_IO_Error</td> <td>Last_SQL_Errno</td> <td>Last_SQL_Error</td> </tr> <tr> <td>{$host}</td> <td>{$res['result']}</td> <td>{$res['Slave_IO_Running']}</td> <td>{$res['Slave_SQL_Running']}</td> <td>{$res['Master_Host']}</td> <td>{$res['Master_Port']}</td> <td>{$res['Replicate_Do_DB']}</td> <td>{$memo}</td> </tr> <tr> <td>{$host}</td> <td>{$res['result']}</td> <td>{$res['Slave_IO_Running']}</td> <td>{$res['Slave_SQL_Running']}</td> <td>{$res['Master_Host']}</td> <td>{$res['Master_Port']}</td> <td>{$res['Replicate_Do_DB']}</td> <td>{$res['Slave_IO_State']}</td> <td>{$res['Last_IO_Errno']}</td> <td>{$res['Last_IO_Error']}</td> <td>{$res['Last_SQL_Errno']}</td> <td>{$res['Last_SQL_Error']}</td> </tr> </tbody> </table> n"; echo<< END; }else{ die("nomysqlinstancesdefined."); }
check_status_api.php:
/* *检查mysql服务器的同步状态 */ functioncheck_mysql_replication_status($host,$username,$password) { //默认状态未知 $r=array( "result"=>-1 ); try{ $dbh=@mysql_connect($host,$username,$password); if(!$dbh){ //无法连接 $r["result"]=-2; return($r); } $query="SHOWSLAVESTATUS"; $res=@mysql_query($query,$dbh); $err=@mysql_error(); if($err){ //无法连接 $r["result"]=-3; return($r); } $row=mysql_fetch_array($res); $r=$row; if(($r["Slave_IO_Running"]=="Yes")&&($r["Slave_SQL_Running"]=="Yes")) { $r["result"]=0; }else{ if(!emptyempty($row)){ $r["result"]=1; }else{ $r["result"]=2; } } }catch(Exception$e){ $r["result"]=-4; } return($r); }
mysql_instance.php:
//GRANTREPLICATIONCLIENTON*.*TO'用户名'@'监控主机ip'IDENTIFIEDBY'密码'; $mysql_instances= array(); $mysql_instances[]="远程ip:端口";
functionget_instances() { global$mysql_instances; return$mysql_instances; }