- 35 | 生产经验:数据库服务器使用的RAID存储架构初步介绍
- 36 | 生产经验:数据库服务器上的RAID存储架构的电池充放电原理
- 37 | 案例实战:RAID锂电池充放电导致的MySQL数据库性能抖动的优化
- 38 | 案例实战:数据库无法连接故障的定位,Too many connections
- 39 | 案例实战:如何解决经典的Too many connections故障?背后原理是什么
- 40 | 重新回顾redo日志对于事务提交后,数据绝对不会丢失的意义
- 41 | 在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样
- 42 | redo log是直接一条一条写入文件的吗?非也,揭秘redo log block
- 43 | 直接强行把redo log写入磁盘?非也,揭秘redo log buffer
- 44 | redo log buffer中的缓冲日志,到底什么时候可以写入磁盘
- 45 | 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理
- 46 | 一起来看看INSRET语句的undo log回滚日志长什么样
- 47 | 简单回顾一下, MySQL运行时多个事务同时执行是什么场景
35 | 生产经验:数据库服务器使用的RAID存储架构初步介绍
1、mysql与CPU、内存、磁盘、网卡等关系
2、RAID
1)很多数据库部署在机器上的时候,存储都是搭建的RAID存储架构
2)RAID是一个磁盘冗余阵列,大致理解为用来管理机器里多块磁盘的一种磁盘阵列技术
3)RAID作用:往磁盘里读写数据的时候,会告诉你应该在哪块磁盘上读写数据
36 | 生产经验:数据库服务器上的RAID存储架构的电池充放电原理
1、RAID的缓存
RAID缓存模式设置为write back,所有写入磁盘阵列的数据,会先缓存在RAID卡的缓存里,然后后续再写入到磁盘阵列里面去,缓冲机制,可以大幅提升数据库磁盘写的性能。
2、断电造成SDRAM缓存里数据丢失,怎么解决
RAID卡里一般都配置自己独立的锂电池或者电容,一旦断电,RAID基于锂电池供电运行,会把缓存里的数据写入到阵列中的磁盘上
3、锂电池存在性能衰减,所以一般配置定时充放电
锂电池充放电过程中,RAID缓存级别会从write back变成 write through
37 | 案例实战:RAID锂电池充放电导致的MySQL数据库性能抖动的优化
1、RAID 1 : 两块磁盘为镜像关系,在两块磁盘上都有,形成了数据冗余
2、RAID10 : RAID0 + RAID 1 组合;
假设有6块磁盘组成了一个RAID10阵列,其实是每2块磁盘组成一个RAID1互为镜像的架构,一共3组RAID1;
对于每一组RAID1写入数据时,用RAID0的思路,不同组的磁盘数据是不一样的,但是同一组的数据是冗余一致的
38 | 案例实战:数据库无法连接故障的定位,Too many connections
39 | 案例实战:如何解决经典的Too many connections故障?背后原理是什么
其实就是经典的Too many connections故障,他的核心就是linux的文件句柄限制,导致了MySQL的最大连接数被限制,那么今天来讲讲怎么解决这个问题。
其实核心就是一行命令:
ulimit -HSn 65535
然后就可以用如下命令检查最大文件句柄数是否被修改了
cat /etc/security/limits.conf
cat /etc/rc.local
40 | 重新回顾redo日志对于事务提交后,数据绝对不会丢失的意义
1、回顾
1)执行增删改SQL的时候,针对一个表的某些数据去执行
2)首先找到这个表对应的表空间
3)找到表空间对应的磁盘文件
4)从磁盘文件里把你要更新的那批数据所在的数据页从磁盘读取出来
5)放到buffer pool的缓存页里去
6)更新数据都是操作的buffer pool的缓存页的数据
7)更新缓存页时,会更新free、flush、lru链表
8)有专门的后台IO线程,不定时的根据flush链表、lru链表,把更新过的缓存页刷新后磁盘文件的数据页里去
2、redo log 机制
1)只要事务提交的时候,保证修改的以日志的形式写入到redolog日志
2)mysql重启后,把之前事务更新过的修改根据redo log在buffer pool里重做一遍,就可以恢复出来当时事务对缓存页做的修改,然后找时机再把缓存页刷入磁盘文件里去
3)redo log形式记录下来做的修改,性能远超于刷新缓存页,数据库并发能力更强
41 | 在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样
1)表空间号+数据页号+偏移值+修改几个字节的值 + 具体的值
2)redo log类型:根据修改了数据页里面几个字节的值区分
举例:
MOLOG_1BYTE : 修改了1个字节的值
MOLOG_4BYTE:修改了4个字节的值
…
42 | redo log是直接一条一条写入文件的吗?非也,揭秘redo log block
1、redo log block
1)mysql内的数据结构,大致理解为 存放多个单行日志
2)一个redo log block 是 512字节,分为3个部分:
- 12字节的header块头
- 496字节的body块体
- 4字节的trailer块尾
3)header块头,分为4部分:
- block no :4字节,块的唯一编号
- data length :2字节,block里写入了多少字节数据
- first record group:2字节,每个事物都会有多个redo log,是一个redolog group,即一组redo log
;那么在这个block里第一组的redo log 的偏移量,就是这2个字节存储的
- checkpoint on :4字节
43 | 直接强行把redo log写入磁盘?非也,揭秘redo log buffer
1、redo log buffer
1)用来缓冲redo log写入的
2)在mysql启动的时候,跟操作系统申请的一块连续的内存空间,里面划分出了N多个空的redo log
2、原理
1)当写入一条redo log时,会从第一个redologblock开始写入
2)写满了一个redo log block,就会继续写入下一个redo log block,以此类推,直到所有redo log block都写满
3)把 redo log buffer里的block都写满了,会强制把redo log block刷入到磁盘中去
3、
44 | redo log buffer中的缓冲日志,到底什么时候可以写入磁盘
1、redo log block什么时机刷入到磁盘文件里去
1)写入redo log buffer的日志已经占据了redo log buffer总容量的一半,也就是超过了8MB的redo log在缓存里
2)一个事务提交的时候,必须把相关redo log 所在 redo log block都刷入到磁盘文件里去。只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log有重做日志,随时可以恢复事务的修改
3)后台线程定时刷新,有一个后台线程每隔1秒都会把redo log buffer里的block刷到磁盘里去
4)mysql关闭时,redo log block都会刷入到磁盘文件里去
情况1)不常见
情况2)常见,短暂事务提交时发生
情况3)没有别的情况触发,后台线程会不断刷新redolog到磁盘
45 | 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理
1、undo log 回滚日志
1)场景:一个事务里要执行一些增删改操作,必然是把对应的数据页从磁盘加载出来放 buffer pool缓存页,然后缓存页里执行执行一通增删改,同时记录redo log。万一事务执行了一半,回滚了?
2)undo log 回滚日志,比如做了一个insert操作,undo log里记录的必有一个主键和对应的delete操作
3)delete操作,必有insert
4)update操作,把更新前的值记录下来,重新update
5)select操作,没有在buffer pool进行操作,不需要记录 undo log
46 | 一起来看看INSRET语句的undo log回滚日志长什么样
1、insert语句 undo log类型是 TRX_UNDO_INSERT_REC
2、undo log 包含: