MySQL数据库监控软件lepus使用问题以及解决办法
在使用lepus3.7监控MySQL数据库的时候,碰到了以下几个问题,本博客给出了这些问题产生的原因,以及相应的解决办法。
1. 问题1:php页面无法连接数据库
直接使用php程序执行php文件,可以连接mysql,但是在httpd中同样的php页面无法连接mysql。
lepus的web程序(PHP代码)无法连接数据库时,web界面上什么操作也无法继续。
为此编写了最简单的PDO连接测试代码:
php代码如下:
[x@coe2coelepus]$catmysql.php prepare($sql); $stmt->execute(); $row=$stmt->fetch(PDO::FETCH_ASSOC); echo"result:".$row['a']; } catch(PDOException$e){ echo"FAILED:".$e->getMessage(); } ?>
php程序直接执行php文件:
[x@coe2coelepus]$phpmysql.php result:2018-09-2700:03:44
通过浏览器访问这个页面:
FAILED:SQLSTATE[HY000][2003]Can'tconnecttoMySQLserveron'11.1.1.11'(13)
lepus的web程序给出的错误提示信息更加模糊。
原因:
通过一番baidu之后,终于看到了一个比较靠谱的分析。
Linux(CentOS7)的selinux安全机制禁止了httpd中的模块访问网络。
[x@coe2coelepus]$sudogetsebool-a|grephttpd httpd_anon_write-->off httpd_builtin_scripting-->on httpd_can_check_spam-->off httpd_can_connect_ftp-->off httpd_can_connect_ldap-->off httpd_can_connect_mythtv-->off httpd_can_connect_zabbix-->off httpd_can_network_connect-->off httpd_can_network_connect_cobbler-->off httpd_can_network_connect_db-->off httpd_can_network_memcache-->off httpd_can_network_relay-->off httpd_can_sendmail-->off httpd_dbus_avahi-->off httpd_dbus_sssd-->off httpd_dontaudit_search_dirs-->off httpd_enable_cgi-->on httpd_enable_ftp_server-->off httpd_enable_homedirs-->off httpd_execmem-->off httpd_graceful_shutdown-->on httpd_manage_ipa-->off httpd_mod_auth_ntlm_winbind-->off httpd_mod_auth_pam-->off httpd_read_user_content-->off httpd_run_ipa-->off httpd_run_preupgrade-->off httpd_run_stickshift-->off httpd_serve_cobbler_files-->off httpd_setrlimit-->off httpd_ssi_exec-->off httpd_sys_script_anon_write-->off httpd_tmp_exec-->off httpd_tty_comm-->off httpd_unified-->off httpd_use_cifs-->off httpd_use_fusefs-->off httpd_use_gpg-->off httpd_use_nfs-->off httpd_use_openstack-->off httpd_use_sasl-->off httpd_verify_dns-->off
解决办法:
临时办法:临时禁用SELINUX。
[x@coe2coelepus]$sudosetenforce0
永久办法:修改selinux配置文件,禁用SELINUX。
[x@coe2coelepus]$cat/etc/selinux/config #ThisfilecontrolsthestateofSELinuxonthesystem. #SELINUX=cantakeoneofthesethreevalues: #enforcing-SELinuxsecuritypolicyisenforced. #permissive-SELinuxprintswarningsinsteadofenforcing. #disabled-NoSELinuxpolicyisloaded. #SELINUX=enforcing SELINUX=disabled #SELINUXTYPE=cantakeoneofthreetwovalues: #targeted-Targetedprocessesareprotected, #minimum-Modificationoftargetedpolicy.Onlyselectedprocessesareprotected. #mls-MultiLevelSecurityprotection. SELINUXTYPE=targeted
验证:
再次在浏览器中访问这个php页面:
result:2018-09-2700:09:26
2. 问题2:lepus日志中出现groupby警告。
2018-09-2701:12:41[WARNING]checkmysql11.1.1.11:3408failure:1055Expression#2ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'information_schema.processlist.USER'whichisnotfunctionallydependentoncolumnsinGROUPBYclause;thisisincompatiblewithsql_mode=only_full_group_by
原因:
这是lepus后端监控程序写的log。
默认情况下sql_mode包含ONLY_FULL_GROUP_BY。
mysql>select@@sql_mode; +-------------------------------------------------------------------------------------------------------------------------------------------+ |@@sql_mode| +-------------------------------------------------------------------------------------------------------------------------------------------+ |ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION| +-------------------------------------------------------------------------------------------------------------------------------------------+ 1rowinset(0.01sec)
解决办法:
去掉ONLY_FULL_GROUP_BY。
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
3. 问题3:复制监控查询不到数据。
没有查询到数据.
解决办法:
show_compatibility_56=1
4. 问题4:表空间分析没有数据。
5. 问题5:慢查询没有数据。
前提:
MySQL的my.cnf配置文件中已经配置了慢查询日志。
slow_query_log=1 long_query_time=10 log_slow_admin_statements=1 log_slow_slave_statements=1
原因:
1.lepus慢查询分析基于pecona-toolkit工具包中的pt-query-digest程序。需要先安装这个工具包。
2. pt-query-digest程序与lepus3.7建的表有点冲突。
Pipelineprocess5(iteration)causedanerror:DBD::mysql::stexecutefailed:Datatruncatedforcolumn'checksum'atrow1[forStatement"REPLACEINTO`lepus`.`mysql_slow_query_review_history`(`checksum`,`sample`,`serverid_max`,`db_max`,`user_max`,`ts_min`,
.....
Terminatingpipelinebecauseprocess4(iteration)causedtoomanyerrors.
修改mysql_slow_query_review:
mysql>altertablemysql_slow_query_reviewmodifychecksumvarchar(100)notnull; QueryOK,0rowsaffected(0.03sec) Records:0Duplicates:0Warnings:0 修改mysql_slow_query_review_history: mysql>altertablemysql_slow_query_review_historymodifychecksumvarchar(100)notnull; QueryOK,0rowsaffected(0.02sec) Records:0Duplicates:0Warnings:0 mysql>altertablemysql_slow_query_review_historymodifyserverid_maxsmallint(4)null; QueryOK,0rowsaffected(0.02sec) Records:0Duplicates:0Warnings:0
修改脚本:
原始的lepus_slowquery.sh文件存在一些问题。
(1) 需要人工指定lepus_server_id。这个脚本需要在每个MySQL服务器上部署,因此如果要监控的MySQL很多,会比较容易出错。
lepus_server_id这个参数很重要。下面的代码可以自动取得这个id。
id=$($mysql_client-h$lepus_db_host-P$lepus_db_port-u$lepus_db_user-p$lepus_db_password-e"selectid,host,portfrom$lepus_db_database.db_servers_mysqlwherehost='$mysql_host'andport=$mysql_port\G"2>/dev/null|grep"id:"|awk-F":"'{print$2}')
(2)同一台机器上如果部署有多个MySQL服务实例时,应该只需要一个定时任务即可,在另一脚本中同时对本机的多个MySQL服务实例进行检查。
这个总的定时脚本如下,测试时开启了6个MySQL实例,端口依次为:330633073308340634073408.其中3306和3406为MASTER,其它为SLAVE。在这个总的脚本中对每个实例调用lepus_slowquery.sh。
[x@coe2coemysql]$catslowquery.sh ################################################################## #FileName:slowquery.sh #Author:coe2coe@qq.com #Created:2018-09-27 #Description:http://www.cnblogs.com/coe2coe/ ################################################################# #!/bin/bash ports=(330633073308340634073408) i=0 while[$i-lt${#ports[*]}] do port=${ports[$i]} echo-e"/lepus_slowquery.sh$port" ./lepus_slowquery.sh$port leti=i+1 done
(3)原始的lepus_slowquery.sh会去修改MySQL的全局配置参数,个人认为不需要修改,这两个配置还是应该按照MySQL服务器的my.cnf文件中配置的为准,不应该因为部署了一个lepus监控系统就随意的修改这个参数。因此直接注释掉了最后面的几行代码。
long_query_time slow_query_log_file
修改后的完整的lepus_slowquery.sh文件如下:
[x@coe2coemysql]$catlepus_slowquery.sh #!/bin/bash #****************************************************************# #ScriptName:/usr/local/sbin/lepus_slowquery.sh #CreateDate:2014-03-2510:01 #ModifyDate:2014-03-2510:01 #***************************************************************# port=$1 id=$2 if["$port"==""]||[$port-lt1] then echo-e"invalidargumentport" exit1 fi echo-e"mysqlportis:{$port}" #configlepusdatabaseserver lepus_db_host="11.1.1.11" lepus_db_port=3306 lepus_db_user="lepus_monitor" lepus_db_password="XXXXXXXXXX" lepus_db_database="lepus" #configmysqlserver mysql_client="/usr/bin/mysql" mysql_host="11.1.1.11" mysql_port=$port mysql_user="lepus_monitor" mysql_password="XXXXXXXXXX" id=$($mysql_client-h$lepus_db_host-P$lepus_db_port-u$lepus_db_user-p$lepus_db_password-e"selectid,host,portfrom$lepus_db_database.db_servers_mysqlwherehost='$mysql_host'andport=$mysql_port\G"2>/dev/null|grep"id:"|awk-F":"'{print$2}') if["$id"==""]||[$id-lt1] then echo-e"invalidargumentid" exit2 fi echo-e"mysqllepusidis:{$id}" #configslowqury slowquery_dir="/tmp/" slowquery_long_time=1 slowquery_file=`$mysql_client-h$mysql_host-P$mysql_port-u$mysql_user-p$mysql_password-e"showvariableslike'slow_query_log_file'"2>/dev/null|greplog|awk'{print$2}'` pt_query_digest="/usr/bin/pt-query-digest" #configserver_id lepus_server_id=$id #collectmysqlslowquerylogintolepusdatabase $pt_query_digest--user=$lepus_db_user--password=$lepus_db_password--port=$lepus_db_port--reviewh=$lepus_db_host,D=$lepus_db_database,t=mysql_slow_query_review--historyh=$lepus_db_host,D=$lepus_db_database,t=mysql_slow_query_review_history--no-report--limit=100%--filter="\$event->{add_column}=length(\$event->{arg})and\$event->{serverid}=$lepus_server_id"$slowquery_file>/tmp/lepus_slowquery.log #####setanewslowquerylog########### #tmp_log=`$mysql_client-h$mysql_host-P$mysql_port-u$mysql_user-p$mysql_password-e"selectconcat('$slowquery_dir','slowquery_','$port','_',date_format(now(),'%Y%m%d%H'),'.log');"2>/dev/null|greplog|sed-n-e'2p'` #configmysqlslowquery #$mysql_client-h$mysql_host-P$mysql_port-u$mysql_user-p$mysql_password-e"setglobalslow_query_log=1;setgloballong_query_time=$slowquery_long_time;"2>/dev/null #$mysql_client-h$mysql_host-P$mysql_port-u$mysql_user-p$mysql_password-e"setglobalslow_query_log_file='$tmp_log';" #deletelogbefore7days #cd$slowquery_dir #/usr/bin/find./-name'slowquery_*'-mtime+7|xargsrm-rf; ####END####
6. 问题6:web慢查询查询不到lepus中的数据
在mysql_slow_query_review表中记录了慢查询,但是在lepusweb界面上没有数据。
执行:selectsleep(14)有时候无法在web界面查询到。
原因:有时候pt-query-digest产生的结果中db_max为NULL,导致查询不出来。
这个字段安装的原始数据库是NOTNULL,但是在NOTNULL的情况下pt-query-digest有时会插入NULL数据,导致报错。所以修改为了NULL。
修改为NULL后,web界面中查询时使用的PHP程序的SQL语句有问题,没有考虑NULL的情况,导致查询不出来这部分数据。
解决办法:
临时打开general_log这个全局参数,再做web查询慢日志,就可以很快找到这个SQL语句,再根据这个SQL语句就可以找到有问题的PHP代码。
将application/controllers/lp_mysql.php中的以下语句注释掉即可。
修改前:
$this->db->where("b.db_max!=",'information_schema'");
修改后:
//$this->db->where("b.db_max!=",'information_schema'");
7. 问题7:主机监控中的三项都没有数据。
原因:监控主机以及被监控主机上没有安装snmpd,snmptrapd。
解决办法:
在所有主机上安装snmpd和snmptrapd。
软件包:
x@coe2coesnmp]$lsnet-snmp* net-snmp-5.7.2-32.el7.x86_64.rpm net-snmp-agent-libs-5.7.2-32.el7.x86_64.rpm net-snmp-devel-5.7.2-32.el7.x86_64.rpm net-snmp-libs-5.7.2-32.el7.x86_64.rpm net-snmp-perl-5.7.2-32.el7.x86_64.rpm net-snmp-python-5.7.2-32.el7.x86_64.rpm net-snmp-sysvinit-5.7.2-32.el7.x86_64.rpm net-snmp-utils-5.7.2-32.el7.x86_64.rpm
CentOS7-everything-xxx.iso上有这些软件包。
安装完毕后启动snmpd和snmptrapd服务。
总结
以上所述是小编给大家介绍的MySQL数据库监控软件lepus使用问题以及解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。