首页  

mysql各种日志文件介绍     所属分类 mysql 浏览量 2004
重做日志(redo log)
回滚日志(undo log)
二进制日志(binlog)
错误日志(errorlog)
慢查询日志(slow query log)
一般查询日志(general log)
中继日志(relay log)

通用日志	记录建立的客户端连接和执行的语句



show variables like '%log%'
  
重做日志(redo log)
确保事务的持久性
重做日志缓存 
innodb_log_buffer
show variables like 'innodb_log_buffer_size'

日志缓冲区日志何时刷新到磁盘?
Master Thread 每秒刷新一次
事务提交时
当重做日志缓存可用空间少于一半时


回滚日志(undo log)
事务回滚 提供多版本并发控制下的读(MVCC),也即非锁定读
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性

当事务提交之后,undo log并不能立马删除,
而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

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


MySQL5.7之后的独立undo 表空间配置参数如下
# undo独立表空间存放目录
innodb_undo_directory = /data/undospace/ 
# 回滚段为128KB
innodb_undo_logs = 128 
# 指定有4个undo log文件
innodb_undo_tablespaces = 4 

undo可以使用共享表空间,innodb_data_file_path

undo在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。


二进制日志(binlog)

作用:
  用于复制,主从复制,从库利用主库上的binlog进行重播,实现主从同步。
  基于时间点的还原。

内容:
  逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。
  但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,
  也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。
  可以使用 mysqlbinlog 解析 binlog 


事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。

与redo log的差别 ,redo log在事务开始之后逐步写入磁盘。

较大的事务,提交(commit)很快,但是开启了bin_log之后,会变慢

binlog 在事务提交时一次性写入 


默认保留时间配置 expire_logs_days 


binlog 与 redolog 的区别

作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的)。
内容不同:redo log是物理日志,是数据页面修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句
产生的时间,可以释放的时间,清理机制,不同。
恢复数据效率,基于物理日志的redo log 高于 逻辑日志 binlog


MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,
理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。



redolog 和 binglog 配置

innodb_flush_log_at_trx_commit = N

N=0  每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
N=1  每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;
N=2  每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;

sync_binlog =  N

N>0  每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;

N=0  不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定;

推荐配置组合:

N=1,1  适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统;

N=1,0  适合数据安全性要求高,磁盘IO写能力支持业务不富余,允许备库落后或无复制;

N=2,0或2,m(0 show master status; 
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
 
#查看日志【所生成的全部日志文件】
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+
1 row in set (0.00 sec)
 
#可以查看对某个日志中具体的操作
mysql> show binlog events in 'mysql-bin.000001'; 
+------------------+-----+----------------+-----------+-------------+--------------------------------------------
------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                       
            |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------
------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.22-0ubuntu0.16.04.1-log, Bi
nlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                            
            |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------
------------+
2 rows in set (0.00 sec)


使用mysqlbinlog命令来查看二进制日志文件中的的内容




通用日志


mysql> show variables like '%gene%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /var/lib/mysql/loggeneral.log |
+------------------+---------------------------------+
2 rows in set (0.03 sec)





慢查询日志

slow_query_log = 1时,记录执行时间超过long_query_time的所有SQL

mysql> show variables like '%slow_query%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| slow_query_log      | OFF                                  |
| slow_query_log_file | /var/lib/mysql/54b78b286d5c-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.01 sec)
可以通过mysqldumpslow命令来查看和分析慢查询日志

 mysqldumpslow /var/lib/mysql/54b78b286d5c-slow.log -t 2 -s al
  
Reading mysql slow query log from /var/lib/mysql/iZbp1akzlq26t30fbsdwh7Z-slow.log
-- count 执行次数
-- time 执行时间
-- lock 锁定时间
-- rows 返回条数
-- root[root]@localhost  通过那个用户执行的
Count: 5  Time=0.00s (0s)  Lock=0.01s (0s)  Rows=5.0 (25), root[root]@localhost

上一篇     下一篇
kafka高性能机制

科创板上市指南

360N4使用技巧

mysql运维命令

nginx安装及配置

nginx知识点整理