MySql-⽇志详解
错误⽇志
MySQL的错误信息是在data⽬录下的
错误⽇志本⾝所定义的内容本⾝是可以定义的
编辑配置⽂件,定义错误⽇志:
默认情况下错误⽇志也记录以下⼏个⽅⾯的消息:
1、服务器启动和关闭过程中的信息
未必是错误信息,⽐如mysql是如何去初始化存储引擎的过程记录在错误⽇志⾥等等
2、服务器运⾏过程中的错误信息
⽐如sock⽂件不到,⽆法加载mysql数据库的数据⽂件,如果忘记初始化mysql或data dir路径不到,或权限不正确等,都会记录在此
3、事件调度器运⾏⼀个事件时产⽣的信息
⼀旦mysql调度启动⼀个计划任务的时候,它也会将相关信息记录在错误⽇志中
4、在从服务器上启动从服务器进程时产⽣的信息
在复制环境下,从服务器进程的信息也会被记录进错误⽇
⼀般情况下错误⽇志不会特别⼤,可以放⼼安全的开启,对于诊断服务器故障或问题也是⾮常有帮助的
如何定义mysql服务器错误⽇志相关功能:
eg,log-error =/path/to /xx.err  #定义是否启动错误⽇志的功能log-warnings={1|0}              #定义是否将警告信息也记录在错误⽇志中
1
2mysql> show global variables like '%log%';| log_error                              |/mydata/        || log_warnings                            | 1                                |
1
2
3log_error={1 | 0 | /PATH/TO/ERROR_LOG_FILENAME}log_warnings = {1|0}1
2[root@localhostdata]# tail - 140331 14:32:02[Note] /usr/local /mysql/bin/mysqld: Shutdown complete 140331 14:32:02mysqld_safe mysqld from  pid file /mydata/data/localhost.pid ended 140331 14:32:02mysqld_safe Starting mysqld daemon with  databases from  /mydata/data 140331 14:32:03[Note] Plugin 'FEDERATED' is  disabled.                              #初始化存储引擎140331 14:32:03InnoDB: The InnoDB memory heap is  disabled                          #innodb 禁⽤了堆功能140331 14:32:03InnoDB: Mutexes and  rw_locks use GCC atomic builtins                #互斥量和⾏级锁是GCC 编制的140331 14:32:03InnoDB: Compressed tables use zlib 1.2.3140331 14:32:03InnoDB: Using Linux native AIO 140331 14:32:03InnoDB: Initializing buffer pool, size = 128.0M                    #innodb 存储引擎的缓冲池(buff poll )⼀般需要改的,⽽且需要改的特别⼤,⼀般因此可以观察此⽂件来观察缓冲池到底占⽤多少内存140331 14:32:03InnoDB: Completed initialization of  buffer pool 140331 14:32:03InnoDB: highest supported file format is  Barracuda.140331 14:32:03  InnoDB: Waiting for  the  background threads tostart 140331 14:32:04InnoDB: 5.5.33 started; log sequence number 2856278140331 14:32:04[Note] Server hostname (bind-address): '0.0.0.0'; port: 3306        #服务已经运⾏并监听在本地0.0.0.0的 3306端⼝140331 14:32:04[Note]  - '0.0.0.0' resolves to '0.0.0.0';
                        #0.0.0.0反解失败140331 14:32:04[Note] Server socket created on  IP: '0.0.0.0'.140331 14:32:04[Note] Event Scheduler: Loaded 0 events                            #时间调度器没有进⾏任何调度140331 14:32:04[Note] /usr/local /mysql/bin/mysqld: ready for  connections.Version:'5.5.33-log'  socket:'/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)  #mysql 已经启动并在/tmp/⽬录下⽣成mysql.sock ⽂件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
