# MySQL日志管理

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/9692.html | 发布：2022-09-05 | 更新：2022-09-05 | 分类：建站教程、投稿分享

### 1 MySQL日志

 

#### 1.1 错误日志

 

文件名：可用–log-error[=file_name]指定，否则默认使用hostname.err

 

内容：记录mysqld启动和停止时，以及服务器发生任何严重错误时记录相关信息

 

#### 1.2 二进制日志

 

文件名：也是binlog(逻辑日志)，可用–log-bin[=file_name] 指定，默认为主机名

 

内容：包含了所有更新了或者潜在更新了数据的所有语句，语句以“事件”的形式保存，描述数据更改文件位置和格式

 

查看日志：

 

mysqlbinlog log-file

 

删除日志：

 

#删除所有的binlog日志，新日志从头开始编号  
RESET MASTER  
#删除mysql-bin.010之前的所有日志  
PURGE MASTER LOGS TO 'mysql-bin.010'  
#删除2022.5.1之前的binlog日志  
purge master logs before '2022-05-01 08:00:00';

 

#### 1.3 查询日志

 

文件名：使用–log指定，默认hostname.log

 

内容：记录客户端所有查询语句记录，在二进制日志不存在查询语句记录

 

#### 1.4 慢查询日志

 

文件名：使用–log-slow-querie指定，默认*-slow.log，写入data目录

 

内容：记录执行时间超过long_query_time秒的SQL查询日志文件

 

其它选项：–log_slow_admin_statements：表示将慢管理语句，如OPTIMIZE TABLE、ANALYZE TABLE和ALTER TABLE写入慢查询语句

 

#### 1.5 通用查询日志

 

查看：`show variables like '%general_log%';`

 

执行SQL命令 `set global general_log=on;` 开启

 

文件：默认存放在data目录下hostname.log文件

 

内容：记录客户端的所有查询行为

 

#### 1.6 中继日志

 

文件：默认文件名hostnamet-relay-bin，存放在data目录下

 

功能：从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件，然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器，从而使从服务器和主服务器的数据保持一致

 

参数：`show variables like '%relay%';`

 
 
- max_relay_log_size 
 
  - relay log 允许的最大值，如果该值为0，则默认值为 max_binlog_size (1G) 
  - 如果不为0，则 max_relay_log_size 则为最大的relay_log文件大小 
- relay_log 
 
  - 定义 relay_log 的位置和名称，如果值为空，则默认位置在数据文件的目录 
- relay_log_index 
 
  - 定义 relay_log 索引的位置和名称，记录有几个 relay_log 文件，默认为2个 
- relay_log_info_file 
 
  - 定义 relay-log.info 的位置和名称，relay-log.info 记录 master 主库的 binary_log 的恢复位置和 从库 relay_log 的位置 
- relay_log_purge 
 
  - 是否自动清空中继日志，默认值为1(启用) 
- relay_log_recovery 
 
  - 当slave从库宕机后，假如relay-log损坏了，导致一部分中继日志没有处理，则自动放弃所有未执行的relay-log，并且重新从master上获取日志，这样就保证了relay-log的完整性。默认情况下该功能是关闭的，将relay_log_recovery的值设置为 1时，可在slave从库上开启该功能，建议开启 
- sync_relay_log 
 
  - 当设置为1时，slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区，然后刷入relay log中继日志里，这样是最安全的，因为在崩溃的时候，你最多会丢失一个事务，但会造成磁盘的大量I/O 
  - 当设置为0时，并不是马上就刷入中继日志里，而是由操作系统决定何时来写入，虽然安全性降低了，但减少了大量的磁盘I/O操作。这个值默认是0，可动态修改 
- sync_relay_log_info 
 
  - 这个参数和 sync_relay_log 参数一样 

 

#### 1.7 审计日志

 

内容：企业版自带功能，社区版需使用audit审计插件完成数据库审计工作

 

开启步骤：

 
 
- 下载插件：https://github.com/mcafee/mysql-audit 
- 查看插件功能是否开启： `show variables like "%audit%";` 
- 开启插件功能：`set global audit_json_file=1;`

 

注意，使用此方法开启对global全局变量的设置仅对于新开启的会话才是有效的，对已经开启的会话不生效，参数最终需持久化到my.cnf配置文件中 
- 开启后，在MySQL数据目录下会多出一个mysql-audit.json审计日志 

 

### 2 InnoDB日志

 

#### 2.1 重做日志 (Redo Log)

 

文件：默认情况下，对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2

 

内容：物理日志，记录物理数据页面的修改信息，redo log顺序写入redo log file物理文件中

 

重做日志有一个缓冲区Innodb_log_buffer，InnoDB优先将重做日志写入缓冲区，日志写盘通常有三种方式：

 
 
- Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件 
- 每个事务提交时会将重做日志刷新到重做日志文件。 
- 当重做日志缓存可用空间 少于一半时，重做日志缓存被刷新到重做日志文件 

 

因此，重做日志的写盘，并不一定是随着事务的提交才写入重做日志文件的，而是随着事务的开始逐步开始的，这可以很好地解释再大的事务的提交（commit）的时间也是很短暂的

 

事务产生的重做日志，通过**innodb_flush_log_at_trx_commit**参数控制：

 
 
- 设置为 0 的时候，表示不写入buffer，直接每秒写入到redo file中，但mysql 崩溃会丢失1s数据 
- 设置为 1 的时候，表示每次事务提交时都将 redo log 直接持久化到磁盘 
- 设置为 2 的时候，表示每次事务提交时都只是把 redo log 写到 page cache，由OS处理回写磁盘操作，OS宕机会丢失数据 

 

#### 2.2 回滚日志(Undo Log)

 

文件：逻辑日志，记录在表空间中

 
 
- MySQL5.6之前，undo表空间位于共享表空间的回滚段中，共享表空间的默认的名称是ibdata，位于数据文件目录中 
- MySQL5.6之后，undo表空间可以配置成独立的文件，但是提前需要在配置文件中配置，完成数据库初始化后生效且不可改变undo log文件的个数 

 

内容：记录数据的逻辑变化，一条INSERT会对应一条DELETE的undo log，发生错误时能够恢复到事务之前的数据状态

 

undo log是MVCC(多版本并发控制)实现的关键

 

![MySQL日志管理](https://www.mfisp.com/wp-content/uploads/2022/01/13f2011b3ecdd68_1_post.jpg)

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
