mysql 日志种类
1:重做日志(redo log)
2:回滚日志(undo log)
3:二进制日志(binlog)
4:错误日志(errorlog)
5:慢查询日志(slow query log)
6:一般查询日志(general log)
7:中继日志(relay log)。
mysql 执行命令过程
重点 1.图中的缓存就是内存层次的缓存不是日志 2.查询语句才会走缓存 更新操作不仅不会走缓存还会清空表的缓存 3.这个图是最简单的解释 实际会更加复杂 不可以死记 4.mysql默认是不开启缓存的哦
重做日志(redo log)详解
- 作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
- 重做日志是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
- redo日志是存在于innodb引擎的,是存在于引擎层的特殊日志。
- InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大 小是 1GB,那么redo log总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开 头循环写,如下面这个图所示:
1.wirte pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。
2.checkpoint 是当前要擦除的位置,也是往后推移并且循环的,便是擦除记录前要把记录更新到数据文件。你可以把checkpoint想像成破坏着,他所指的地方寸草不生。
3.write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。
4.如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦 掉一些记录,把 checkpoint 推进一下。
为了控制 redo log 的写入策略,InnoDB 提供了 innodb_flush_log_at_trx_commit 参数,它有三种可能取值:
1)设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;
2)设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘;
3)设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache。InnoDB 有一个后台线程,每隔 1 秒,就会把 redo log buffer 中的日志,调用 write 写到文件系统的 page cache,然后调用 fsync 持久化到磁盘。
进制日志(binlog)详解
- 作用:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步;用于数据库的基于时间点的还原;记录了对数据库的更新操作
既然有了redo 日志 为啥还有binlog 日志,因为他们都存在还原的功能这存在功能的重复???
这是历史问题。最开始的Mysql用的不是InnoDB引擎,而是MyISAM引擎,那时的MyISAM是没有crash-safe能力的,binlog只能用于归档。而InnoDB引入Mysql后,要克服Mysql没有crash-safe的能力,就引入了现在的redo log日志。
binlog 日志与 redo 日志区别:
1.层次不同:redo log 是InnoDB引擎所特有的;binlog是MySql的server层实现的,所有引擎都可使用
2.格式不同:redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1”。
3.写入方式不同:redo是循环写,因为空间是固定的早晚会用完;binlog是追加写,即一个文件写满后切换到下一个,并不会覆盖以前的日志。
回滚日志(undo log)
- 基本概念
undo log有两个作用:提供回滚和多个行版本控制(MVCC)。
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。有时候应用到行版本控制的时候,也是通过undo log来实现的:当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。
undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。
另外,undo log也会产生redo log,因为undo log也要实现持久性保护。
错误日志(errorlog)
- 基本概念
MySQL的错误日志用于记录MySQL服务进程mysqld在启动/关闭或运行过程中遇到的错误信息。
慢查询日志(slow query log)
MySQL 慢查询日志是排查问题 SQL 语句,以及检查当前 MySQL 性能的一个重要功能。
以下是可以设置的选项
slow_query_log 慢查询开启状态
slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
long_query_time 查询超过多少秒才记录
一般查询日志(general log)
MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。
中继日志(relay log)。
用于主从库中