MYSQL日志中ERROR GENERAL SLOW日志分析简述
2015-08-23 10:48
519 查看
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 按执行时间排序
完
相关文章推荐
- MySQL中的运算符使用实例展示
- Mysql 存储过程基本语法
- MySQL查询结果按某值排序
- mysql 主从复制原理及基本过程
- 在MAC下配置MySQL 5.7 数据库的编码问题
- mysql -- 重装mysql失败的解决办法
- mysql 日期转换 比较
- MySQL 的数据去哪了
- MAC MySQL配置安装及ROOT权限设置
- 彻底卸载MYSQL
- ubuntu 14.0 安装/卸载mysql方法
- Mysql的sql_mode设置
- MySQL日志管理
- mysql里的字符串类似split函数
- mysql 数据库备份 还原 导入sql文件的命令方法
- MySql 事务+异常处理+异常抛出
- mysql数据库主从复制配置
- MySQL必知必会(使用子查询)
- B\S备忘录26——windows下的mysql cluster搭建
- 如何选择mysql的存储引擎