MySQL日志是记录MySQL服务器活动的文件。通过分析这些日志文件,可以了解MySQL服务器的运行情况,诊断故障,优化数据库性能等。MySQL提供了多种类型的日志文件,下面是一些常见的日志类型:

18、MySQL日志管理(上)_错误日志

1、错误日志(Error log):记录MySQL服务器启动和运行过程中出现的错误信息,例如无法打开文件,内存不足等等。错误日志一般存储在MySQL安装目录下的data目录下。

2、二进制日志(Binary log):记录所有对MySQL数据库进行修改的操作,例如增加、修改、删除表和数据等。二进制日志是MySQL数据库复制和恢复的关键。

3、慢查询日志(Slow query log):记录执行时间超过指定时间的SQL查询语句,可以帮助开发人员分析和优化查询语句。慢查询日志可以通过设置参数slow_query_log来开启或关闭,日志文件一般存储在MySQL安装目录下的data目录下。

4、查询日志(Query log):记录MySQL服务器执行的所有SQL查询语句,包括慢查询日志中的查询语句,查询日志可以通过设置参数general_log来开启或关闭,日志文件一般存储在MySQL安装目录下的data目录下。

5、事务日志(Transaction log):记录所有的事务操作,包括事务的开始、提交、回滚等。事务日志主要用于数据库的恢复和数据一致性保证。

6、通用日志是MySQL中的一个默认日志,用于记录服务器的重要事件,例如启动、关闭、连接和断开连接。通用日志可以包含许多不同的事件,如错误消息和警告

7、中继日志(Relay Log)是MySQL主从复制中从服务器上的一种日志,用于记录从主服务器接收到的二进制日志的内容,然后将其应用于从服务器上的本地副本,以保证从服务器的数据与主服务器的数据同步。

对于日志文件的管理,可以根据实际需求进行配置,一般包括以下几个方面:

日志开启和关闭:根据需要开启或关闭不同类型的日志,可以通过在MySQL配置文件my.cnf中设置参数来控制日志的开启和关闭。

日志存储和备份:将日志文件存储在独立的磁盘分区中,定期备份和压缩日志文件,以免日志文件过大导致磁盘空间不足。

日志分析和维护:定期分析和维护日志文件,查找可能存在的问题和异常情况,并进行优化和修复。

日志安全性:保护日志文件的安全性,限制对日志文件的访问权限,防止日志文件被恶意篡改或删除。

事务日志

MySQL(或MariaDB)的事务日志(Transaction Log),是一个二进制文件,记录了所有对数据库表进行的修改操作。事务日志是MySQL恢复机制的重要组成部分,可以帮助MySQL执行崩溃恢复、数据复制和数据恢复等操作。

事务日志有两种类型:

重做日志(Redo Log)

重做日志是用于防止意外关机和其他类似问题的崩溃恢复机制。它记录了所有修改操作,并且是写入磁盘的顺序写入文件中的二进制文件。

回滚日志(Undo Log)

回滚日志用于撤销事务的操作。如果某个事务在执行期间发生错误或中断(如死锁),系统将使用回滚日志将数据回滚到事务执行之前的状态。

由于MySQL使用预写日志(Write Ahead Log,WAL)机制,故所有修改操作都将先写入预写日志,然后再提交到对应的数据文件中。与日志文件不同,数据文件对磁盘的IO压力较大,数据文件较大且难以管理,故使用事务日志能够更好地管理数据库的可靠性和安全性

事务日志的相关配置

innodb_log_file_size 50331648 每个日志文件大小
innodb_log_files_in_group 2 日志组成员个数
innodb_log_group_home_dir ./ 事务文件路径
innodb_flush_log_at_trx_commit 默认为1

18、MySQL日志管理(上)_错误日志_02

18、MySQL日志管理(上)_事务日志_03

18、MySQL日志管理(上)_log_error_04

事务日志性能优化参数innodb_flush_log_at_trx_commit

18、MySQL日志管理(上)_log_error_05

18、MySQL日志管理(上)_错误日志_06

18、MySQL日志管理(上)_错误日志_07

当innodb_flush_log_at_trx_commit取不同值时的特点可以用下面的表格来清晰地展示:

18、MySQL日志管理(上)_log_error_08

当innodb_flush_log_at_trx_commit取0时,InnoDB的日志缓冲区并不会立刻被写入到磁盘,而是在日志缓冲区被占满时,才会将缓冲区中的日志写入到磁盘。这种方式具有很高的性能,但安全性较低,如果MySQL进程在写入数据时崩溃,那么未被写入磁盘的日志数据会丢失。

当innodb_flush_log_at_trx_commit取1时,InnoDB的日志缓冲区会被较为频繁地写入到磁盘,相比上一种方式安全性大大提高,但性能也有所降低。

当innodb_flush_log_at_trx_commit取2时,InnoDB的日志缓冲区会被缓存入操作系统的高速缓存IO缓冲区中,然后会使用异步方式刷新到磁盘中去,并不会每次事务提交都写入磁盘,所以性能较为稳定,安全性也较高。但是如果发生系统崩溃,可能会导致一部分事务的日志记录丢失,需要使用Redo Log来进行恢复。

高并发业务行业最佳实践,是使用第三种折衷配置(=2):

1.配置为2和配置为0,性能差异并不大,因为将数据从Log Buffer拷贝到OS cache,虽然跨越用户态与内
核态,但毕竟只是内存的数据拷贝,速度很快
2.配置为2和配置为0,安全性差异巨大,操作系统崩溃的概率相比MySQL应用程序崩溃的概率,小很多,设置
为2,只要操作系统不奔溃,也绝对不会丢数据
错误日志

错误日志

mysqld启动和关闭过程中输出的事件信息
mysqld运行中产生的错误信息
event scheduler运行一个event时产生的日志信息
在主从复制架构中的从服务器上启动从服务器线程时产生的信息

18、MySQL日志管理(上)_错误日志_09

18、MySQL日志管理(上)_错误日志_10

记录哪些警告信息至错误日志文件

18、MySQL日志管理(上)_事务日志_11

log_warnings的值为0,表示不记录警告信息。
log_warnings的值为1,表示警告信息一并记录到错误日志中。
log_warnings的值大于1,表示"失败的连接"的信息和创建新连接时"拒绝访问"类的错误信息也会被记录到错误日志中。