mysql的日志

1. mysql的执行过程

1.1 mysql的内部组件架构

1.1.1 server层
  •         连接器

         当有客户端与MySQL发起通信必须先跟server端建立通信连接,而建立连接的工作就是有连接器来完成。

        在完成TCP握手连接后,连接器会进行认证用户和密码,认证通过后连接器会从权限表中获取用户拥有的操作权限。

         注:当一个用户成功建立连接之后,即使你用管理员账号对用户的权限进行了修改,连接中的用户权限也不会变更;权限修改完成后,只有新建立的连接才会生效。

  • 查询缓存

        当发起一个sql查询的时候,会先到查询缓存是否执行过者sql语句。之前执行过的语句和结果会以key-value的形式存储在查询缓存中,如果缓存中不存在才会去执行下面的执行流程。

        一般建议只对极少更新的表进行缓存查询。

  • 词法分析器

        对语句进行分析。包括:词法分析、语法分析、语义分析、构造执行树、生成执行计划和计划的执行几个步骤。

  • 优化器

        优化器是在表中存在几个索引的时候,决定使用哪个索引;或者在一个语句中存在多个表连接查询的时候,确定表的先后连接顺序。

  • 执行器

        开始sql语句的执行,会先判断用户对执行表是否有权限,无权限则直接失败,有权限,执行器会更加表定义的引擎,去使用这引擎提供的接口。

1.1.2 store层

        存储引擎层负责数据的提取和存储。支持innoDB、MyISAM、Memory等多个执行引擎。现在用的最多的是innoDB。

2. Mysql的日志文件

  • 错误日志(error log):对MySQL的启动、运行、关闭过程进行了记录,能帮助定位MySQL问题。
  • 慢查询日志(slow query log):用来记录执行时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。

  • 一般查询日志(general log):记录了所有对MySQL数据库请求的信息,无论请求是否正确执行。

  • 二进制日志(bin log):记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。

        innoDB特有引擎:

  • 重做日志(redo log):记录了对于InnoDB存储引擎的事务日志。
  • 回滚日志(undo log):回滚日志的作用就是对数据进行回滚。当事务对数据库进行修改,InnoDB引擎不仅会记录redo log,还会生成对应的undo log日志;如果事务执行失败或调用了rollback,导致事务需要回滚,就可以利用undo log中的信息将数据回滚到修改之前的样子。

2.1 bin-log日志文件

        binlog是server层实现的二进制日志文件,会记录crud的操作。用于保证数据的一致性,提供给主从同步,恢复数据以及数据同步等用途。

        特性:

        a. binlog是在Mysql的Server层实现的(引擎公用)

        b. binlog是逻辑日志,记录的是一条数据的原始逻辑

        c. binlog不限大小,通过追加写入,不会覆盖以前的日志。

        开启日志记录,需配置my.cnf文件

        log-bin=/usr/local/mysql/data/binlog/mysql-bin

        binlog-format=row

        sync-binlog=1(表示每次写入就与硬盘同步,会影响性能,为0时表示,事务提交时不进行刷盘操作,有系统决定。)

        binlog模式有三种(row、statement,mixed)

2.2 undo-log日志文件

        undolog是引擎层日志,innoDB引擎提供,逻辑日志,用于事务回滚,MVCC多版本控制等。保障数据的【原子性】。

        在数据修改的时候,不仅记录了redo log,还记录undo log,如果因为某些原因导致事务失败或回滚了,可以用undo log进行回滚。

2.3 redo-log日志文件

        redolog是引擎层日志,innoDB引擎提供,物理日志,物理修改内容(xxxx页修改了xxx)。用于保证数据的持久性,数据保存等逻辑。

        其实写redo log的时候,也会有buffer,是先写buffer,再真正落到磁盘中的。至于从buffer什么时候落磁盘,会有配置供我们配置。写redo log也是需要写磁盘的,但它的好处就是顺序IO(我们都知道顺序IO比随机IO快非常多)。

        redo log的存在为了:当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以根据redo log来对数据进行恢复。因为redo log是顺序IO,所以写入的速度很快,并且redo log记载的是物理变化(xxxx页做了xxx修改),文件的体积很小,恢复速度很快。

       数据库事务提交的时候:redolog有两次阶段提交,binlog写入前的prepare状态的写入,binlog日志写入后的commit状态的写入。

   binlog与redolog的区别:
  • binlog存的是数据的逻辑变化,所有执行的DDL和DML语句;redolog记载的是数据的物理变化,物理修改内容(xxxx页修改了xxx)。
  • 功能不同,binlog用于主从复制和恢复数据。
    • 主从服务器需要保持数据的一致性,通过bin log来同步数据。
    • 如果整个数据库的数据都被删除了,bin log存储着所有的数据变更情况,那么可以通过bin log来对数据进行恢复。

        redolog用于持久化。

  • 写完内存,如果数据库挂了,那我们可以通过redo log来恢复内存还没来得及刷到磁盘的数据,将redo log加载到内存里边,那内存就能恢复到挂掉之前的数据了。
  • 写入时间不同。

    • bin log:仅在事务提交前进行提交,也就是只写磁盘一次。
    • redo log:事务进行的过程中不断写入。
  • 写入方式不同。

    • bin log:追加写入,不会覆盖已经写的文件。
    • redo log:循环写入和擦除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值