admin
管理员
管理员
  • UID1
  • 粉丝0
  • 关注0
  • 发帖数744
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:2122回复:0

MYSQL日志中ERROR GENERAL SLOW日志分析简述

楼主#
更多 发布于:2017-09-09 21:23


ERROR日志

我们经常在运行MySQL时会出一些错误,也经常被这些错误搞得晕头转向。当然解决这些问题的首要任务是找到日志信息。
进入mysql执行:

mysql> show variables like '%error%';
+--------------------+-----------------------------+
| Variable_name      | Value                       |
+--------------------+-----------------------------+
| log_error          | /usr/local/mysql/mysqld.log |
+--------------------+-----------------------------+
该日志记录三个级别error、warning、information。
如果你的日志文件找不到error信息,并且你希望认为制造ERROR错误那么可以通过以下方法:



人为制造error信息:

   将表文件ibd重命名
#data也就是数据库文件存放位置
[root@localhost data]# cd /home/data/mysql/data/test
#aaaa是表名
[root@localhost data]# mv aaaa.ibd aaaa.ibd
#mysqld5612是mysql服务名称
[root@localhost data]# service mysqld5612 restart 
 
找不到data目录,可以通过以下命令查找
mysql> show variables like '%datadir%';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| datadir       | /home/data/mysql/data/ |
+---------------+------------------------+

写满磁盘,制造无法录入数据,报ERROR信息(没有尝试)
dd if=/dev/zero bs=64 count=3200000000 of=/tmp/run/1gb.file
经过以上步骤重启mysql数据库,我相信你的日志文件中已经有error信息了。嘿嘿。例如我把t5表的ibd文件修改后报如下错误:
[root@localhost mysql]# more mysqld_error.log 
2015-07-21 01:52:50 7f037bb7a720  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
2015-07-21 01:52:50 4268 [ERROR] InnoDB: Could not find a valid tablespace file for 'test/t5'. See http://dev.my
sql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
2015-07-21 01:52:50 4268 [ERROR] InnoDB: Tablespace open failed for '"test"."t5"', ignored.
2015-07-24 00:46:30 7f5d2843f720  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.


获得全局ERROR信息

写入log1_ERROR.log文件:
more /usr/local/mysql/mysqld.log|grep ERROR -i > log1_ERROR.log



抓取innodb的error信息

写入log1_Innodb_Error.log文件
more /usr/local/mysql/mysqld.log |grep InnoDB |grep ERROR > log1_Innodb_Error.log



抓取独立的非ERROR innodb信息


more /usr/local/mysql/mysqld.log |grep InnoDB |grep -v Note |grep -v Error |more > log1_InnoDB.log


抓取socket信息


more /usr/local/mysql/mysqld.log |grep socket |grep ERROR > log1_ERROR.log


抓取note信息


more /usr/local/mysql/mysqld.log|grep Note > log1_Note.log


抓取Warning 信息


more /usr/local/mysql/mysqld.log|grep Warning > log1_Warning.log


GENERAL日志

general日志常用于数据库审计,他记录数据库的所有操作(ddl 数据库定义结构语句,dml 数据库增删改操作,select数据库查询操作)。开启general log 会损耗3% – 5%发性能,但检查执行轨迹,可以发现slow无法发现的问题。


general日志默认是关闭的。

可以通过以下命令开关
开启:
set global general_log = on;或者set global general_log = 1;
关闭:
set global general_log = off;或者set global general_log = 0;



查看日志开启状态及日志地址

可以通过
mysql> show variables like '%general%';
+------------------+-------------------------------------+
| Variable_name    | Value                               |
+------------------+-------------------------------------+
| general_log      | ON                                  |
| general_log_file | /home/data/mysql/data/localhost.log |
+------------------+-------------------------------------+
2 rows in set (0.00 sec)



查看general日志


[root@localhost data]# tail -f localhost.log
/usr/local/mysql/bin/mysqld, Version: 5.6.13-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /usr/local/mysql/mysql.sock
Time                 Id Command    Argument
150823  3:55:40     2 Query show variables like '%general%'
150823  3:57:49     2 Query SELECT DATABASE()
            2 Init DB   test
150823  3:58:04     2 Query select * from t1
150823  3:58:16     2 Query select * from t1 where id=1
150823  3:58:27     2 Query create database t5
150823  3:58:52     2 Query delete from t1 where id=2
150823  3:59:02     2 Query select * from t1
150823  4:09:47     2 Query show variables like '%error%'


