• 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

  • 相关阅读:
    Android 3D开发相关教程
    关于交互Shell的两个小示例
    Ubuntu11.04上tftp服务的配置
    利用脚本将文字插入到图片或进行多个图片拼接
    Shell常用的一些操作集锦(如字符串截取、字符串比较以及For循环等)
    关于Vim的一点基本配置
    Linux下将连续的图片转换成视频
    HTML在线转换成PDF
    通过udp及vlc传递视频流
    《深入理解计算机系统》读书笔记 —— 第二章 信息的表示和处理
  • 原文地址:https://www.cnblogs.com/dogharry/p/4316946.html
Copyright © 2020-2023  润新知