• Mysql 提交Big sql的过程


    此处的big sql指的是单条sql的size 超过innodb_log_file_size,通过构造这样的测试,来分析mysql的提交过程。

    做这个分析的起因是我不是很明白,既然mysql需要将被执行的数据首先写入到redo log file,如果sql 的size 超过innodb_log_file_size的设定,会发生什么样的行为,mysql是否会拒绝这样的big sql?

    首先将答案抛出:mysql能够吃下这样的大SQL,并顺利执行。

    1 sql 提交时,mysql服务器首先通过参数max_allowed_packet检查sql的size,如果超出,则直接提示mysql go away.

    2 server从存储将需要修改的数据page load到innodb_buffer_pool(受制于innodb_buffer_pool_size)。

    3 写data page,同时写redo undo log.(undo log 负责备份未修改前的数据,redo负责备份修改后的数据)

    4 如果sql size 超过redo undo log 的buffer设定(innodb_log_buffer_size)则:redo undo log 写入磁盘文件log file,如果此时log file也满,则将部分data写入磁盘,然后清空对应的log file。(猜测)

       这样的变化可以通过参数Innodb_log_waits (show global status)观察到。

     因此,一般情况下,redo log 先于data 落盘,但是在Big sql这种提交方式下,是数据先落盘,redo log 后落盘,在这个例子中,redo log是没有任何意义的,因为它已经无法完整了(猜测)。

    5 当 commit 发生时,一般来说,mysql 会首先提交reod log 到磁盘,但是针对这样的情况,应该首先提交数据更为合理。

    一些自己的理解,肯定有不合理的地方,期待更好的解释。

    步骤:

    1 创建测试表

       big 字段类型为longblob,它的最大容量是4G.

      CREATE TABLE `tb_cobranding_test` (
        `id` int(10) unsigned DEFAULT NULL,
        `base64_content_big` longblob
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    2 修改mysql配置:

      innodb_log_file_size=5M
      innodb_log_files_in_group=2

      max_allowed_packet=512M

          修改innodb_log_file_size 前需要迁移之前的log file 文件.

    3 提交big sql:

       insert into tb_cobranding_test values (1,'此处为190M的二进制字符串');

       mysql <./big.sql

  • 相关阅读:
    一套代码小程序&Web&Native运行的探索05——snabbdom
    一套代码小程序&Web&Native运行的探索04——数据更新
    一套代码小程序&Web&Native运行的探索03——处理模板及属性
    一套代码小程序&Web&Native运行的探索02
    微信小程序开发07-列表页面怎么做
    微信小程序开发06-一个业务页面的完成
    微信小程序开发05-日历组件的实现
    微信小程序开发04-打造自己的UI库
    微信小程序开发03-这是一个组件
    30分钟ES6从陌生到熟悉
  • 原文地址:https://www.cnblogs.com/dogharry/p/4316946.html
Copyright © 2020-2023  润新知