innodb 数据库中的脏页数据是怎么产生的
发布网友
发布时间:2022-04-29 04:59
我来回答
共2个回答
热心网友
时间:2022-04-08 02:30
由于等待和 Buffer Pool 的各种 latch 相关,而且 delete 操作本身会产生大量脏数据,那会不会跟刷脏页操作相关呢?我们看下 SQL 被 kill 的量和刷脏页的量之间的关系。
发现每秒刷脏页的量和 SQL 被 kill 的量的曲线有点相近,看着刷脏页的量挺大的,但是每秒 delete 的 TPS 又不是很高,为啥这么低的 TPS 会让刷脏页频率抖动以及 SQL 执行变慢呢?曾经换过不同批次的机器,发现问题依旧,并没有改善,说明并不是机器本身的问题。继续浏览 buffer pool 相关的监控指标,像是发现新*一样的发现了一个异常指标脏页比例达到了快 90% !!!太吓人了!!!为啥脏页比例会达到 90% 呢,无非就是刷脏页的速度跟不上产生的速度,要么就是 IO 能力不行,要么就是产生脏页的速度过快,要么就是内存池太小,导致 Buffer Pool 被脏页占满。那么这个脏页比例达到快 90% 会有什么问题呢?
innodb_max_dirty_pages_pct_lwm 表示的是当脏页比例达到该参数表示的低水位时候,刷脏线程就开始预刷脏来控制脏页比例,避免达到innodb_max_dirty_pages_pct 。刷脏页的最大 IO 能力是受 innodb_io_capacity 和 innodb_io_capacity_max 控制。生产上我们将 innodb_max_dirty_pages_pct_lwm 设置成了50当脏页比例大于 innodb_max_dirty_pages_pct 时候,InnoDB 会进行非常激烈的刷脏页操作,但是由于 DELETE 操作还是在进行,脏页产生的速度还是非常快,刷脏页的速度还是跟不上脏页产生的速度。为了避免脏页比例进一步扩大,更新将会被堵塞,从而导致 DELETE 执行变慢,直至被 KILL。发现问题之后,根据我们之前的假设,有三种解决方案:1. 调大 io_capacity ,但是由于主机是多实例部署,IO 占用已经比较高,PASS。2. 降低脏页产生速度,也就是调低 DELETE 速度,因为数据产生的速度很快,为了避免删除跟不上插入的速度,也被 PASS。3. 调大 Buffer Pool,可以容纳更多的脏页。说干就干,得益于 MySQL 5.7 的在线调整 Buffer Pool,立马将 Buffer Pool Size 扩了一倍,效果非常显著。
脏页比例立马下降,被 kill 的 SQL 也下降了。平均 SQL rt 下降很多。
总结
得益于 MySQL 的开源,很多错误都可以直接确认到对应的代码,大致定位到问题发生的地方,给问题排查带来了很多方便。同时对 MySQL buffer pool 的命中率以及脏页比例也要多多关注,对 SQL 的性能都有很大的影响。
热心网友
时间:2022-04-08 03:48
1. 建立InnoDB数据库:
运行环境:RHEL4U5 + mysql5.0
默认情况下mysql自动安装InnoDB数据引擎,InnoDB的数据库文件和日志文件在默认的数据库数据库目录(/var/lib/mysql 或者/usr/local/mysql/var),现在由于我们要重新建立InnoDB数据库,所以将原来的InnoDB数据库备份好后,删除即可,建立InnoDB数据库的操作步骤:
默认的数据库数据目录:/var/lib/mysql
1) shell> service mysqld stop # 停止mysql进程
2) shell> mv /var/lib/mysql/ib* /var/lib/mysql/InnoDB-old # 备份好原来的InnoDB的数据库文件
3) shell> mkdir /var/lib/mysql/InnoDB #建立存放新InnoDB数据库文件的目录,默认不自动创建目录
4) shell> vi /etc/my.cnf #编辑InnoDB数据库的相关的配置选项
[mysqld]
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /var/lib/mysql/InnoDB/ #innodb数据库数据文件目录
innodb_data_file_path = ibdata2:100M:autoextend:max:2000M #数据文件名称及大小
innodb_log_group_home_dir = /var/lib/mysql/InnoDB/
innodb_log_arch_dir = /var/lib/mysql/InnoDB/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M #缓冲池的大小,一般设置为主存的50%-80%
innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M #日志文件的大小,一般设置为主存的25%
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1 #事务
innodb_lock_wait_timeout = 50
5) shell> chown mysql:mysql /var/lib/mysql/InnoDB/ #设置InnoDB数据库目录的权限,否则无法启动mysql
6) shell> service mysqld start # 启动mysqld进程
这时在/var/lib/mysql/InnoDB 目录中应该可以看到新生成的InnoDB文件,那么InnoDB数据库就生成了。
2. 使用InnoDB数据库:
1)在配置文件中的[mysqld]字段添加 default-storage-engine=INNODB ,将默认的数据库引擎修改为InnoDB
2} 在创建表的时候,手动指定表的类型:
CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB
注意:修改mysql配置文件需要重启启动mysqld进程
innodb 数据库中的脏页数据是怎么产生的
刷脏页的最大 IO 能力是受 innodb_io_capacity 和 innodb_io_capacity_max 控制。生产上我们将 innodb_max_dirty_pages_pct_lwm 设置成了50当脏页比例大于 innodb_max_dirty_pages_pct 时候,InnoDB 会进行非常激烈的刷脏页操作,但是由于 DELETE 操作还是在进行,脏页产生的速度还是非常快,刷脏页的...
ZESTRON表界面分析
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸等关键领域,还通过高精度仪器如固体表面Zeta电位分析仪等,确保数据准确可靠。这些分析手段对于优化产品配方、改进生产工艺、预防失效问题等具有重要意义,是我们不断提升产品性能与质量的重要工具。表面污染分析包括评估表面上存在的颗粒、残留物或物质。通过利用显微镜、光谱学和色谱法等技术,分析人员可以识别和表征污染物,以确定其成分和来源。这种分析在电子、制药和制造等各个行业中至关重要,以确保产品质量、性能和安全性。了解表面...
MySQL:脏页刷盘
InnoDB在处理更新语句时,先写内存再写redo log,并不会立即将数据页的更新落地到磁盘(WAL机制),这就会产生升内存数据页和磁盘数据页的数据不一致的情况,这种数据不一致的数据页称为 脏页 ,当脏页写入到磁盘(这个操作称为flush)后,数据一致后称为干净页。第3种是系统空闲不会有性能问题,第4...
MySQLInnoDB四个事务级别与脏读、不重复读、幻读是什么
脏页是内存的缓冲池中已经修改的page,未及时flush到硬盘,但已经写到redo log中。读取和修改缓冲池的page很正常,可以提高效率,flush即可同步。脏数据是指事务对缓冲池中的行记录record进行了修改,但是还没提交!!!,如果这时读取缓冲池中未提交的行数据就叫脏读,违反了事务的隔离性。脏读就是指当一个事务正在访问数据...
MySQL的WAL(Write-Ahead Logging)机制
MySQL 中有一个机制,刷脏页的时候如果数据页旁边的数据页也是脏页,那么就会一起刷掉,而且这个逻辑是可以蔓延的,所以对于每个相邻的数据页,都会被一起刷。在 InnoDB 中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷...
MySQL字符串索引&脏页刷盘
内存中的数据被写入磁盘以后,内容变为一致,此时该内存页就被称为干净页。什么叫刷脏页?内存数据页中的内容被写入磁盘数据页中的过程称为刷脏页。什么时候会刷脏页?InnoDB如何控制刷脏页的频率?首先确认InnoDB所在主机的IO能力,此时需要用到数据库的innodb_io_capacity参数,该参数推荐设置为磁盘的IOPS...
SQL Server中所说的“脏页”是什么意思
一、Checkpoint(检查点)Checkpoint会搜索整个data cache,将脏页回写到硬盘。以下情况通常会触发checkpoint:1、运行Checkpoint 命令。2、使用alter database往数据库中添加了文件,或者从数据库中删除了文件。3、备份数据库。在数据库备份之前,数据库引擎会自动执行检查点,以便在备份中包含对数据库数据页面...
InnoDB引擎之-两次写(Double Write)
如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从double write buffer中进行数据恢复了。 当一系列机制(main函数触发、checkpoint等)触发数据缓冲池中的脏页进行刷新到data file的时候,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的double write buffer,之后通过doub...
InnoDB的一次更新事务是怎么实现的
此时,缓冲池中的数据被标记为”脏页”,表示与磁盘上的数据不一致。4. 写入Redo Log:为了保证事务的持久性,InnoDB在Buffer Pool中记录修改操作的同时,InnoDB会先将更新操作写入Redo Log(重做日志)。Redo Log是一种物理日志,记录了事务对数据库的修改操作。通过Redo Log,即使系统发生故障,也可以...
Mysql数据库InnoDB缓冲池(Buffer Pool)
尽管会突然增加类似备份或报表类的活动,但依然可以将频繁访问的数据保存在内存中。预期不久将需要某些数据页,则可以控制InnoDB将数据页预先异步读入缓冲池的时间和方式。可以控制后台进程何时将脏页刷出到磁盘,以及InnoDB是否基于工作负载动态调整刷出脏页的频率。可以配置InnoDB保留当前的缓冲池状态,以避免...
面试官:说说MySQL中的redo与undo
Redo Log 作用**:记录尚未完成的操作,当数据库崩溃时,利用redo log进行重做。组成**:Redo log由两部分组成,但具体内容略。工作流程**:InnoDB采用Write Ahead Log策略,即先写日志,再写入磁盘。当记录更新时,redo流程包括:在内存更新数据后,将更新后的记录写入redo log buffer,然后持久化到...