脏页flush和收缩表空间

mysql脏页

  • 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功。
  • 把内存里的数据写入磁盘的过程,术语就是flush,在flush之前,实际数据和数据库中的数据是不一致的,因为在redo log基础上更新了还未写入,数据库是老的,当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为脏页,内存写入后就一致了,称为干净页
  • 如果mysql偶尔运行速度很慢,很可能是在刷脏页。引发数据库flush的过程
    1. redo log满了,系统停止所有更新操作,将checkpoint向前推进,腾出空间继续写。
    2. 系统内存不足,需要新的内存页不够用,就会淘汰一些数据页,留给别的数据页使用,如果淘汰的是脏页,就会先写到磁盘。
    3. mysql空闲的时候。
    4. 正常关闭mysql的时候
    • 在第一种情况下,redo log满了,这种情况是innodb要避免的,因为整个系统都不能再更新了,这是不能接受的
    • 第二种情况,内存满了,要先写到磁盘,innodb用缓冲池管理内存,有三种状态
      • 还没有用的内存页
      • 用了并且是干净页
      • 用了并且是脏页(淘汰的时候需要写入到磁盘)
  • 所以我们有时使用数据库会发现数据库性能突然下降,可能就是在处理脏页。
  • 刷脏页控制策略
    1. Innodb_io_capacity参数,这个参数会告诉innodb你的磁盘io能力。(有公式计算)
    2. innodb刷盘主要两个因素:脏页比例和redo log的写盘速度
      • innodb_max_derty_pages_pct是脏页比例上限,默认是75%,调整好Innodb_io_capacity参数值,使脏页比例不要超过75%

收缩表空间

  • 场景例子:数据库占用空间太大,把最大的表删掉了一半数据,表的大小还是没有变化。
  • 数据删除流程
    • 加入要删掉R4,InnoDB引擎只会把R4这个记录标记为删除,如果之后再掺入一个ID在300-600之间的记录时,会复用这个位置,但是磁盘文件的大小并不会缩小。
    • 如果删掉了一个数据页上的所有记录,这个数据页就可以被复用。
    • 注意:数据页的复用跟记录的复用是不同的。
      • 比如R4这条记录被删除,如果插入一个ID是400的行,直接复用这个空间,但是如果插入ID是800的行,就不能复用这个位置了。
      • 但是整个数据页Page A上的所有记录删除之后,pageA标记为可复用,如果插入一条ID=50的记录需要用新的数据页的时候,PageA是可以背负用的。
      • 如果我们用delete命令把整个表数据删除,结果是所有的数据页都会标记为可复用,但是在磁盘上,文件不会变小。
  • 插入数据流程
    • 如果数据按照索引顺序插入的,索引是紧凑的,但是如果是随机插入的,就会造成索引的数据页分页。
    • 如果pageA已经满了,在插入一行数据会怎样?
      • 由于A满了,在插入一个id是550的数据时,就会申请一个新的页面pageB来保存数据,分裂完成后pageA的末尾就留下了空洞。
  • 更新索引上的值也是删除一个旧的值,再插入一个新值,也会造成空洞。
  • 收缩空间
    • 新建一个与表A相同结构的表B,按照主键ID递增的顺序,把数据一行一行的从A里读出来再插入到表B中,表B中无空洞,数据页的利用率也更高,如果我们把表B作为临时表,数据从表A导入到B中的操作完成后,用B替换A,从效果上也起到了收缩A的作用。
    • 在整个DDL过程中,表A不能有更新,所以这个DDL不是online的,在5.6之后的版本中,流程做了更改:
      1. 建立一个临时文件,扫描A中的所有数据页,
      2. 用数据页中A的记录生成B+树,存储在临时文件中
      3. 将所有对A的操作记录在一个日志文件中
      4. 临时文件生成后,将日志文件的操作应用到临时文件,得到一个逻辑数据上与表A相同的数据文件
      5. 用临时文件替换表A的数据文件
      6. 图示
    • 可以看到,与图3过程的不同之处在于,由于日志文件记录和重放操作这个功能的存在,这个方案在重建表的过程中,允许对表A做增删改操作。
    • 使用alter table A engine=InnoDB命令来重建表。在MySQL 5.5版本之前,这个命令的执行流程跟我们前面描述的差不多,区别只是这个临时表B不需要你自己创建,MySQL会自动完成转存数据、交换表名、删除旧表的操作。

