在使用lepus3.7监控MySQL数据库的时候,碰到了以下几个问题,本博客给出了这些问题产生的原因,以及相应的解决办法。

1.问题1:php页面无法连接数据库

直接使用php程序执行php文件,可以连接mysql,但是在httpd中同样的php页面无法连接mysql。

lepus的web程序(PHP代码)无法连接数据库时,web界面上什么操作也无法继续。

为此编写了最简单的PDO连接测试代码:

php代码如下:

[x@coe2coe lepus]$ cat mysql.php<?php try{ #$dsn="mysql:host=127.0.0.1;dbname=lepus;"; $dsn="mysql:host=11.1.1.11;dbname=lepus;"; $user="coe2coe"; $pwd="XXXXXXXXXX"; $sql="select now() as a"; $dbh=new PDO($dsn,$user,$pwd); $stmt=$dbh->prepare($sql); $stmt->execute(); $row=$stmt->fetch(PDO::FETCH_ASSOC); echo "result:".$row['a']; } catch(PDOException $e) { echo "FAILED:".$e->getMessage(); }?>
[x@coe2coe lepus]$ php mysql.phpresult:2018-09-27 00:03:44

FAILED:SQLSTATE[HY000] [2003] Can't connect to MySQL server on '11.1.1.11' (13)

lepus的web程序给出的错误提示信息更加模糊。

原因:

通过一番baidu之后,终于看到了一个比较靠谱的分析。

Linux(CentOS7)的selinux安全机制禁止了httpd中的模块访问网络。

[x@coe2coe lepus]$ sudo getsebool -a |grep httpdhttpd_anon_write --> offhttpd_builtin_scripting --> onhttpd_can_check_spam --> offhttpd_can_connect_ftp --> offhttpd_can_connect_ldap --> offhttpd_can_connect_mythtv --> offhttpd_can_connect_zabbix --> offhttpd_can_network_connect --> offhttpd_can_network_connect_cobbler --> offhttpd_can_network_connect_db --> offhttpd_can_network_memcache --> offhttpd_can_network_relay --> offhttpd_can_sendmail --> offhttpd_dbus_avahi --> offhttpd_dbus_sssd --> offhttpd_dontaudit_search_dirs --> offhttpd_enable_cgi --> onhttpd_enable_ftp_server --> offhttpd_enable_homedirs --> offhttpd_execmem --> offhttpd_graceful_shutdown --> onhttpd_manage_ipa --> offhttpd_mod_auth_ntlm_winbind --> offhttpd_mod_auth_pam --> offhttpd_read_user_content --> offhttpd_run_ipa --> offhttpd_run_preupgrade --> offhttpd_run_stickshift --> offhttpd_serve_cobbler_files --> offhttpd_setrlimit --> offhttpd_ssi_exec --> offhttpd_sys_script_anon_write --> offhttpd_tmp_exec --> offhttpd_tty_comm --> offhttpd_unified --> offhttpd_use_cifs --> offhttpd_use_fusefs --> offhttpd_use_gpg --> offhttpd_use_nfs --> offhttpd_use_openstack --> offhttpd_use_sasl --> offhttpd_verify_dns --> off

临时办法:临时禁用SELINUX。

[x@coe2coe lepus]$ sudo setenforce 0

永久办法:修改selinux配置文件,禁用SELINUX。

[x@coe2coe lepus]$ cat /etc/selinux/config# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#  enforcing - SELinux security policy is enforced.#  permissive - SELinux prints warnings instead of enforcing.#  disabled - No SELinux policy is loaded.#SELINUX=enforcingSELINUX=disabled# SELINUXTYPE= can take one of three two values:#  targeted - Targeted processes are protected,#  minimum - Modification of targeted policy. Only selected processes are protected. #  mls - Multi Level Security protection.SELINUXTYPE=targeted

再次在浏览器中访问这个php页面:

result:2018-09-27 00:09:26

2.问题2:lepus日志中出现group by警告。

2018-09-27 01:12:41 [WARNING] check mysql 11.1.1.11:3408 failure: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'information_schema.processlist.USER' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_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 |+-------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.01 sec)

去掉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

没有查询到数据.

解决办法:

show_compatibility_56=1

4.问题4:表空间分析没有数据。

5.问题5:慢查询没有数据。

前提:

MySQL的my.cnf配置文件中已经配置了慢查询日志。

slow_query_log=1long_query_time=10log_slow_admin_statements=1log_slow_slave_statements=1

1.lepus慢查询分析基于pecona-toolkit工具包中的pt-query-digest程序。需要先安装这个工具包。

2.pt-query-digest程序与lepus3.7建的表有点冲突。

