mysql double和decimal,mysql float和double

  mysql double和decimal,mysql float和double

  目录

  问题介绍-停电一会儿-来电双写工作流恢复流程配置参数问题推荐阅读问题介绍-停电今天我要介绍一个新名词:双写。

  相信你还记得我以前写过笔记和你分享。MySQL中组织数据的基本单位是磁盘上的数据页。数据读入缓冲池后,称为缓存页。默认情况下,每个数据页的大小为16kb,数据页存储实际记录行,也称为数据行。

  mysql显示像‘innodb _ page _ size’这样的全局变量;

  - -

  变量名称值

  - -

   innodb_page_size 16384

  - -

  当一个写操作更新缓冲池中的数据页时,我们称这个改变的数据页为脏页。它需要被刷新。这时,问题就出现了。对于计算机硬件或操作系统,每个原子IO操作的吞吐量小于16KB,每个扇区的大小一般为512字节。

  #文件系统块大小:通常为4k

  ~]# getconf PAGESIZE

  4096

  ~]# fdisk -l

  Disk/dev/sda: 53.7 GB,53687091200字节,104857600扇区

  单位=1 * 512的扇区=512字节

  扇区大小(逻辑/物理):512字节/512字节

  I/O大小(最小/最佳):512字节/512字节

  磁盘类型:dos

  磁盘标识符:0x000a88ef

  设备启动开始结束块Id系统

  /dev/sda 1 * 2048 2099199 1048576 83 Linux

  /dev/sda 2 2099200 104857599 51379200 8e Linux LVM

  磁盘/开发/映射器/centos-root: 50.5GB,50457477120字节,98549760个扇区

  单位=1 * 512的扇区=512字节

  扇区大小(逻辑/物理):512字节/512字节

  I/O大小(最小/最佳):512字节/512字节

  磁盘/开发/映射器/centos-交换:2147 MB,2147483648字节,4194304个扇区

  单位=1 * 512的扇区=512字节

  扇区大小(逻辑/物理):512字节/512字节

  I/O大小(最小/最佳):512字节/512字节

  所以,当你想向磁盘写一个16K大小的数据页,刚写到4k,突然断电,机器死机。这个时候,只有一部分写成功了。这就是人们常说的:偏页写

  过了一会儿——有电话打进来,或者上面的描述说,过了一会儿,电源正常,MYSQL启动重启。这个时候MySQL就会进入崩溃恢复阶段。

  正常的故障恢复过程是:

  将数据页从磁盘读入内存,检查数据页中的LSN标记和重做日志中的LSN是否被更新。如果相同,则此时数据页中的数据是最新的。如果重做日志的LSN大于数据页中的LSN,则数据页中的数据是过时的。按重做键创建一个新数据。但现在的问题是:由于MySQL崩溃是由于断电造成的,操作系统没有来得及将数据页完整的写入磁盘,导致崩溃恢复的第一步失败,因为MySQL会检查这个数据页是不完整的数据页。

  要了解更多关于崩溃恢复,你可以阅读这篇笔记:https://mp.weixin.qq.com/s/6dQnlvjqOo6A0e_h8vST3w

  双写工作流,结合双写,看一个更新sql的执行过程。

  步骤1:如果满足更新条件的数据页已经不在缓冲池中,则执行IO操作,将其加载到磁盘中。

  步骤2:将数据页修改为脏页。

  第三步:当缓冲池的脏页需要刷新到数据文件时,不是直接写入数据文件,而是先拷贝到内存中的双写缓冲区。

  第四步:然后,将双写缓冲区写入磁盘共享表空间两次,每次写入1MB,立即调用fsync函数同步到磁盘,避免缓冲带来的问题。

  步骤5:步骤2完成后,将两次写入缓冲区写入其对应的单独数据文件。

  参见我关于fsync函数的注释:https://mp.weixin.qq.com/s/tyxd64gGa_SmR6c9vrwf1w.

  恢复的过程

  将数据页从磁盘读入内存,检查数据页是否损坏,并尝试通过双写恢复数据。如果双写的数据完整,用双缓冲的数据页替换坏的数据页。那么,双写中的数据页写坏了怎么办?

  其实无所谓,因为是先把双写数据页写入共享表空间,再把实际数据页写入每个表对应的表空间文件。如果双写中的数据页坏了,那只是说明每个表对应的表空间文件中的数据页没坏!恢复过程不会中断!

  配置参数#以查看是否启用了双写以及相关参数。

  mysql显示类似‘innodb _ double write %’的变量;

  - -

  变量名称值

  - -

   innodb_doublewrite ON

   innodb _ double write _ batch _ size 120

  - -

  集合中的2行(0.02秒)

  #查询双重写入的用法

  mysql显示类似“innodb_dblwr_%”的状态;

  - -

  变量名称值

  - -

   innodb _ dblwr _ pages _ written 14615 #从BP写入dbl wr的页数

   Innodb_dblwr_writes 636 #写入文件的次数

  - -

  集合中的2行(0.02秒)

  你一定已经知道双写解决了数据页写坏的问题。也就是说,重做日志不能重做本身已损坏的数据页。

  不过不知道大家有没有这样的疑问,重做日志也是以文件的形式存在于磁盘上的。写重做日志时断电怎么办?重做日志不也是损坏的吗?然后崩溃还原一个锤子?

  答:是这样的:事务生成的重做日志先组织成一个重做日志块。重做日志块实际上在重做日志缓冲区中。而重做日志块的大小==操作系统主原子IO的吞吐量是512字节,如下图所示:

  版权归作者所有:原创作品来自给我白日梦的博主,转载授权请联系作者,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: