mysql日志介绍

1. 错误日志

   错误日志记录的事件:

   a. 服务器启动关闭过程中的信息

   b. 服务器运行过程中的错误信息

   c. 事件调试器运行一个事件时间生的信息

   d. 在从服务器上启动从服务器进程时产生的信息

2. 查询日志

   查询日志记录查询语句与启动时间,建议不是在调试环境下不要开启查询日志,因为会不断占据你的磁盘空间,并会产生大量的IO。

   查询日志有两种,分别是慢查询日志(Slow Query Log)和通用查询日志(General Query Log)。而且Mysql的查询日志不仅可以记录到文件,还能自动保存到MySql数据库中的表对象里。

3. 二进制日志,即 binlog日志

   binlog日志用于记录所有更新且提交了数据或者已经潜在更新提交了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。

   binlog作用

   a. 恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。

   b. 在主复制服务器上记录所有将发送给从服务器的语句。

4. 事务日志

    a. redo log

        因为redo log记录的是数据页的物理变化,因此恢复的时候速度比逻辑日志(如二进制日志)要快很多。而且,innodb自身也做了一定程度的优化,让恢复速度变得更快。

        redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。

        在概念上,innodb通过force log at commit机制实现事务的持久性,即在事务提交的时候,必须先将该事务的所有事务日志写入到磁盘上的redo log file和undo log file中进行持久化。

        MySQL支持用户自定义在commit时如何将log buffer中的日志刷log file中。这种控制通过变量 innodb_flush_log_at_trx_commit 的值来决定。该变量有3种值:0、1、2,默认为1。但注意,这个变量只是控制commit动作是否刷新log buffer到磁盘。

       在启动innodb的时候,不管上次是正常关闭还是异常关闭,总是会进行恢复操作。

      因为redo log记录的是数据页的物理变化,因此恢复的时候速度比逻辑日志(如二进制日志)要快很多。而且,innodb自身也做了一定程度的优化,让恢复速度变得更快。

      记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据

复到最新的状态。

    b. 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也要实现持久性保护。

        当事务提交的时候,innodb不会立即删除undo log,因为后续还可能会用到undo log,如隔离级别为repeatable read时,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除,即undo log不能删除。

        但是在事务提交的时候,会将该事务对应的undo log放入到删除列表中,未来通过purge来删除。并且提交事务时,还会判断undo log分配的页是否可以重用,如果可以重用,则会分配给后面来的事务,避免为每个独立的事务分配独立的undo log页而浪费存储空间和性能。

        通过undo log记录delete和update操作的结果发现:(insert操作无需分析,就是插入行而已)

        delete操作实际上不会直接删除,而是将delete对象打上delete flag,标记为删除,最终的删除操作是purge线程完成的。

        update分为两种情况:update的列是否是主键列。

        如果不是主键列,在undo log中直接反向记录是如何update的。即update是直接进行的。

        如果是主键列,update分两部执行:先删除该行,再插入一行目标行。

    

5. 慢查询日志:

     慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。

6. 中继日志:

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

    

参见:https://blog.csdn.net/mydriverc2/article/details/50629599

         https://www.cnblogs.com/andy6/p/6921515.html

         http://blog.51cto.com/pangge/1319304

https://juejin.im/post/5b7c0aabf265da438415b9eb

https://juejin.im/entry/5ba0a254e51d450e735e4a1f

https://blog.51cto.com/pangge/1319304

原文地址:https://www.cnblogs.com/Jtianlin/p/10235631.html