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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。