关键词

浅谈MySQL中的六种日志

下面是详细的MySQL日志攻略:

一、MySQL日志的作用

MySQL的日志是用来记录一些重要的操作或事件的记录。这些日志可以帮助数据库管理员了解数据库发生了那些事件以及在数据库运行时进行故障恢复。

二、MySQL中的六种日志

MySQL中共有六种日志:错误日志、慢查询日志、二进制日志、重做日志、查询日志和状态日志。接下来我们会对这些日志依次进行解释。

1. 错误日志

错误日志是MySQL服务器启动后会自动创建的,这个日志会记录MySQL服务器所发生的任何错误事件。这些错误事件包括MySQL服务器的启动、关闭、崩溃以及一些重要的系统和安全事件。如果MySQL服务器没有启动成功,错误日志是定位问题的最好方法。在CentOS系统下,错误日志的默认存储目录是/var/log/mysql/error.log。

以下是一个错误日志的示例:

2020-11-23T05:59:10.710350Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2020-11-23T05:59:10.710382Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2020-11-23T05:59:10.710387Z 0 [ERROR] InnoDB: Unable to open ./ib_logfile0
2020-11-23T05:59:10.710389Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2020-11-23T05:59:10.710392Z 0 [ERROR] Plugin 'InnoDB' init function returned error.

2. 慢查询日志

慢查询日志是记录查询所耗费的时间超过了某个阈值(默认为10秒)的所有查询语句的日志。可以用慢查询日志来发现一些查询效率低下、响应慢的问题,从而进行性能优化。在CentOS系统下,慢查询日志的默认存储目录是/var/log/mysql/mysql-slow.log。

以下是一个慢查询日志的示例:

# Time: 2020-11-27T09:31:33.496578Z
# User@Host: root[root] @ localhost []  Id:     1
# Query_time: 1.149131  Lock_time: 0.000184 Rows_sent: 2  Rows_examined: 1128725
SET timestamp=1606463493;
SELECT COUNT(*) as count, DATE_FORMAT(access_time, '%Y-%m-%d %H:%i:00') as date_hour FROM logs WHERE access_time BETWEEN '2020-11-27 00:00:00' AND '2020-11-27 23:59:59' GROUP BY DATE_FORMAT(access_time, '%Y-%m-%d %H:%i:00');

3. 二进制日志

二进制日志是MySQL高可用的重要组成部分,主要用于实现基于两阶段提交的多主合一、一主多从的复制方案和实现MySQL恢复。它记录的是客户端的所有更新SQL语句,并将其存储在名为二进制日志文件的磁盘文件中。可以用MySQL的复制技术,从一个主服务器上复制二进制日志到其他MySQL数据库服务器上来同步数据。

以下是一个二进制日志的示例:

。。。省略前面的一些内容。。。

#210606  3:38:10 server id 1  end_log_pos 11946 CRC32 0x3dbdcfd5    Query   thread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1622924290/*!*/;
BEGIN
/*!*/;
# at 11946
#210606  3:38:10 server id 1  end_log_pos 12009 CRC32 0xab15f1e9    Query   thread_id=9 exec_time=0 error_code=0
SET @@SESSION.GTID_NEXT= '0ddce2ff-5f3d-11eb-bbbb-00155d01c817:1'/*!*/;
# at 12009
#210606  3:38:10 server id 1  end_log_pos 12026 CRC32 0x08b89ca9    Query   thread_id=9 exec_time=0 error_code=0
SET @@SESSION.GTID_NEXT_LIST= '0ddce2ff-5f3d-11eb-bbbb-00155d01c817:1'/*!*/;
# at 12026
#210606  3:38:10 server id 1  end_log_pos 12111 CRC32 0x2668fb72    Query   thread_id=9 exec_time=0 error_code=0
SET @@SESSION.GTID_NEXT= '0ddce2ff-5f3d-11eb-bbbb-00155d01c817:2'/*!*/;
。。。省略后面的一些内容。。。

4. 重做日志(Redo Log)

重做日志也是MySQL高可用的重要组成部分,记录的是所有对索引数据所做的更改,以便在MySQL服务器崩溃后可以重新执行这些更改(也就是重做)。重做日志与二进制日志不同,它的作用是在MySQL服务器挂掉或者崩溃后恢复数据,而不是在进行数据复制。

以下是一个重做日志的示例:

InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5242880 bytes
InnoDB: Database physically writes the file full: wait...
InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5242880 bytes
InnoDB: Database physically writes the file full: wait...
InnoDB: created 2 'ib_logfile' files.
InnoDB: 10.3.22 started; log sequence number 27755394; transaction id 249427
InnoDB: Logging buffer has been flushed ('''0%'''); log ''./ib_logfile0'' at position 0; transaction id 249427
InnoDB: Logging buffer has been flushed (''0%'''/%); log ''./ib_logfile0'' at position 4194304; transaction id 249427
InnoDB: is in the future! Current system log sequence number 27761315.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: for more information.

5. 查询日志

查询日志主要用于分析MySQL服务器的性能。它可以记录所有客户端对MySQL服务器的请求,记录的内容包括客户端发出请求的时间、请求的语句、响应时间、返回的行数等。在实际生产环境中,查询日志很少被启用,因为其会影响MySQL服务器的性能。

以下是一个查询日志的示例:

161027 22:10:32       2 Query       SET NAMES utf8
                  2 Init DB      test
161027 22:10:33       2 Query       SELECT COUNT(*) FROM bigtable WHERE priority > 10;
161027 22:10:40       2 Query       SELECT * FROM bigtable WHERE id = 1000000013;

6. 状态日志

状态日志是MySQL服务器用来记录服务器的当前状态的。它可以记录很多关于MySQL服务器运行时的信息,包括连接数、运行中的线程数、运行时使用的缓存等。有了状态日志,MySQL的管理员能够了解服务器的性能瓶颈,从而进行优化。

以下是一个状态日志的示例:

# Thread 139939971057408 has waited at btr0cur.cc line 496 for 104361.00 seconds the semaphore:
# Mutex at 0x7f4c12dbd350, Mutex CURSOR, lock var 2
# waiters flag 1
# wait_stack: 0x7f4c23c43258
# owner_thread: 0x7f4c2c5f7780, owner: 0x7f4c2c5f7780, own_event: 0x7f4c22d424d8
# holder_thread: 0x0, holder: 0x0, hold_event: 0x0
# this: 0x7f4c12dbf9d0, lock: 0x7f4c12dbe6d0, slots: 1024, waiters_len: 1, waiters: 0x7f4c0691c1c0

总结

以上就是MySQL中的六种日志,每个日志都有不同的作用,可以帮助管理员快速地定位问题,了解服务器的性能。在使用这些日志的时候,需要根据具体情况来选择不同的日志,并对日志进行细心的分析和处理。

本文链接:http://task.lmcjl.com/news/18112.html

展开阅读全文