查询⽇志
查询⽇志⼀般情况下mysql是没有启⽤的,因为mysql本⾝为关系型数据库,⽤户连接进数据库的时候,⽤户的⼀切⾏为 增删查改 都会⽣成查询⽇志
insert查询为了避免数据冲突,如果此前插⼊过数据,⽽如果跟主键或唯⼀键的数据重复那肯定会报错
update时也会查询因为更新的时候很可能会更新某⼀块数据
delete查询,只删除符合条件的数据
因此都会产⽣⽇志,在并发操作⾮常多的场景下,查询信息会⾮常多,那么如果都记录下来会导致IO⾮常⼤ 影响mysql性能,因此如果不是在调试环境下,是不建议开启查询⽇志功能的
设置 编辑 myf,修改 general-log 参数为 1,同时设定 log-output 参数(⽇志输出类型)和 general_log_file 参数(查询⽇志路径):
慢查询⽇志
慢查询⽇志中记录了市场,明确说明了哪个时间段执⾏和结束,中间执⾏了多长时间
对于⾮常繁忙的服务器,如果中途出现了查询速度⾮常慢的场景中,通常需要启动慢查询⽇志功能,慢查询⽇志对性能的影响微乎其微,但是可以详细记录了服务器上的慢查询,因此可以去定位服务器的瓶颈
设置 编辑 myf ,设置 log_slow_queries 参数为 1,同时设定 log-output 参数(⽇志输出类型)、slow-query-log_file 参数(慢查询⽇志路径)和 long_query_time 参数:
eg,log-output=FILE general-log=1general_log_file="filename.log"
1
2
3log-output=FILE log_slow_queries=1    //MySQL 5.6将此参数修改为了slow_query_log slow_query_log_file="filename.log"long_query_time=10    //慢查的时长单位为秒,可以精确到⼩数点后6位(微秒)
1
2
3
4
如果服务器⾮常繁忙,经常会产⽣慢查询的话,那么⽇志量会⾮常⼤,那么需要⼿⼯去设置⽇志滚动功能
关闭慢查询⽇志开启慢查询mysql> setglobal slow_query_log=1;Query OK, 0 rowsaffected (0.17 sec)mysql> showglobal variables like '%slow_qu%';+---------------------+---------------------------------+|Variable_name      | Value                          |+---------------------+---------------------------------+|log_slow_queries    | ON                              ||slow_query_log      | ON                              ||slow_query_log_file | /mydata/data/localhost-slow.log |+---------------------+---------------------------------+
3 rows in set  (0.00sec)设置慢查询时间mysql> setglobal long_query_time=0.000001;Query OK, 0 rowsaffected (0.00 sec)新建会话,并进⾏简单操作[root@localhost ~]#mysql mysql> showdatabases;mysql> usetest1;mysql> showtables;由于调整的时间间隔极⼩,所以mysql 认为每个操作都是慢查询,都⼀⼀记录了我们的操作过程,如下所⽰:[root@localhost data]#tail -F localhost-slow.log # Time: 14033115:50:21# User@Host:root[root] @ localhost []# Query_time:0.000093  Lock_time: 0.000000 Rows_sent:1  Rows_examined: 0SETtimestamp=1396252221;select@@version_comment limit 1;# Time: 14033115:50:28# User@Host:root[root] @ localhost []# Query_time:0.030523  Lock_time: 0.029807 Rows_sent:10  Rows_examined: 10SETtimestamp=1396252228;show databases;# Time: 14033115:50:59# User@Host:root[root] @ localhost []# Query_time:0.000084  Lock_time: 0.000000 Rows_sent:1  Rows_examined: 0SETtimestamp=1396252259;SELECT DATABASE();# User@Host:root[root] @ localhost []# Query_time:0.000029  Lock_time: 0.000000 Rows_sent:1  Rows_examined: 0use test1;SETtimestamp=1396252259;# administrator command:Init DB;# Time: 14033115:51:22# User@Host:root[root] @ localhost []# Query_time:0.000290  Lock_time: 0.000087 Rows_sent:1  Rows_examined: 1SETtimestamp=1396252282;show tables;我们在数据库进⾏了4次操作,都⼀⼀被记录到⽇志⾥[root@localhostdata]# grep 'Time' localhost-slow.log  |wc -l        4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54log-output=NONE log_slow_queries=0  //MySQL 5.6将此参数修改为了slow_query_log slow_query_log_file="filename.log"long_query_time=10
1
2
3
4
⼆进制⽇志 (binlog)
⼆进制⽇志记录 MySQL 数据库中所有与更新相关的操作,即⼆进制⽇志记录了所有的 DDL(数据定义语⾔)语句和 DML(数据操纵语⾔)语句,但是不包括数据查询语句。常⽤于恢复数据库和主从复制。
查看 log_bin 状态
启⽤⼆进制⽇志功能
设定⼆进制⽇志⽂件上限,单位为字节,最⼩值为4K,最⼤值为1G,默认为1G。某事务所产⽣的⽇志信息只能写⼊⼀个⼆进制⽇志⽂件,因此,实际上的⼆进制⽇志⽂件可能⼤于这个指定的上限。作⽤范围为全局级别,可⽤于配置⽂件,属动态变量。
查看所有的⼆进制⽂件
查看当前正在使⽤的⼆进制⽂件
⼆进制⽇志滚动 当 MySQL 服务进程启动、当前⼆进制⽇志⽂件的⼤⼩已经超过上限时、执⾏ FLUSH LOG 时,MySQL 会创建⼀个新的⼆进制⽇志⽂件。新的编号⼤1的⽇志⽤于记录最新的⽇志,⽽原⽇志名字不会被改变。
⼿动滚动命令:flush logs;
定义⼆进制格式⽇志 binlog_format= Mixed|Statement|Row
⼆进制⽇志的有效天数 expire_logs_days = 5
实时将缓存中数据同步到硬盘中 sync_binlog sync_binlog 的默认值是0,像操作系统刷其他⽂件的机制⼀样,MySQL不会同步到磁盘中去⽽是依赖操作系统来刷新binary log。 当sync_binlog =N (N>0) ,MySQL 在每写 N次 ⼆进制⽇志binary log时,会使⽤fdatasync()函数将它的写⼆进制⽇志binary log同步到磁盘中去。
(如果启⽤了autocommit,那么每⼀个语句statement就会有⼀次写操作;否则每个事务对应⼀个写操作)mysql> SHOW VARIABLES LIKE 'log_bin%';+---------------------------------+-------+| Variable_name                  | Value |+---------------------------------+-------+| log_bin                        | OFF  || log_bin_basename                |      || log_bin_index                  |      || log_bin_trust_function_creators | OFF  || log_bin_use_v1_row_events      | OFF  |+---------------------------------+-------+
1
2
3
4
56
7
mysql下载哪个盘8
910log -bin="filename-bin"
1max_binlog_size={4096 .. 1073741824} ;1mysql> show binary logs;+------------------+-----------+| Log_name        | File_size |+------------------+-----------+| mysql-bin.000001 |    276665 |+------------------+-----------+1 row in set (0.03 sec)
1
2
3
4
5
67mysql> show master status;+------------------+----------+--------------+------------------+| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000003 |      107 |              |                  |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)
1
2
3
4
5
6
7
在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最⼤的。因为⼀旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。⽽当设置为“1”的时候,是最安全但是性能损耗最⼤的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的⼀个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于⾼并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写⼊性能差距可能⾼达5倍甚⾄更多。
清除⼆进制⽇志 清除所有⽇志(不存在主从复制关系)
清除指定⽇志之前的所有⽇志
清除某⼀时间点前的所有⽇志
清除 n 天前的所有⽇志
由于⼆进制⽇志的重要性,请仅在确定不再需要将要被删除的⼆进制⽂件,或者在已经对⼆进制⽇志⽂件进⾏归档备份,或者已经进⾏数据库备份的情况下,才进⾏删除操作,且不要使⽤ rm 命令删除。
清除⼆进制⽇志的最佳实践 清除之前必须将⽇志⽂件备份,备份完毕后再次确认,如果确实可以删除则使⽤以上命令进⾏删除 假设binglog 备份⽂件已经备份到⽇志服务器中,当前本地的数据库⽇志已经确保⽆误可以删除
查看⽇志详细 1. SHOW BINLOG EVENTS [IN ‘log_name’] [FROM pos] [LIMIT [offset,]row_count]mysql> RESET MASTER;
1mysql> PURGE MASTER LOGS TO  'mysql-bin.000003';1mysql> PURGE MASTER LOGS BEFORE '2015-01-01 00:00:00';
1mysql> PURGE MASTER LOGS BEFORE CURRENT_DATE - INTERVAL 10 DAY ;
1备份[root@localhostdata]# cp mysql-bin.0000* /tmp/备份数据库mysqldump-u root -p '123456' -A  > /tmp/bak .sql 接下来就可以清除⽆⽤的⽇志了[root@localhost data]# tail -5 mysql-bin.index ./mysql-bin.000056./mysql-bin.000057./mysql-bin.000058./mysql-bin.000059./mysql-bin.000060删除000056
之前的⼆进制⽂件mysql>purge binary logs to 'mysql-bin.000056';QueryOK , 0 rows affected (0.01 sec)[root@localhostdata]# cat  mysql-bin.index ./mysql-bin.000056./mysql-bin.000057./mysql-bin.000058./mysql-bin.000059./mysql-bin.000060删除某⼀事件之前的信息
mysql>show binlog events in  'mysql-bin.000060' limit 10;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。