php是最好的语言

mysql 各种日志相关

一、MySQL缓冲池(buffer pool)


缓冲池就是一块内存区域,它存在的原因之一是为了避免每次都去访问磁盘,把最常访问的数据放在缓存里,提高数据的访问速度

 

1、预读是啥?

磁盘读写,并不是按需读取,而是按页读取,一次至少读一页数据(一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。为了防止预读带来的预读失效”采用了“新生代老生代方式”;为了防止“缓冲池污染采用了“老生代停留时间窗口”的机制

 

预读失效

  • 提前把页放入了缓冲池,但最终MySQL并没有从页中读取数据,称为预读失效。

缓冲池污染

  • 当某一个SQL语句,要批量扫描大量数据时,可能导致把缓冲池的所有页都替换出去,导致大量热数据被换出,MySQL性能急剧下降,这种情况叫缓冲池污染。


 

2buffer pool读操作流程:在数据库当中读取页的操作,首先将从磁盘读到的页存放在缓存池中。下一次再读相同的页时,首先判断该页是不是在缓冲池中。若在,直接读取。否则,读取磁盘上的页。

 

3buffer pool写操作流程:对于数据库中页的修改操作,则首先修改缓存池中的页,然后再以一定的频率刷新到磁盘上。需要注意的是,缓冲池刷新回磁盘并不是每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新回磁盘。


二、Mysql各种日志

 

1、事务日志之undo logundo log是一种用于事务回滚的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。undo log实现事务的原子性undo log实现多版本并发控制(MVCC),提供了快照读的支持

 

2、事务日志之redo log重做日志:利用WAL技术(Write-Ahead-Logging, 即先写日志,后写磁盘)推迟物理数据页的刷新,从而提升数据库吞吐,有效降低了访问时延。redo log提供了crash-safe的能力,即使MySQL异常重启导致buffer pool内存数据丢失,之前提交的记录也不会丢失redo log的写入分成了 prepare commit 两个阶段, 称为两阶段提交redo log并不是直接写入磁盘的,而是先写入到缓存区,我们把这个缓冲区叫做 redo日志缓冲区

 

3binlog二进制日志):,可以说是MySQL最重要的日志,它记录了所有的DDL(create、alter、drop)和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的主要作用是用于数据库的主从复制及数据的增量恢复。

4慢查询日志(Slow Query Log):记录查询运行时间超过指定阈值(slow_query_log_threshold)的SQL语句需要手动开启

5错误日志(Error Log):记录MySQL服务器出现错误的信息,如非法用户连接、语法错误等。

 

 

 

三、binlog与redolog的区别?

 

1、binlog 会记录表所有更改操作,包括更新删除数据,更改表结构等等,主要用于人工恢复数据,而 redo log 对于我们是不可见的,它是 InnoDB 用于保证 crash-safe 能力的,也就是在事务提交后MySQL崩溃的话,可以保证事务的持久性,即事务提交后其更改是永久性的。一句话概括:binlog 是用作人工恢复数据,redolog 是 MySQL 自己使用,用于保证在数据库崩溃时的事务持久性。

 

2redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

 

1、redo log 文件是固定大小的,是循环写的,写满了会从头继续写,而 binlog 是追加写的,写满了再新建文件接着写。



下图是大概各种日志流程:


mysql日志流程.png




作者:xTao 分类:LNMP 浏览:2340 评论:0