db / 未分类 · 2013年6月24日

mysql 日志

今天下班后,正好借解决主站mysql 很占用CPU这个问题,顺便把mysql日志作一下笔记 ,当然叫他们加索引这个是解决方法,这个暂时按下不提
在mysql中 一般有以下4种日志 — 错误日志,二进制日志,查询日志,慢查询日志
1.错误日志 p359
主要记录启动关闭的一些信息,还有数据库在运行期间的重大错误和当服务器发现一个表需要被检查或修复的时候的信息。
缺省生成的错误日志文件名为host_name.err ,默认目录是数据目录,我们可以通过启动选项 –log-error=filename 指定错误日志的位置
如data是数据库的数据目录:
[[email protected] ~]# 130624 17:36:11 mysqld_safe Logging to ‘/data/database/mysql//evan886.com.err’.
130624 17:36:11 mysqld_safe Starting mysqld daemon with databases from /data/database/mysql/
mysql> show variables like '%error%'; #查看日志文件的位置:
+——————–+———————+
| Variable_name | Value |
+——————–+———————+
| log_error | /var/log/mysqld.log
##这个是写在配置文件里
[mysqld_safe]
log-error=/var/log/mysqld.log

[[email protected] ~]# tail -f /data/database/mysql/evan886.com.err
130624 17:36:02 mysqld_safe mysqld from pid file /data/database/mysql//evan886.com.pid ended
130624 17:36:11 mysqld_safe Starting mysqld daemon with databases from /data/database/mysql/
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
130624 17:36:11 InnoDB: highest supported file format is Barracuda.
130624 17:36:12 InnoDB Plugin 1.0.6-unknown started; log sequence number 780360
2.二进制日志
mysql> show variables like '%log_bin%'; #查看
+———————————+——-+
| Variable_name | Value |
+———————————+——-+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
| sql_log_bin | ON |
+———————————+——-+
[[email protected] bin]# ./mysqld_safe –log-bin=/tmp/binlog
mysql>CREATE TABLE t1(id int not null, name char(20) );
mysql> insert into t1 values(1,’evan’);
Query OK, 1 row affected (0.00 sec)
[[email protected] local]# mysqlbinlog /tmp/binlog.000001
****
CREATE TABLE t1(
id int not null,
name char(20)
)
/*!*/;
##永久生效
[[email protected] bin]# cat /etc/my.cnf
[mysqld]
*****
log-bin=/tmp/evanbilog

[[email protected] local]# /etc/init.d/mysqld start
正在启动 mysqld:
[[email protected] bin]# mysqlbinlog /tmp/evanbilog.000001
CREATE TABLE ttt( id int not null, name char(20) )
/*!*/;
# at 225
#130624 18:06:35 server id 1 end_log_pos 321 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1372068395/*!*/;
insert into ttt values(1,’evan’)
/*!*/;
DELIMITER ;
bin log 删除
1) 方法1 reset master
mysql> system ls -ltr /tmp/*log*
-rw-rw—-. 1 mysql mysql 22 6月 24 18:05 /tmp/evanbilog.index
-rw-rw—-. 1 mysql mysql 321 6月 24 18:06 /tmp/evanbilog.000001
mysql> reset master;
Query OK, 0 rows affected (0.10 sec)
mysql> system ls -ltr /tmp/*log*
-rw-rw—-. 1 mysql mysql 22 6月 24 19:39 /tmp/evanbilog.index
-rw-rw—-. 1 mysql mysql 106 6月 24 19:39 /tmp/evanbilog.000001
2) 方法2 purge master logs to 'evanbilog.000002'; # 编号 000002之前的所有日志都删除
3) 方法3 purge master logs before 'yyyy-mm-dd hh24:mi:ss'
purge master logs before ‘2012-6-22 13:07:00’ ;# 2012-6-22 13:07:00之前的所有日志都删除
4) 方法4 expire_logs_day=3 # 设置过期天数,三天前的全部自己删除
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
***
log-bin=/tmp/evanbilog
expire_logs_day=3

设置完后重启 mysqld
##人为的改变时间
[[email protected] ~]# date -s ‘20141212 12:00:00’
2014年 12月 12日 星期五 12:00:00 CST
[[email protected] ~]# mysqladmin flush-log
3.查询日志 p365
[[email protected] bin]# ./mysqld_safe –log=/tmp/mysqllog
mysql> show variables like '%log';
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| back_log | 50 |
| general_log | ON |
| innodb_locks_unsafe_for_binlog | OFF |
| log | ON |
| relay_log | |
| slow_query_log | OFF |
| sync_binlog | 0 |
+——————————–+——-+
7 rows in set (0.00 sec)
#改配置文件和重启mysqld 这个方法好像有时不行呢
[mysqld_safe]
log=/var/log/mysqld.log

4.慢查询日志 p366
mysql> show variables like 'long%';
+—————–+———–+
| Variable_name | Value |
+—————–+———–+
| long_query_time | 10.000000 |
+—————–+———–+
1 row in set (0.00 sec)
#改成2秒
mysql> set long_query_time=2;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'long%';
+—————–+———-+
| Variable_name | Value |
+—————–+———-+
| long_query_time | 2.000000 |
+—————–+———-+
1 row in set (0.00 sec)
#写入配置文件
[mysqld]
***
long_query_time = 1
#long_query_time =0.001 #如果要测试可以这么设置
slow_query_log=1
slow_query_log_file = /var/log/mysql/slow.log

#这个mysql5.1试过不行哦
log-slow-queries= /usr/var/slowquery.log
mysqldumpslow -s c -t 20 /var/log/mysql/slow.log
mysqldumpslow -s r -t 20 /var/log/mysql/slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow –help,主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
-s,是order的顺序,说明写的不够详细,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
mysql> show variables like 'slow_query%';
+———————+————————-+
| Variable_name | Value |
+———————+————————-+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow.log |
+———————+————————-+
mysql 慢查询测试
http://www.linuxchina.net/?p=1574
[[email protected] ~]# 130624 17:36:11 mysqld_safe Logging to ‘/data/database/mysql//evan886.com.err’.
130624 17:36:11 mysqld_safe Starting mysqld daemon with databases from /data/database/mysql/
一般来说都有两个方法 要mysql 设置 mysql> set long_query_time=2; 或者写在my.cnf 以永久生效
查找数据目录的位置:
mysql> show variables like '%datadir%';
+—————+—————–+
| Variable_name | Value |
+—————+—————–+
| datadir | /var/lib/mysql/ |
+—————+—————–+
1 row in set (0.00 sec)
set GLOBAL max_connections=1000;
参考资料
<<深入浅出mysql ***>>
GOOD mysql的日志文件、数据文件
http://linuxess.blog.163.com/blog/static/1967042702012293291584/
mysql慢查询导致db卡
http://www.linuxchina.net/?p=1114
用MySQL Slow Log解决MySQL CPU占用高的问题
http://www.itlearner.com/article/4997
如何对MySQL数据库日志文件进行维护
http://database.51cto.com/art/201007/214149.htm
MYSQL启用日志,和查看日志
http://hone033.iteye.com/blog/451100
MySQL 建表语法
http://www.blogjava.net/coderdream/archive/2007/08/17/137642.html