MySQL相关文件——日志文件

日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有:

  • 错误日志(error log)

  • 二进制日志(binlog)

  • 慢查询日志(slow query log)

  • 查询日志(log)

1. 错误日志(error log)

错误日志记录了MySQL启动,运行,关闭的过程。当数据库出现问题的时候应该首先查看该文件来定位问题。注意:错误日志并不只会记录数据库所有的错误信息,也会记录一些警告信息和正确信息。

查看数据库错误日志的位置:show variables like 'log_error'\G
mysql> show variables like 'log_error'\G;
*************************** 1. row ***************************
Variable_name: log_error
        Value: /data/mysql/mysql_3306/logs/error.log
1 row in set (0.00 sec)

通过上面这个命令可以看到错误日志文件的路径和文件名,在默认情况下错误文件的文件名是服务器的主机名(我这里是指定的错误日志文件名)。当数据库无法正常启动时应首先查看错误日志,并且有些时候用户可以在错误日志种发现一些警告信息来解决一些问题而不需要特意的去查看数据库的状态。

[root@mysql8 ~]# tail -100  /data/mysql/mysql_3306/logs/error.log
2020-10-23T16:30:53.548657+08:00 0 [Warning] [MY-010140] [Server] Could not increase number of max_open_files to more than 5000 (request: 65535)
2020-10-23T16:30:53.875410+08:00 0 [Warning] [MY-000081] [Server] option 'wait_timeout': unsigned value 60000000 adjusted to 31536000.
2020-10-23T16:30:53.875516+08:00 0 [Note] [MY-010098] [Server] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2020-10-23T16:30:53.875558+08:00 0 [Note] [MY-010949] [Server] Basedir set to /opt/mysql-8.0.15-linux-glibc2.12-x86_64/.
2020-10-23T16:30:53.875567+08:00 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.15) starting as process 55136
2020-10-23T16:30:53.890610+08:00 0 [Warning] [MY-012364] [InnoDB] innodb_open_files should not be greater than the open_files_limit.

2020-10-23T16:30:53.890629+08:00 0 [Note] [MY-012366] [InnoDB] Using Linux native AIO
2020-10-23T16:30:53.890679+08:00 0 [Warning] [MY-013267] [InnoDB] The setting INNODB_UNDO_TABLESPACES is deprecated and is no longer used.  InnoDB always creates 2 undo tablespaces to start with. If you need more, please use CREATE UNDO TABLESPACE.
...

2.慢查询日志(slow log)

慢查询日志(slow log)可以用来定位存在问题的SQL,从而进行SQL层面的优化。可以在数据库中利用**long_query_time**(默认值为10 s)这个参数来设置一个SQL执行的阈值,执行时间超过这个阈值的SQL都会被记录到慢查询日志中,这样DBA就可以周期性检查是否有需要优化的SQL。

*默认情况下,慢查询日志是关闭的,需要用户手动将参数设定为ON*

####  2.1 开启慢日志

开启慢日志(需要通过修改参数文件进行开启),涉及参数**slow_query_log,slow_query_log_file,long_query_time**。
mysql> show variables like 'slow_query%'\G
*************************** 1. row ***************************
Variable_name: slow_query_log
        Value: ON
*************************** 2. row ***************************
Variable_name: slow_query_log_file
        Value: /data/mysql/mysql_3306/logs/slow.log
2 rows in set (0.00 sec)
查看SQL执行的超时时间设定:
mysql> show variables like 'long_query%'\G
*************************** 1. row ***************************
Variable_name: long_query_time
        Value: 0.100000
1 row in set (0.00 sec)
需要注意的是:1)关于long_query_time设定的阈值,MySQL中执行的SQL超过这个阈值会被记录下来,但是运行时间刚好等于这个阈值的并不会被记录下来,源码层面设定的应该是超过这个阈值的才会被记录,在MySQL5.1后这个参数支持微秒级别,来实现更精确的记录SQL的执行时间。

除此之外,还有一个与慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的SQL,没有用到索引,那么该SQL会被记到慢查询日志文件中。

查询方式如下:
mysql> show variables like 'log_queries_not_using_indexes'\G
*************************** 1. row ***************************
Variable_name: log_queries_not_using_indexes
        Value: ON
1 row in set (0.00 sec)
这个参数往往是开启的,但相应的这也带来了一个问题,生产环境中的SQL并不会执行一次,一但存在慢SQL被执行了多次且都没有使用索引那么这个SQL就会被多次记录到慢日志文件中。所以在MySQL5.6版本新增了一个参数**log_throttle_queries_not_using_indexes**,用来表示每分钟允许记录到slow log并且未使用索引的SQL语句的次数。这个参数的值默认为0意为不做限制。(是否针对某一SQL还是全部SQL?)
mysql> show variables like 'log_throttle_queries_not_using_indexes'\G
*************************** 1. row ***************************
Variable_name: log_throttle_queries_not_using_indexes
        Value: 60
