乐趣区

关于mysql:深入理解MySQL日志

1.Error Log

  • 记录 MySQL 运行过程中的 Error、Warning、Note 等信息,零碎出错或者某条记录出问题能够查看 Error 日志。

MySQL 的谬误日志默认以 hostname.err 寄存在 MySQL 的日志目录,能够通过以下语句查看

  • 默认装置时,谬误日志通常在配置文件(my.cnf)中 mysqld 局部的 log-error 配置项进行设置;利用 MySQL 零碎变量 log_error 能够查看谬误日志的文件名
  • 批改谬误日志的地址能够在 my.cnf 中增加 –log-error = [filename]来开启 mysql 谬误日志。配置如下:

    log_error = /data/mysql_data/error.log
    

2.Slow Log

  • MySQL 慢查问日志(slow query log)记录了执行工夫超过指定阈值的 SQL 语句,能够用于监控须要执行优化的查问语句。
  • 如果启用了慢查问日志,任何执行工夫超过 long_query_time 并且执行次数达到 min_examined_row_limit 次的查问语句都会被记录到慢查问日志中。

查看日志性能是否开启:show variables like “%slow%”;
援用

slow_query_log 配置为 ON,阐明开启慢日志
  • 查看下默认设置的慢查问的工夫:show variables like “%long_query%”;

  • 查看一下日志文件的输入:

对于慢查问日志的剖析,举荐应用 mysqldumpslow 或者 pt-query-digest 工具

3.Relay Log

  • MySQL 中继日志(relay log)只存在于主从复制构造中的从节点上,用于保留主节点传输过去的数据变更事件,而后将这些事件利用于从节点。
  • 中继日志与二进制日志相似,也是由一组带编号的文件组成;同时还蕴含了一个索引文件,记录了所有曾经应用过的中继日志文件。中继日志文件默认寄存在数据目录中。

其中 relay_log 和 relay_log_index 别离对应为中继日志的文件名和索引文件名。中继日志文件的格局和二进制日志文件的格局雷同,因而也能够应用 mysqlbinlog 工具进行读取

4.Binlog

  • 什么是 binlog

    binlog 记录了数据库表构造和表数据变更,比方 update/delete/insert/truncate/create,它不会记录 select
    
    
  • binlog 长什么样

    binlog 咱们能够简略了解为:存储着每条变更的 SQL 语句
    默认状况下 binlog 日志是二进制格局,无奈间接查看,能够应用 mysqlbinlog 来查看,mysqlbinlog 是 mysql 官网提供的一个 binlog 查看工具。
  • binlog 个别用来做什么

    次要有两个作用:复制和复原数据
    1.MySQL 在公司应用的时候往往都是一主多从构造的,从服务器须要与主服务器的数据保持一致,这就是通过 binlog 来实现的
    2. 数据库的数据被干掉了,咱们能够通过 binlog 来对数据进行复原。因为 binlog 记录了数据库表的变更,所以咱们能够用 binlog 进行复制 (主从复制) 和复原数据。

5.Redo Log

  • 什么是 redo log

update table set name=’ws’ where id = 3
援用
MySQL 执行这条 SQL 语句,必定是先把 id= 3 的这条记录查出来,而后将 name 字段给改掉。这没问题吧?
援用
实际上 Mysql 的根本存储构造是页(记录都存在页里边),所以 MySQL 是先把这条记录所在的页找到,而后把该页加载到内存中,将对应记录进行批改。

问题 1:如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了怎么办?显然这次更改就丢了。
  • redo log 的作用

其实写 redo log 的时候,也会有 buffer,是先写 buffer,再真正落到磁盘中的。至于从 buffer 什么时候落磁盘,会有配置供咱们配置。
援用
redo log 的作用是当咱们批改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时咱们的数据库挂了,咱们能够依据 redo log 来对数据进行复原。
援用
因为 redo log 是程序 IO,所以写入的速度很快,并且 redo log 记录的是物理变化(xxxx 页做了 xxx 批改),文件的体积很小,复原速度很快。
援用

  • 什么时候开释

    当对应事务的脏页写入到磁盘之后,redo log 的使命也就实现了,重做日志占用的空间就能够重用(被笼罩)。

Redo Log & Binlog

  1. 存储的内容

       redo log 记录的是数据的物理变化,binlog 记录的是数据的逻辑变动
    
  2. 性能

       redo log 的作用是为长久化而生的。写完内存,如果数据库挂了,那咱们能够通过    redo log 来复原内存还没来得及刷到磁盘的数据,binlog 的作用是复制和复原而生的。主从服务器须要保持数据的一致性,通过 binlog 来同步数据。
  3. binlog 和 redo log 写入的细节

       redo log 是 MySQL 的 Innodb 引擎所产生的。binlog 无论 MySQL 用什么引擎,都会有的。
  4. 写入工夫

      redo log 事务开始的时候,就开始记录每次的变更信息
      而 binlog 是在事务提交的时候才记录。
问题 2:如果每个申请都须要将数据立马落磁盘之后,那速度会很慢,MySQL 可能也顶不住。所以 MySQL 是怎么做的呢?MySQL 引入了 redo log,内存写完了,而后会写一份 redo log,这份 redo log 记录着这次在某个页上做了什么批改。

6.Undo log

1. undo log 次要有两个作用:回滚和多版本控制(MVCC)

在数据批改的时候,不仅记录了 redo log,还记录 undo log,如果因为某些起因导致事务失败或回滚了,能够用 undo log 进行回滚
undo log 次要存储的也是逻辑日志,比方咱们要 insert 一条数据了,那 undo log 会记录的一条对应的 delete 日志。
咱们要 update 一条记录时,它会记录一条对应相同的 update 记录。因为 undo log 存储着批改之前的数据,相当于一个前版本,MVCC 实现的是读写不阻塞,读的时候只有返回前一个版本的数据就行了。

  1. 什么时候产生

     事务开始之前,将以后的版本生成 undo log,undo 也会产生 redo 来保障 undo log 的可靠性
    
  2. 什么时候开释

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

利用

1.MySQL 怎么保障一致性的

* 从数据库层面,数据库通过原子性、隔离性、持久性来保障一致性。在 ACID 四大个性之中,C(一致性)是目标,A(原子性)、I(隔离性)、D(持久性)是伎俩,是为了保障一致性,数据库提供的伎俩。*MySQL 通过两阶段提交来保障 redo log 和 binlog 的数据是统一的。* 阶段 1:InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态

* 阶段 2:binlog 写盘,InnoDB 事务进入 commit 状态

* 每个事务 binlog 的开端,会记录一个 XID event,标记着事务是否提交胜利,也就是说,复原过程中,binlog 最初一个 XID event 之后的内容都应该被 革除

2.MySQL 怎么保障原子性的

利用 Innodb 的 undo log。undo log 回滚日志,是实现原子性的要害

当事务回滚时可能撤销所有曾经胜利执行的 sql 语句,它须要记录你要回滚的相应日志信息。

3.MySQL 怎么保障持久性的

利用 Innodb 的 redo log
InnoDB 是有事务的:持久性就是靠 redo log 来实现的(如果写入内存胜利,但数据还没真正刷到磁盘,如果此时的数据库挂了,咱们能够靠 redo log 来复原内存的数据,这就实现了持久性)采纳 redo log 的益处是将 redo log 进行刷盘比对数据页刷盘效率高,具体表现如下:1.redo log 体积小,毕竟只记录了哪一页批改了啥,因而体积小,刷盘快。2.redo log 是始终往开端进行追加,属于程序 IO。效率显然比随机 IO 来的快。
退出移动版