mysql日志详细解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql日志详细解析相关的知识,希望对你有一定的参考价值。
mysql日志:
主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;
日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
错误日志
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。
下面我们来定义mysql错误日志的功能:
一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。
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
|
mysql> SHOW GLOBAL VARIABLES LIKE ‘%log%‘ ; +-----------------------------------------+-----------------------------------+ | Variable_name | Value | +-----------------------------------------+-----------------------------------+ | back_log | 50 | | binlog_cache_size | 32768 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | MIXED | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF | | general_log_file | /mydata/data/stu18 .log | | innodb_flush_log_at_trx_commit | 1 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 8388608 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | | log | OFF | | log_bin | ON | | log_bin_trust_function_creators | OFF | | log_error | /mydata/data/stu18 .magedu.com.err |定义错误日志 | log_output | FILE | | log_queries_not_using_indexes | OFF | | log_slave_updates | OFF | | log_slow_queries | OFF | | log_warnings | 1 是否把警告信息写入错误日志中 | max_binlog_cache_size | 18446744073709547520 | | max_binlog_size | 1073741824 | | max_binlog_stmt_cache_size | 18446744073709547520 | | max_relay_log_size | 0 | | relay_log | | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | slow_query_log | OFF | | slow_query_log_file | /mydata/data/stu18-slow .log | | sql_log_bin | ON | | sql_log_off | OFF | | sync_binlog | 0 | | sync_relay_log | 0 | | sync_relay_log_info | 0 | +-----------------------------------------+-----------------------------------+ |
其中,log_error可以直接定义为文件路径,也可以为ON|OFF;log_warings只能使用1|0来定义开关启动。
更改错误日志位置可以使用log_error来设置形式如下:
1
2
3
|
解析:其中,DIR参数指定错误日志的路径filename参数是错误日志的名称,没有指定该参数时默认为主机名。重启mysql服务器即可生效。
查看mysql错误日志:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[[email protected] data] # tail -20 stu18.magedu.com.err 130813 15:30:50 InnoDB: Starting shutdown ... 130813 15:30:51 InnoDB: Shutdown completed; log sequence number 1630920 130813 15:30:51 [Note] /usr/local/mysql/bin/mysqld : Shutdown complete 130813 15:30:52 mysqld_safe mysqld from pid file /mydata/data/stu18 .magedu.com.pid ended 130813 15:30:53 mysqld_safe Starting mysqld daemon with databases from /mydata/data 130813 15:30:54 InnoDB: The InnoDB memory heap is disabled #禁用了InnoDB memory的堆功能。 130813 15:30:54 InnoDB: Mutexes and rw_locks use GCC atomic builtins #Mutexes(互斥量)和rw_locks(行级锁)是GCC编译的是InnoDB内置的。 130813 15:30:54 InnoDB: Compressed tables use zlib 1.2.3 #默认压缩工具是zlib 130813 15:30:55 InnoDB: Initializing buffer pool, size = 128.0M #InnoDB引擎的缓冲池(buffer pool)的值大小 130813 15:30:55 InnoDB: Completed initialization of buffer pool 130813 15:30:55 InnoDB: highest supported file format is Barracuda. 130813 15:30:57 InnoDB: Waiting for the background threads to start 130813 15:30:58 InnoDB: 5.5.33 started; log sequence number 1630920 130813 15:30:58 [Note] Server hostname (bind-address): ‘0.0.0.0‘ ; port: 3306 130813 15:30:58 [Note] - ‘0.0.0.0‘ resolves to ‘0.0.0.0‘ ; #0.0.0.0会反解主机名,这里反解失败 130813 15:30:58 [Note] Server socket created on IP: ‘0.0.0.0‘ . 130813 15:30:58 [Note] Event Scheduler: Loaded 0 events #事件调度器没有任何事件,因为没有装载。 130813 15:30:58 [Note] /usr/local/mysql/bin/mysqld : ready for connections. #mysql启动完成等待客户端的请求。 Version: ‘5.5.33-log‘ socket: ‘/tmp/mysql.sock‘ port: 3306 Source distribution #创建一个本地sock用于本地连接。 |
删除错误日志:
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –pflush-logs也可以使用登录mysql数据库中使用FLUSHLOGS语句来开启新的错误日志。
在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的:方式如下:
1
2
3
4
|
[[email protected] data] # mv stu18.magedu.com.err stu18.magedu.com.err.old [[email protected] data] # ls hellodb myclass mysql-bin.000003 mysql-bin.index stu18.magedu.com.pid ibdata1 mysql mysql-bin.000004 performance_schema ib_logfile0 mysql-bin.000001 stu18.magedu.com.err test ib_logfile1 mysql-bin.000002 stu18.magedu.com.err.old |
更多信息请查阅官方文档:http://dev.mysql.com/doc/refman/5.5/en/error-log.html
查询日志:
默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。
查看查询日志是否开启:
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
|
mysql> SHOW GLOBAL VARIABLES LIKE ‘%log%‘ ; +-----------------------------------------+-----------------------------------+ | Variable_name | Value | +-----------------------------------------+-----------------------------------+ | back_log | 50 | | binlog_cache_size | 32768 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | MIXED | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF #定义查询日志是否开启 | | general_log_file | /mydata/data/stu18 .log #定义查询日志的文件地址名称 | | innodb_flush_log_at_trx_commit | 1 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 8388608 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | | log | OFF #是否开启日志 (若开启则表示开启所有的日志功能) | | log_bin | ON | | log_bin_trust_function_creators | OFF | | log_error | /mydata/data/stu18 .magedu.com.err | | log_output | FILE #日志的输出的位置 | | log_queries_not_using_indexes | OFF | | log_slave_updates | OFF | | log_slow_queries | OFF | | log_warnings | 1 | | max_binlog_cache_size | 18446744073709547520 | | max_binlog_size | 1073741824 | | max_binlog_stmt_cache_size | 18446744073709547520 | | max_relay_log_size | 0 | | relay_log | | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | slow_query_log | OFF | | slow_query_log_file | /mydata/data/stu18-slow .log | | sql_log_bin | ON | | sql_log_off | OFF | | sync_binlog | 0 | | sync_relay_log | 0 | | sync_relay_log_info | 0 | +-----------------------------------------+-----------------------------------+ 41 rows in set (0.00 sec) |
拓展解析:日志的输出位置一般有三种方式:file(文件),table(表),none(不保存);其中前两个输出位置可以同时定义,none表示是开启日志功能但是记录日志信息。file就是通过general_log_file |/mydata/data/stu18.log 等方式定义的,而输出位置定义为表时查看日志的内容方式为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
mysql> use mysql; #在此数据库中 Database changed mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | #这个就是查询日志的表输出位置 | help_category | | help_keyword | | help_relation | | help_topic ……………… | +---------------------------+ |
慢查询日志:
慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
查看慢查询日志的定义:
1
2
3
|
mysql> SHOW GLOBAL VARIABLES LIKE ‘%log%‘ ; | slow_query_log | OFF #定义慢查询日志的 | slow_query_log_file | /mydata/data/stu18-slow .log #输出方式为file(文件)时定义慢查询日志的位置 |
启动和设置慢查询日志:
1、通过配置文件my.cnf中的log-slow-queries选项可以开启慢查询日志;形式如下:
1
2
3
4
|
[[email protected] data] # vim /etc/my.cnf [mysqld] slow_query_log=1 log-slow-queries [= DIR/[filename] ] |
其中,DIR参数指定慢查询日志的存储路径;filename参数指定日志的文件名,生成日志文件的完成名称为filename-slow.log。如果不指定存储路径,慢查询日志默认存储到mysql数据库的数据文件下,如果不指定文件名,默认文件名为hostname-slow.log。
2、通过登录mysql服务器直接定义,方式如下:
首先要有全局权限;然后执行mysql>set global slow_query_log=1;
时间默认超过多少的称为慢查询日志?
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:
1
2
3
4
5
6
7
|
mysql> SHOW GLOBAL VARIABLES LIKE ‘long%‘ ; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.04 sec) |
注释:其中这个慢查询时间并不是只表示语句自身执行超过10秒还包含由于其他资源被征用造成阻塞的查询执行时间或其他原因等都被记录到慢查询中。所以这个慢查的时长表示从查询开始到查询结束中间包含可能的任何原因所经历的所有时间。
测试是否可以记录日志:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
以上是关于mysql日志详细解析的主要内容,如果未能解决你的问题,请参考以下文章
mysql之 binlog维护详细解析(开启binlog相关参数作用mysqlbinlog解读binlog删除) 创建数据库中,超详细常用的MySQL命令(含解析图解与全部代码) |