1 row in set (0.00 sec)
#### 2.2 慢日志分析工具mysqldumpslow

MySQL提供了慢日志的分析工具避免因为慢日志的堆积导致分析过程难度增加,这个工具就是mysqldumpslow。通过这个工具可以更加直观的看到慢日志都有哪些信息。使用这个工具建议命令和管道符 | more一起使用避免刷屏。
[root@mysql8 logs]# mysqldumpslow slow.log 

Reading mysql slow query log from slow.log
Count: 2  Time=0.17s (0s)  Lock=0.00s (0s)  Rows=61440.0 (122880), root[root]@localhost
  select * from test

Count: 3  Time=0.10s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  update test set name='S' where name = 'S'

Count: 10  Time=0.09s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  insert into test select * from test

Count: 1  Time=0.07s (0s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@localhost
  select count(*) from test where name='S'

Count: 2  Time=0.01s (0s)  Lock=0.00s (0s)  Rows=24576.0 (49152), root[root]@[192.168.199.244]
  SELECT /*!N SQL_NO_CACHE */ * FROM `test`

Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=4.0 (4), root[root]@[192.168.1.254]
  SELECT QUERY_ID, SUM(DURATION) AS SUM_DURATION FROM INFORMATION_SCHEMA.PROFILING GROUP BY QUERY_ID

Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=22.0 (22), root[root]@[192.168.1.254]
  SELECT STATE AS `Status`, ROUND(SUM(DURATION),N) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/N.N*N,N), 'S') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=N GROUP BY SEQ, STATE ORDER BY SEQ
mysqldumpslow也提供了很多选项用来满足查看慢日志的多种需求。
[root@mysql8 logs]# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
 
Parse and summarize the MySQL slow query log. Options are
 
  --verbose    verbose(在详细模式下运行,打印有关该程序的更多信息)
  --debug      debug(在调试模式下运行)
  --help       write this text to standard output
 
  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default(排序方式)
                 al: average lock time(平均锁定时间)
                 ar: average rows sent(平均返回记录数)
                 at: average query time(平均查询时间)
                  c: count(访问计数)
                  l: lock time(锁定时间,等待锁时间)
                  r: rows sent(返回记录)
                  t: query time(查询时间,按累计总耗费时间排序)
   -r           reverse the sort order (largest last instead of first)(倒序信息排序)
   -t NUM       just show the top n queries(返回前面n条数据)
   -a           don't abstract all numbers to N and strings to 'S'(不把数字抽象为'N',不把字符串抽象为'S')
   -n NUM       abstract numbers with at least n digits within names
   -g PATTERN   grep: only consider stmts that include this string(正则匹配模式,大小写不敏感)
   -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
                default is '*', i.e. match all(根据服务器名称选择慢查询日志)
   -i NAME      name of server instance ( 根据服务器 MySQL 实例名称选择慢查询日志)
   -l           don't subtract lock time from total time

例如用户想得到返回记录集最多的3个SQL

[root@mysql8 logs]# mysqldumpslow -s  r -t 3  slow.log 
Reading mysql slow query log from slow.log
Count: 2  Time=0.17s (0s)  Lock=0.00s (0s)  Rows=61440.0 (122880), root[root]@localhost
  select * from test
Count: 2  Time=0.01s (0s)  Lock=0.00s (0s)  Rows=24576.0 (49152), root[root]@[192.168.199.244]
  SELECT /*!N SQL_NO_CACHE */ * FROM `test`
Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=22.0 (22), root[root]@[192.168.1.254]
  SELECT STATE AS `Status`, ROUND(SUM(DURATION),N) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/N.N*N,N), 'S') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=N GROUP BY SEQ, STATE ORDER BY SEQ

得到访问次数最多的3个SQL

[root@mysql8 logs]# mysqldumpslow -s c -t 3 slow.log 

Reading mysql slow query log from slow.log
Count: 10  Time=0.09s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  insert into test select * from test

Count: 3  Time=0.10s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  update test set name='S' where name = 'S'

Count: 2  Time=0.17s (0s)  Lock=0.00s (0s)  Rows=61440.0 (122880), root[root]@localhost
  select * from test

得到按照时间排序前3的SQL中带有『*』的SQL(注意使用转义符)

[root@mysql8 logs]# mysqldumpslow -s t -t 3 -g "/*" slow.log 

Reading mysql slow query log from slow.log
Count: 10  Time=0.09s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  insert into test select * from test

