相信很多同学都是用过mysql,那么在mysql 的优化过程中,我们会去查看mysql 的慢查询日志,那么首先我们需要打开慢查询日志,我们可以看一下慢查询是否打开。
[shell]show variables like '%slow%';
+---------------------+---------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------+
| log_slow_queries | ON |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+---------------------+---------------------------------+[/shell]
以上说明了你的慢查询处于开启状态,并且慢查询临界时间是2秒,慢查询日志也是开启,并且设置了慢查询的日志路径。
开启或者关闭慢查询日志可以使用以下这条命令:
[shell]SET GLOBAL slow_query_log = on
SET GLOBAL slow_query_log = off[/shell]
若果没有开启慢查询的话,我们可以在mysql的配置文件中修改
[shell]vim /etc/my.cnf
//日志存放位置,如果为空,则系统会默认命名为host_name-slow.log
log-slow-queries=/var/lib/mysql/slowquery.log
//设置超过多少秒的语句会被记录,默认为10S
long_query_time=2
//设置没有使用索引的语句也被记录下来
log-queries-not-using-indexes[/shell]
这样子,我们的慢查询日志就被打开了,但是很多同学发现这样一个问题,我们的慢查询打开之后格式有些乱,看起来不是很方便,有没有一些好的工具来帮助我们分析这个日志呢,okay,今天我们就来推荐一款mysqlsla。
这个工具的安装使用很简单,下载安装之后编译安装即可。
工具的使用很简单,不过有很多的参数,具体的参数使用可以到官方去找寻,这里列举一些常用的参数和命令
[shell]mysqlsla -lt slow --top 10 -sf "+select" --sort t_sum /var/log/slow.log| tee -a /tmp/record.log[/shell]
这个分析语句的意思是分析前十条执行时间最长的语句,这些语句要包含select类型,文件类型为慢查询。 /var/log/slow.log为你的慢查询日志的路径。因为我们使用mysqlsla会直接将我们的结果显示到终端,如果文件很多,超过我们的屏大小,我们可以使用
[shell]mysqlsla -lt slow --top 10 -sf "+select" --sort t_sum /var/log/slow.log| more[/shell]
来查看在屏幕上分屏查看,当然更好的办法是将文件显示的同时保存到一个本地文件,使用管道操作符结合tee也就是| tee -a filename
分析出的文件中含有一些参数,为方便查看日志,下面给出一些参数的含义:
[shell]queries total 总查询次数
unique //去除重复的查询后的sql数量
Sorted by //分析报告使用的排序方式:
t_sum // 按照执行总的时间
c_sum //按照查询次数排序
c_sum_p // sql语句执行次数占总执行次数的百分比
Count //sql的执行次数及占总的慢查询的百分比
Time // 执行时间 包括最大、最小、平均时间以及占总的慢查询时间的百分比
95% of Time //去除本类sql中执行时间最大和最小的sql,95%的sql执行的时间,包括最大、最小以及平均时间
Rows sent //返回的结果行数的统计,包括平均、最大和最小
Rows examined //扫描的总行数
Database //所属数据库
Users //访问数据库的用户名,执行的query占到总query的百分比以及占所有用户query数的百分比。
Query abstract //伪sql语句
Query sample //sql样例[/shell]
慢查询日志有时候会很大,我么可以通过这条命令查看文件夹及其下面的文件大小
[shell]ls -lhs[/shell]
查看一个具体文件大小使用
[shell]du -skm filename //参数-m表示以m为单位查看,默认以字节为单位[/shell]
单独查看一个文件大小使用
[shell]du -sh[/shell]
如果我们要查看一个文件的状态也就是stat,例如修改时间,sie,IOblock等我们可以使用:[shell]
stat filename[/shell]
我们会看到如下所示的一些信息:[shell]
File: `index.html'
Size: 75257 Blocks: 168 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 360057 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 48/ apache) Gid: ( 48/ apache)
Access: 2013-05-21 21:27:36.000000000 -0400
Modify: 2013-05-21 21:30:02.000000000 -0400
Change: 2013-05-21 21:30:02.000000000 -0400
[root@server webapp]# date
Tue May 21 21:30:28 EDT 2013
[root@server webapp]# date
Tue May 21 21:31:35 EDT 2013[/shell]
说明:Access访问时间。Modify修改时间。Change状态改变时间。可以stat *查看这个目录所有文件的状态。
当然你也可以这样查看文件的相关信息:[shell]
ls -l filename[/shell]
这里有个概念需要注意就是,在linux中没有文件的创建时间概念,只有文件的访问时间,修改时间和状态改变时间。
如果日志文件太大,使用VIM打开会显示Killed,导致打不打开,因此我们可以先ftp到本地,或者使用split切割文件或者使用tail查看某一段。如果我们ftp到本地了,俺么我们需要清空一下这个文件:
[shell]cat /dev/null > /path/abc.log[/shell]
如果你的WEB程序中有很多的日志文件,或者说你的某个日志会在增长的很快,那么就需要清除一下了,例如这个慢查询日志,如果你的WEB程序效率非常低,就会产生很大的日志文件,那么okay,我们可以使用shell脚本来处理定期清理。当这个日志文件超过我们预设的打小时我们就将这个文件打包然存放到系统的指定目录(本例我们将这个日志ftp远程到另外一台专门的文件存储服务器),然后清除这个日志文件。
[shell]#!/bin/bash
#compute size of file @KB
user="xiaotiejiang"
pass="123456"
dtime=$(date +%Y%m%d)
size=`du -s /var/run/mysqld/mysqld-slow.log | awk '{ print $1}'`
#start to clean log when bulk of size larger than 2G
if [ $size -gt 0 ]
then
cd /var/run/mysqld/
tar -zcP -f mysqld-slow.${dtime}.tar.gz /var/run/mysqld/mysqld-slow.log
cat /dev/null > /var/run/mysqld/mysqld-slow.log
ftp -n << END
open 114.234.155.92
user $user $pass
#二进制文件传输
binary
#关闭交互模式
prompt off
lcd /var/run/mysqld/
put mysqld-slow.${dtime}.tar.gz
#清除七天之前的文件
mdelete mysqld-slow.$(date -d -7day +%Y%m%d).tar.gz
bye
END
#结束ftp操作,进入本地操作
rm -rf mysqld-slow.${dtime}.tar.gz
fi[/shell]
然后我们就可以将则个shell文件放入linux的自动执行任务中了
[shell]vim /etc/crontab[/shell]
#每周6的3点执行一次文件
[shell]* 3 * * 6 root /usr/local/bin/cleansql.sh[/shell]
那另外我们也简单在说一下crontab的使用
[shell]* * * * * root /usr/local/bin/cleansql.sh[/shell]
这5个*分别表示分钟、小时、日期、月份、星期。
[shell]#表示每分钟检查一次
* * * * * root /usr/local/bin/cleansql.sh
#每隔两小时执行一次
* */2 * * * root /usr/local/bin/cleansql.sh
#每隔两月执行一次
* * */2 * * root /usr/local/bin/cleansql.sh > /dev/null 2>&1[/shell]
每次执行之后都会默认发一封邮件或者消息,使用/dev/null 2>&1会禁止发送。