Pipeline process 5 (iteration) caused an error: DBD::mysql::st execute failed: Data truncated for column 'checksum' at row 1 [for Statement "REPLACE INTO `lepus`.`mysql_slow_query_review_history`(`checksum`, `sample`, `serverid_max`, `db_max`, `user_max`, `ts_min`,
.....
Terminating pipeline because process 4 (iteration) caused too many errors.

修改mysql_slow_query_review:

mysql> alter table mysql_slow_query_review modify checksum varchar(100) not null ;Query OK, 0 rows affected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0修改mysql_slow_query_review_history:mysql> alter table mysql_slow_query_review_history modify checksum varchar(100) not null;Query OK, 0 rows affected (0.02 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table mysql_slow_query_review_history modify serverid_max smallint(4) null;Query OK, 0 rows affected (0.02 sec)Records: 0 Duplicates: 0 Warnings: 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 "select id,host,port from $lepus_db_database.db_servers_mysql where host='$mysql_host' and port=$mysql_port\G" 2>/dev/null |grep "id:" |awk -F": " '{print $2}')

这个总的定时脚本如下,测试时开启了6个MySQL实例,端口依次为:3306 3307 3308 3406 3407 3408.其中3306和3406为MASTER,其它为SLAVE。在这个总的脚本中对每个实例调用lepus_slowquery.sh。

[x@coe2coe mysql]$ cat slowquery.sh################################################################### FileName :slowquery.sh# Author  : coe2coe@qq.com# Created  :2018-09-27# Description :http://www.cnblogs.com/coe2coe/##################################################################!/bin/bashports=(3306 3307 3308 3406 3407 3408)i=0while [ $i -lt ${#ports[*]} ]do port=${ports[$i]} echo -e "/lepus_slowquery.sh $port" ./lepus_slowquery.sh $port  let i=i+1done
long_query_timeslow_query_log_file
[x@coe2coe mysql]$ cat lepus_slowquery.sh#!/bin/bash#****************************************************************## ScriptName: /usr/local/sbin/lepus_slowquery.sh# Create Date: 2014-03-25 10:01# Modify Date: 2014-03-25 10:01#***************************************************************#port=$1id=$2if [ "$port" == "" ] || [ $port -lt 1 ] then echo -e "invalid argument port" exit 1fiecho -e "mysql port is :{$port} "#config lepus database serverlepus_db_host="11.1.1.11"lepus_db_port=3306lepus_db_user="lepus_monitor"lepus_db_password="XXXXXXXXXX"lepus_db_database="lepus"#config mysql servermysql_client="/usr/bin/mysql"mysql_host="11.1.1.11"mysql_port=$portmysql_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 "select id,host,port from $lepus_db_database.db_servers_mysql where host='$mysql_host' and port=$mysql_port\G" 2>/dev/null |grep "id:" |awk -F": " '{print $2}')if [ "$id" == "" ] || [ $id -lt 1 ]then echo -e "invalid argument id" exit 2fiecho -e "mysql lepus id is :{$id}"#config slowquryslowquery_dir="/tmp/"slowquery_long_time=1slowquery_file=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show variables like 'slow_query_log_file'" 2>/dev/null |grep log|awk '{print $2}'`pt_query_digest="/usr/bin/pt-query-digest"#config server_idlepus_server_id=$id#collect mysql slowquery log into lepus database$pt_query_digest --user=$lepus_db_user --password=$lepus_db_password --port=$lepus_db_port --review h=$lepus_db_host,D=$lepus_db_database,t=mysql_slow_query_review --history h=$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##### set a new slow query log ############tmp_log=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "select concat('$slowquery_dir','slowquery_', '$port','_', date_format(now(),'%Y%m%d%H'),'.log');" 2>/dev/null |grep log|sed -n -e '2p'`#config mysql slowquery#$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "set global slow_query_log=1;set global long_query_time=$slowquery_long_time;" 2>/dev/null#$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "set global slow_query_log_file = '$tmp_log'; "#delete log before 7 days#cd $slowquery_dir#/usr/bin/find ./ -name 'slowquery_*' -mtime +7|xargs rm -rf ;####END####

在mysql_slow_query_review表中记录了慢查询,但是在lepus web界面上没有数据。

执行:select sleep(14)有时候无法在web界面查询到。

原因:有时候pt-query-digest产生的结果中db_max为NULL,导致查询不出来。

这个字段安装的原始数据库是NOT NULL,但是在NOT NULL的情况下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'");

原因:监控主机以及被监控主机上没有安装snmpd,snmptrapd。

解决办法:

在所有主机上安装snmpd和snmptrapd。

软件包:

x@coe2coe snmp]$ ls net-snmp*net-snmp-5.7.2-32.el7.x86_64.rpmnet-snmp-agent-libs-5.7.2-32.el7.x86_64.rpmnet-snmp-devel-5.7.2-32.el7.x86_64.rpmnet-snmp-libs-5.7.2-32.el7.x86_64.rpmnet-snmp-perl-5.7.2-32.el7.x86_64.rpmnet-snmp-python-5.7.2-32.el7.x86_64.rpmnet-snmp-sysvinit-5.7.2-32.el7.x86_64.rpmnet-snmp-utils-5.7.2-32.el7.x86_64.rpm

安装完毕后启动snmpd和snmptrapd服务。

总结

更多相关文章

  1. Android,LIstView中的OnItemClick点击无效的解决办法
  2. 华为手机Android(安卓)Studio开发不显示Logcat解决办法
  3. 安卓9.0 http请求数据失败解决办法
  4. Android(安卓)Studio 导入包时报 Duplicate files copied in APK
  5. Android(安卓)启动时闪一下黑屏问题的解决办法
  6. Android(安卓)webview Not allowed to load local resource异常
  7. Android(安卓)SDK Manager更新版慢解决办法
  8. 关于新版SDK报错You need to use a Theme.AppCompat theme的两种
  9. Android小问题解决办法记录

随机推荐

  1. 《Android开发从零开始》——13.Table La
  2. 关于android中的内部存储与外部存储
  3. Android相对布局实现各种梅花效果
  4. Android 并发之Handler、Looper、Message
  5. 如何在Android上安装apk软件
  6. 5、frida进阶-Android逆向之旅---Hook神
  7. 常用知识篇 一 Selector state状态对应说
  8. 二十四、Android文件的读写
  9. Android开发之获取手机网络状态及网络是
  10. [Android] TextView只显示一行,多余显示