MySQL 日志管理
错误日志
主要是用来记录MySQL服务器启动、运行或停止时遇到的问题,像使用 mysql --initialize初始化mysql的基础数据时候,默认给root用户生成的密码就放在错误日志里面。
错误日志的配置只需要一个配置选项即可:
- log_error :指定错误日志的存放位置和文件名
例如:
log_error = /var/log/mysql/error.log
MySQL的警告日志信息默认也是写入错误日志中的,一般这个值不用修改,使用默认的就行了。
警告日志通过以下参数可以进行配置:
-
log_warnings:用于mysql5.7之前的版本,默认值是1,表示将警告日志写入错误日志中。0表示不写入错误日志文件。值大于1,表示”失败的连接”的信息和创建新连接时”拒绝访问”类的错误信息也会被记录到错误日志中。
-
log_error_verbosity:mysql5.7及后面版本用的配置选项,默认的值是3
通用日志
通用日志主要是记录所有关于服务器的活动,包括所有客户端的连接和所有执行的SQL语句,mysql的通用日志是关闭的,如果需要设置可以通过 general_log 选项开启通用日志。
通用查询日志记录了大量的信息,它可能会对数据库服务器的性能产生显著影响,特别在高负载的生产环境中。而且还会占用大量磁盘空间和磁盘 I/O 问题,所以一般调试的时候才会开启通用日志。
配置通用日志主要使用以下选项:
-
general_log:设置是否开启通用日志,默认为关闭(0),1表示开启
-
general_log_file:设置通用日志的存放位置和文件名
例如:
[mysqld]
general_log = 1 # 1表示开启 0表示关闭
general_log_file = /var/log/mysql/mysql.log
慢查询日志
慢查询日志记录了执行时间超过特定阈值的所有查询,可以根据这些信息监控和诊断数据库性能问题。
一般情况下是需要调试时候才开启慢查询日志,如果长期开启可能会对数据库性能产生一定的影响,且在大型或高负载的环境中日志文件可能会快速增长,占用过多磁盘空间。
可以通过以下选项来配置慢查询日志:
-
slow_query_log:用于设置是否开启慢查询日志,1表示开启,0表示关闭
-
slow_query_log_file:用于指定慢查询日志的存放位置和文件名
-
long_query_time:用于指定慢查询日志的阈值,单位秒,默认为10s,超过这个时间的就会被记录到slow_query_log_file指定的文件。
例如:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
二进制日志
二进制日志(Binary Log)是一种特殊类型的日志文件,它记录了所有修改数据库内容的操作,比如 INSERT、UPDATE 和 DELETE 语句,以及数据定义语言(DDL)语句,如 CREATE TABLE、ALTER TABLE 等。
MySQL 的二进制日志并不是由纯粹的0和1序列组成的简单文件。实际上,它是一种特殊的二进制格式文件,这种格式旨在高效地存储和记录数据库更改操作。这种专门为 MySQL 优化的格式,既保证了存储和传输的高效性,也便于使用相应的工具进行内容查看和分析。例如mysqlbinlog这个工具就可以查看二进制文件的内容。
MySQL的二进制日志不像通用日志、慢查询日志一样耗费性能,二进制日志对性能的影响通常较小。一般在主从复制的架构中才需要开启二进制日志。
通过以下选项可以完成对二进制日志的配置:
-
log_bin :指定二进制日志的文件名,使用这个选项的时候就开启了二进制日志
-
expire_logs_days:设置二进制日志文件的自动过期天数。过了这个期限,旧的日志文件会被自动删除。
-
max_binlog_size:指定单个二进制日志文件的最大大小。达到这个大小后,MySQL 会关闭当前日志文件,并创建一个新的日志文件。
-
binlog_do_db:指定只有哪些数据库的更改会被记录在二进制日志中。
-
binlog_ignore_db:指定哪些数据库的更改不应该被记录在二进制日志中。
-
skip-log-bin:用于完全禁用二进制日志,配置了这个选项,会覆盖 log_bin 的设置,导致二进制日志不会被启用。
说明: MYSQL5.7只设置了全局系统变量log_bin,没有设置全局系统变量server_id的话,那么MySQL启动不了,而且错误日志没有任何错误信息。
例如:
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 14
max_binlog_size = 256M
binlog-do-db = position_ehcommon
binlog-do-db = iot
binlog-do-db = map
中继日志
中继日志(Relay Log)是在主从复制环境中使用的一种特殊日志文件,可以理解为二进制日志换一个名字,在主从复制环境中,中继日志是存放在从服务器上的。
在 MySQL 的主从复制环境中,中继日志(Relay Log)的作用是暂存从主服务器接收的二进制日志(Binary Log)事件,并在从服务器上执行这些事件以实现数据同步。
一旦这些事件在从服务器上成功执行并且数据同步完成,相应的中继日志文件就不再需要了,因此会被自动删除。这是从服务器自动进行的,以确保不会因为长时间累积大量的中继日志而占用过多的磁盘空间。
重做日志
重做日志(Redo Log)是InnoDB存储引擎特有的日志系统,用于保证事务的持久性和恢复能力。重做日志也是以二进制格式存储存储的,并且如果使用的引擎是innodb,默认是开启了重做日志
重做日志的作用:
数据恢复:重做日志记录了对数据库所做的更改。这些记录用于确保即使在系统崩溃的情况下,这些更改也不会丢失。在数据库崩溃后,重做日志用于恢复未提交的更改,以确保数据的一致性和完整性。
优化写入性能:数据先写入重做日志,然后再异步更新数据文件,可以提高数据库的写入性能。
虽然默认开启了重做日志,但是也可以根据一些参数来进行调整:
-
innodb_log_file_size:设置每个重做日志文件的大小,太小可能导致频繁的日志刷新,影响性能;日志太大可能增加恢复时间。
-
innodb_log_files_in_group:定义了日志文件组中文件的数量。
MySQL异常断电和重做日志:
1、启动时的事务检查: 当 MySQL 启动时,它会检查重做日志(Redo Log),以确定是否有未完成的事务。这是为了确保在系统崩溃或关闭时,数据库能够恢复到一致的状态。
2、完成或回滚事务: 如果发现有未完成的事务,MySQL 会使用重做日志中的信息来完成这些事务(如果它们在崩溃时已经被标记为提交)或者回滚这些事务(如果它们还没有提交)。
3、异常断电的影响: 在异常断电的情况下,重做日志可能会在写入过程中被部分损坏。这意味着日志中可能包含不完整或损坏的信息,使得 MySQL 无法准确地完成或回滚事务。
4、启动失败: 如果 MySQL 无法从重做日志中恢复一致的数据库状态(可能是由于日志损坏),它可能无法正常启动。这是因为启动过程中无法保证数据的完整性和一致性。