Count: 2  Time=0.17s (0s)  Lock=0.00s (0s)  Rows=61440.0 (122880), root[root]@localhost
  select * from test

Count: 3  Time=0.10s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  update test set name='S' where name = 'S'

2.3 慢查询表

从MySQL5.1开始可以将慢查询的日志记录放入到一张表中,这使得用户的查询更加方便直观。慢查询表在mysql架构下面,名为slow_log,表结构定义如下:

mysql> show create table slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumblob NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

与这个表有关的参数:log_output 这个参数指定了慢查询输出的格式,默认为file,可以将它设定为Table这样就可以查询mysql架构下的slow_log表了。例如:

mysql> show variables like 'log_output'\G
*************************** 1. row ***************************
Variable_name: log_output
        Value: FILE
1 row in set (0.00 sec)

mysql> set global log_output='TABLE';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'log_output'\G
*************************** 1. row ***************************
Variable_name: log_output
        Value: TABLE
1 row in set (0.00 sec)

2.4 Innodb引擎对于慢日志的优化

Innodb加强了对于SQL语句的捕获方式,在原来的基础上在slow log中加入了对于逻辑读取(logical reads)和物理读取(physical reads)的统计,这里的物理读取指的是从磁盘上读取数据,逻辑读取包含所有读取。用户可以根据额外的参数long_query_io将超过指定逻辑IO次数的SQL语句记录到slow log中,该值默认为100,即表示对于逻辑读取次数大于100的SQL语句记录到slow log中。为了兼容原MySQL数据库的运行方式,还添加了参数slow_query_type,用来表示启用slow log的方式,可选值为:

0 - 表示不将SQL记录到slow log中

1 - 表示根据运行时间将SQL记录到slow log

2 - 表示根据逻辑IO次数将SQL语句记录到slow log

3 - 表示根据运行时间及逻辑IO次数将SQL语句记录到slow log

3. 查询日志(general_log)

查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。默认的文件名为:主机名.log。查看当前数据库慢日志状态:
mysql> show variables like '%general_log%'\G;
*************************** 1. row ***************************
Variable_name: general_log
        Value: OFF
*************************** 2. row ***************************
Variable_name: general_log_file
        Value: /data/mysql/mysql_3306/data/mysql8.log
2 rows in set (0.00 sec)
开启查询日志的方法:可在线开启查询日志如下操作(必须设置为全局否则报错)
mysql> set global general_log = ON;
Query OK, 0 rows affected (0.02 sec)

查看当前查询日志:
[root@mysql8 data]# tail -15 mysql8.log 
Time                 Id Command    Argument
2020-10-26T17:20:38.507800+08:00           12 Query     show databases
2020-10-26T17:20:41.259076+08:00           12 Query     SELECT DATABASE()
2020-10-26T17:20:41.259952+08:00           12 Init DB   test
2020-10-26T17:20:41.261998+08:00           12 Query     show databases
2020-10-26T17:20:41.263864+08:00           12 Query     show tables
2020-10-26T17:20:41.266602+08:00           12 Field List        consistanttest 
2020-10-26T17:20:41.290474+08:00           12 Field List        drop_test 
2020-10-26T17:20:41.293087+08:00           12 Field List        student 
2020-10-26T17:20:41.295620+08:00           12 Field List        t1 
2020-10-26T17:20:41.297777+08:00           12 Field List        test 
2020-10-26T17:20:41.300101+08:00           12 Field List        test1 
2020-10-26T17:20:41.302437+08:00           12 Field List        test2 
2020-10-26T17:20:55.904350+08:00           12 Query     select * from test limit 3
2020-10-26T17:21:17.858208+08:00           12 Quit
同样这个查询日志的记录也放入了mysql架构下的general_log表中,该表的使用方法与上面slow_log的基本一致。关于开启general_log对于性能的影响比较大,生产环境通常不会开启。

4. 二进制日志(binary log)

二进制日志(binary log)记录了对MySQL进行的所有执行更改的操作,但是不包括select和show操作,因为这些操作对数据本身并没有进行修改。需要注意的是不一定非要数据发生变动才会被记录下来。

二进制日志主要有以下几种作用:

- **恢复(recovery)**:某些数据的恢复需要二进制日志,例如一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。

- **复制(replication)**:原理和恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库(slave或者standby)与一台MySQL数据库(master或者primary)进行实时同步——主从。

- **审计(audit)**:用户可以根据二进制日志中的信息来进行审计,判断对数据库是否有注入攻击。

其他关于二进制日志的内容链接:[https://www.wolai.com/dYLCNWhdHiFhB316PitoZq](https://www.wolai.com/dYLCNWhdHiFhB316PitoZq)

猜你喜欢

转载自blog.csdn.net/qq_43250333/article/details/109465692