原文地址:https://www.cnblogs.com/jimmyhe/p/11072355.html

时间: 2024-11-08 19:08:03

脏页flush和收缩表空间的相关文章

如何收缩表空间大小

转摘: oracle数据库表空间文件收缩实例 1.查看数据文件的使用情况 包括内容:数据文件大小,已经used空间,free空间,hwm信息 1 select /*+ ordered use_hash(a,b,c) */ 2 a.file_id,a.file_name,a.filesize, b.freesize, 3 (a.filesize-b.freesize) usedsize, 4 c.hwmsize, 5 c.hwmsize - (a.filesize-b.freesize) unse

ORACLE 11G收缩表空间报错 ORA-03297: file contains used data beyondrequested RESIZE value

测试环境磁盘空间不足,所以drop一些无用的大表,但是发现空间没有变化,df -h还是没有释放出磁盘空间来. SQL> set line 200 SQL> set pagesize 200 SQL> col name format A150 1,查看表空间使用情况 SQL> SELECTUPPER(F.TABLESPACE_NAME) "表空间名", 2 D.TOT_GROOTTE_MB "表空间大小(M)", 3 D.TOT_GROOTTE

Oracle收缩表空间

column SQLTEXT format a80 select count(*) from dba_segments where tablespace_name = 'USERS' and segment_type='TABLE';select 'alter table ' || owner || '.' || segment_name || ' move tablespace dbs_temp;' sqltext from dba_segments where tablespace_name

表空间、缓冲池

表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置.任何数据库的创建都必须显式或隐式的为其指定表空间,且数据库中的所有数据都位于表空间中. 用户可以根据硬件环境以及成本等需求,通过指定建立在不同容器上的表空间来自由选择数据的物理存储位置.同时由于备份和恢复可以在表空间级别执行,用户能够进行更多粒度的备份恢复控制. 理解表空间前先理解容器. 容器(Container) 容器是物理存储设备,可以

DB2表空间管理的两种方式

下文将为您介绍DB2(DB2认证 DB2培训 ) 的表空间按管理方式,并附上相关问题的实例,供您参考,如果您对DB2表空间按管理方式感兴趣的话,不妨一看,会对您有所帮助. DB2 的表空间按管理方式分为两种:系统管理空间(System Management Space,SMS)和数据库管理空间(Database Management Space,DMS). 按类型分为:规则表空间.长整数表空间.系统临时表空间.用户临时表空间.其中长整数表空间只能是DMS的. 规则表空间中包含用户数据的表.默认用

redis存在大量脏页问题的追查记录

case现场 线上发现一台机器内存负载很重,top后发现一个redis进程占了大量的内存,TOP内容如下: 27190 root 20 0 18.6g 18g 600 S 0.3 59.2 926:17.83 redis-server 发现redis占了18.6G的物理内存.由于redis只是用于cache一些程序数据,觉得很不可思议,执行redis的info命令,发现实际数据占用只有112M,如下: # Memory used_memory:118140384 used_memory_huma

收缩段空间

查看oracle给 对象分配的空间SQL> select segment_name,segment_type,tablespace_name,bytes/1024/1024 "MB" ,blocks from user_segments where segment_name='TEST'; SEGMENT_NAME    SEGMENT_TYPE       TABLESPACE_NAME                        MB     BLOCKS---------

MySQL系列:innodb源码分析之表空间管理

innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space.segment inode.extent和page.在实现层的逻辑使用了磁盘链表这种结构来管理逻辑关系.我们先来介绍磁盘链表. 1.磁盘链表 磁盘链表的实现fut0lst.*文件当中, innodb为了管理表空间和索引模块,定义了一个基于磁盘的链表,主要是用来保存磁盘数据结构之间的关系.这个链表不是基于内存指针的,而是基于page no和boffse

ArcSDE for Oracle表空间管理——暂时(TEMP)表空间

Oracle暂时表空间主要用来做查询和存放一些缓冲区数据.暂时表空间消耗的主要原因是须要对查询的中间结果进行排序. 重新启动数据库能够释放暂时表空间,假设不能重新启动实例,而一直保持问题sql语句的运行,temp表空间会一直增长.直到耗尽硬盘空间. 下面操作会占用大量的temporary:    1.用户运行imp/exp 导入导出操作时,会使用大量的temporary段    2.用户在Create 或者 rebuild index时    3.运行create table ...... as