207_mysql_innodb_5_Innodb_redo1
一 事物 把保障 ACID 的一个或者多个对数据库的操作 成为事物
- Atomicity(原子性) 要么全做-成功,要么全部做-回滚的规则
- Consistency(一致性) 事务将数据库从一种状态转变为另一种一致的状态 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
- Isolation(隔离性) 事务的隔离性要求每个读写事务的对象与其他事务的操作对象能相互隔离,即该事务提交前对其他事务都不可见。
- Durability(持久性)事务一旦提交,其结果就是永久性的,即使发生宕机等故障,数据库也能将数据恢复。
事物的几个状态
1 活动的(active) 事物执行中
2 部分提交(partially committed) 由于操作在内存, 事物已经在内存中完成, 但并未刷盘的情况
3 失败(failed) 事物由于遇到意外情况停止运行的情况
4 终止(aborted)事物执行了一半而变为失败状态,发生了回滚,回到了事物初始状态, 说这个事物处于终止状态
5 提交的(commited) 事物的修改都落盘后,该事物处于提交状态
事物语法
Begin/START TRANSACTION
START TRANSACTION READ ONLY / READ WRITE, WITH CONSISTENT SNAPSHOT
WITH CONSISTENT SNAPSHOT 启动一致性读
COMMIT / ROLLBACK
自动提交
show variables like "%autocommit%"
SET autocommit = OFF
隐式提交
1 DDL 会自动提交, CREATE, ALTER, DROP
2 隐式使用或修改数据库中的表 ALTER USE, CREATE USER, DROP USER, GRANT, RENAME USER,REVOKE, SET PASSWORD 等
3 使用嵌套事物会触发第一个事物提交
4 LOCK TABLES
5 加载数据语句 LOAD DATA 向数据库中批量导入数据
6 复制相关 START / STOP / RESET SLAVE CHANGE MASTER TO
7 其它: ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH , LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE ,RESET 等
保存点
SAVEPOINT 保存点名字
Save point alex
Rollback to alex
二 Redo 概述
DML(8.0+ DDL)操作导致的页面变化,均需要记录Redo日志;
聚簇索引/二级索引/Undo页面修改,均需要记录Redo日志 WAL(write ahead log),MySQL保证redo优先于数据写入磁盘
show variables like '%innodb_log_file%';
ib_logfile0 48M
ib_logfile1 48M
vim /etc/my.cnf # 添加参数:
innodb_log_file_size=500M #生产建议大小: 512M-4G 组数: 2-4组
innodb_log_files_in_group=3
LSN(日志序列号)
LSN(log sequence number)日志序列号,5.6.3之后占用8字节,LSN主要用于发生crash时对数据进行recovery,LSN是一个一直递增的整型数字,表示事务写入到日志的字节总量。
LSN不仅只存在于重做日志中,在每个数据页头部也会有对应的LSN号,该LSN记录当前页最后一次修改的LSN号,用于在recovery时对比重做日志LSN号 决定是否对该页进行恢复数据。
checkpoint也是有LSN号记录的,LSN号串联起一个事务开始到恢复的过程
show engine innodb status\G
Log sequence number 2687274848548
Log flushed up to 2687274848516
Pages flushed up to 2687273963960
Last checkpoint at 2687273963960
#简单说明:
Log sequence number: 当前系统最大的LSN号
log flushed up to:当前已经写入redo日志文件的LSN
pages flushed up to:已经将更改写入脏页的lsn号
Last checkpoint at就是系统最后一次刷新buffer pool脏中页数据到磁盘的checkpoint_lsn
#以上4个LSN是递减的: LSN1>=LSN2>=LSN3>=LSN4.
checkpoint
- sharp checkpoint
完全检查点,数据库正常干净关闭时,会触发把所有的脏页都写入到磁盘上(这时候logfile的日志就没用了,脏页已经写到磁盘上了)
- fuzzy checkpoint:模糊检查点,部分页写入磁盘 下面四种情况
1 master thread checkpoint
master thread 差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘,这个过程是异步的,不会阻塞用户查询。
show variables like '%io_cap%'; #PCI-E 2000-3000 4000-6000; flash 5000-8000 10000-16000
2 flush_lru_list checkpoint
show variables like '%lru%depth'; #空闲数据页低于1024个
3 async/sync flush checkpoint
log file快满了,会批量的触发数据页回写,这个事件触发的时候又分为异步和同步,不可被覆盖的redolog占log file的比值:75%--->异步、90%--->同步
指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。
若将已经写入到重做日志的LSN记为redo_lsn,将已经刷新回磁盘最新页的LSN记为checkpoint_lsn,则可定义:checkpoint_age = redo_lsn - checkpoint_lsn (redo日志占用大小)
再定义以下的变量:
async_water_mark = 75% * total_redo_log_file_size
sync_water_mark = 90% * total_redo_log_file_size
若每个重做日志文件的大小为1GB,并且定义了两个重做日志文件,则重做日志文件的总大小为2GB。那么async_water_mark=1.5GB,sync_water_mark=1.8GB。
则:
1 checkpoint_age < async_water_mark时,不需要刷新任何脏页到磁盘;
2 async_water_mark<checkpoint_age<sync_water_mark时触发Async Flush,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark;
3 checkpoint_age>sync_water_mark这种情况一般很少发生,除非设置的重做日志文件太小,并且在进行类似LOAD DATA的BULK INSERT操作。
此时触发Sync Flush操作,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark。
4 dirty page too much checkpoint
脏页太多检查点,为了保证buffer pool的空间可用性的一个检查点
show global status like 'Innodb_buffer_pool_pages%t%';
show global status like '%wait_free';
1、Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total:表示脏页在buffer 的占比
2、Innodb_buffer_pool_wait_free:如果>0,说明出现性能负载,buffer pool中没有干净可用块
2、脏页控制参数
show variables like '%dirty%pct%';
1、默认是脏页占比75%的时候,就会触发刷盘,将脏页写入磁盘,腾出内存空间。建议不调,调太低的话,io压力就会很大,但是崩溃恢复就很快;
2、lwm:low water mark低水位线,刷盘到该低水位线就不写脏页了,0也就是不限制。
- 点赞
- 收藏
- 关注作者
评论(0)