mysql日志分析


作为一名开发人员,基本都会和 mysql 打打交道。(有人说我用sqlserver,好吧,你可以飘过了)

会用 日志 ,有利于我们找出自己开发代码里,不良的sql语句调用。

第一弹: mysql 日志 查看第一弹

1.首先确认你 日志 是否启用了
mysql>show variables like ‘log_bin’;
2.如果启用了,即ON
那日志文件就在mysql的安装目录的data目录下
3.怎样知道当前的日志
mysql> show master status;

4.看二进制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail

show variables like ‘log_bin’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| log_bin | ON |
+—————+——-+
1 row in set (0.00 sec)

mysql有以下几种日志:
错误日志: -log-err
查询日志: -log
慢查询日志: -log-slow-queries
更新日志: -log-update
二进制日志: -log-bin
在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。
例如:#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=#Enter a name for the query log file. Otherwise a default name will be used.
#log=#Enter a name for the error log file. Otherwise a default name will be used.
log-error=#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
上面只开启了错误日志,要开其他的日志就把前面的“#”去掉
查看命令:①show variables like ‘log_%’;查看所有的log命令
②show variables like ‘log_bin’;查看具体的log命令

mysql> show variables like ‘log_%’;
+———————————+—————-+
| Variable_name | Value |
+———————————+—————-+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
| log_error | /log/error.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
+———————————+—————-+
9 rows in set (0.00 sec)

mysql> show variables like ‘log_error’;
+—————+—————-+
| Variable_name | Value |
+—————+—————-+
| log_error | /log/error.log |
+—————+—————-+
1 row in set (0.01 sec)

第二弹:更方便的日志记录

将日志写在log文件里
my.cnf
在[mysqld] 中輸入 #log

log-bin=mysql-bin
log-error=/log/error.log
log=/log/mysql.log
long_query_time=2
log-slow-queries=/log/slowquery.log

long_query_time =2 –是指执行超过多久的sql会被log下来,这里是2
log-slow-queries= /log/slowquery.log –将查询返回较慢的语句进行记录
log-queries-not-using-indexes = nouseindex.log –就是字面意思,log下来没有使用索引的query
log=/log/mysql.log –对所有执行语句进行记录

140219 12:14:57 [ERROR] Could not use /log/mysql.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.

经过一番搜索,最后的结论是权限问题

用系统root用户,把log这个目录修改成777

chmod -777 /log/

重启动,就好了。(根本不需要在log目录下单独创建mysql.log这样的文件,系统会自动生成的)

查看下mysql.log

3 Query select @@version_comment limit 1
140219 12:30:06 3 Query show variables like ‘log_%
140219 12:30:35 3 Query show variables like ‘log_bin’
140219 12:30:40 3 Query show variables like ‘log_error’
140219 12:32:50 4 Connect root@localhost on
4 Query SET CHARACTER SET ‘utf8′
4 Query SET collation_connection = ‘utf8_general_ci’
4 Query SHOW PLUGINS
4 Init DB ad
4 Query SELECT * FROM `area`
LIMIT 030

所有的mysql底层执行,都会被执行。

这样太有利于我们优化自己的sql语句了。

没有找到如何让日志按天切割。

简单的处理办法是写个脚本,每天夜里12点执行
mv mysql.log a.log //移动日志
/opt/lampp/bin/mysqladmin -u admin -p flush-logs 刷新日志

不过基本上都是调试的时候,监测服务器可能有占mysql资源的语句的时候,才用。不需要天天记录,那样mysql速度会变慢。所以这个需求基本不需要了。

手工flush-logs 即可。这样比来回重启mysql要省事一点儿。