SLOW日志

检查slow日志是数据库管理及优化中必不可少的工作,每天都需要检测及时发现数据库问题。保证数据库稳定运行。


slow日志开启

在my.cnf上:
slow_query_log #声明记录slow日期
long_query_time = 0.3#大于3秒记录
slow_query_log_file = /home/data/mysql/data/slow.log
在线实时:
set global slow_query_log=1;#重启数据库失效



slow log 关闭

my.cnf里面注释 #slow_query_log
在线关闭 :set global slow_query_log=0;



如何利用slow log定位mysql数据库异常信息

其实定位有问题的sql很简单,就关键两点,数量和时间。
- 看count排名
- 看Time排名



分析脚本mslow.sh

该脚本使用的工具是mysql自带的slow分析工具mysqldumpslow,直接可以使用,网上关于该工具的教程一大堆,这篇博文就不在赘述了我直接把我写的分析脚本贴出来,方便大家使用。该脚本主要做的事情如下:
1. 抽取slow日志,按执行次数统计并写入单独文件
2. 按执行时间统计并写入单独文件

#!/bin/bash
echo "#######M_SLOW.SH########"
#声明日期变量
datestr=$(date -d "yesterday" +"%Y-%m-%d_%H%M%S")
#声明mysql命令变量
mysql_command=/usr/local/mysql/bin/mysql
#声明mysqldumpslow变量
mysqldumpslow_command=/usr/local/mysql/bin/mysqldumpslow
#进入slowlogs目录,保证这个目录是有效存在的
cd /usr/local/mysql/slowlogs
#slowlogs目录下新建日期命名的文件夹
mkdir $datestr
cd $datestr
#关闭slow日志
$mysql_command -uroot -proot -e 'set global slow_query_log=0;';
#查看是否关闭
$mysql_command -uroot -proot -e 'show variables like "slow_query_log";';
#如果mysqld_slow存在则删除
rm -rf mysqld_slow.log
#将slow日期放到当前日期目录
cp /usr/local/mysql/mysqld_slow.log ./
#清空数据库slow日志,保证下次写入新的slow日志
> /usr/local/mysql/mysqld_slow.log
#开启slow日志
$mysql_command -uroot -proot -e 'set global slow_query_log=1;';
$mysql_command -uroot -proot -e 'show variables like "slow_query_log";';
#-s 排序 c(count)按执行数量排序 2返回两条 写入mysqld_slow_count_日期.log文件
$mysqldumpslow_command -s c -t 2 mysqld_slow.log > mysqld_slow_count_$datestr.log
#-s 排序 at按平均查询时间排序 2返回两条 写入mysqld_slow_time_日期.log文件
$mysqldumpslow_command -s at -t 2 mysqld_slow.log > mysqld_slow_time_$datestr.log

ps:写完脚本后注意添加执行权限chmod +x mslow.sh
执行方法# ./mslow.sh
一般都是通过定时任务执行脚本,一天一次,这样就可以实现相对自动的数据库管理了。
比如用crontab(具体用法网上很多)
每天0点执行一次:00 00 * * * /root/mslow.sh >> /tmp/check_slow.log 2>&1
需要注意的是执行脚本如果报Died at /usr/local/mysql/bin/mysqldumpslow line 161, <> chunk 236说明无法返回分析数据,可能是因为返回数量多或者是slow日志中就可返回的数量小于设定的返回数量,也就是 -s at -t 2 中的2这个参数,请酌情调整,一般设为10左右

执行mslow.sh脚本结果如下:
[root@localhost slowlogs]# ll
total 4
drwxr-xr-x. 2 root root 4096 Aug 21 10:32 2015-08-20_103237 这个就是datestr日期文件名
[root@localhost slowlogs]# cd 2015-08-20_103237/
[root@localhost 2015-08-20_103237]# ll
total 12
-rw-r--r--. 1 root root  303 Aug 21 10:32 mysqld_slow_count_2015-08-20_103237.log 按执行次数排序
-rw-r-----. 1 root root 3467 Aug 21 10:32 mysqld_slow.log copy过来的slow日志
-rw-r--r--. 1 root root  216 Aug 21 10:32 mysqld_slow_time_2015-08-20_103237.log 按执行时间排序
游客

返回顶部