表空间
本文最后更新于 48 天前,如有失效请评论区留言。

今天来学习数据在硬盘上的组织架构。

表空间idb组成

段、区、页、行

image-20260111104304835

ROW:行存储(还有列存储数据库如clickhouse),存了一行数据
Page:IO操作最小单元,page对应了一个磁盘块(16k),存放最多7992个row
extent:64个连续page组成(1M)
segment:innoDB一次最多只能申请1个段(最多4个extent,4M)
tablespace:数据段、索引段、回滚段组成 , 是硬盘上存储表的空间

硬盘与内存的交互:一次读写,通常包含一批数据的传输,提升IO效率。

表空间 tablespace

表空间:硬盘上存储表的空间,对于innodb来说就是ibd文件。

tablespace(ibdata/ibd文件)

  • 叶子节点段(真正的数据,与非叶子节点构成索引树)
  • 非叶子节点段(主要是索引构建树形结构的节点,不属于表数据)
  • 回滚段:undolog

共享表空间

mysql5.5版本后诞生的概念
mysql5.6后默认都是独立表空间
mysql5.7后新特性共享临时表空间。

特点:

  • 1、所有的表数据放入一个idb文件中,集中管理。
  • 2、可以拆分为多个共享表空间,不会导致每个表空间过大
  • 3、已经属于过去式了,了解即可

独立表空间

特点:每个表由独立的表空间管理,每个表空间下包含该表对应的数据段、索引段、回滚段。

优点:
1.每个表都有自已独立的表空间,易于区分与管理
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(除drop table操作外,表空不能自已回收)

  • 4.1 Drop table操作自动回收表空间
  • 4.2如果对于统计分析或是日值表,删除大量数据后可以通过:altertable
    TableName engine=innodb;回缩不用的空间。
  • 4.3对于lnnodb,使用turncate table也会使空间收缩
  • 4.4对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:单个表空间会持续增大,如超过100个G。

在线热迁移

通过ibd文件热迁移数据的条件:

  • 开启独立表空间
  • 表结构、行格式必须一致
  • page size 必须一致

步骤:锁原表,新表导入ibd,释放原表锁

源主机:主机A
目标主机:主机B

# 步骤1:在主机A操作
首先为t1表加读锁(只能读,不能写,目的是保证数据一致性)
然后把数据从内存导出到磁盘上。
FLUSH TABLES t1 FOR EXPORT; 

# 步骤2:在主机B操作
到主机B上,创建与原表一样的表结构
create table t1(字段1 类型,字段2 类型,...);

在主机B上关闭t1表的数据空间,删除.ibd文件
ALTER TABLE t1 DISCARD TABLESPACE;,

# 步骤3:在主机A上
将主机A上原表的t1.cfg和t1.ibd拷贝到主机B的数据目录下。
注意拷贝的ibd文件的属主属组与权限问题。
拷贝完后主机A执行UNLOCK TABLES;

# 步骤4:在主机B上
执行ALTER TABLE  t1 IMPORT TABLESPACE;就会进行恢复操作。
然后check table t1;
没问题的话,select * from t1;你会发现数据恢复了。

在线自动收缩undo空间

背景:随着数据库运行时间变长,ibdata文件越来越大,但除了数据之外,undolog也会一直存放在ibdata中(mysql8已经分离出来了)。

问题:

  • 硬盘空间越来越小,后期需要加磁盘
  • 物理备份时间越来越长,备份文件越来越大
  • undo日志暴增问题:数据量大时数据库重启很慢,轻易不要重启。

优化思路:ibdata中有没有什么数据是我们可以删除的?比如undolog

独立和回收undolog

mysql5.7开始支持独立/回收存储undo日志(默认1G自动回收)
需要在初始化数据库时指定

# 独立表空间
innodb_undo_logs = 128 # 必须>=35(前35个已经被系统使用)
innodb_undo_tablespaces = 3 # 独立表空间数量

# 回收表空间
innodb_undo_log_truncate = ON # 在线收缩
# # 触发回收的值,默认1G.为了实验方便,我们减小该值 
innodb_max_undo_log_size = 11M 
# 为了实验方便,我们增大该值 
innodb_purge_rseg_truncate_frequency = 1000

如果一开始没有独立undo日志,undo的数据组织已经固定了,后面是没办法实现自动回收的,只能在数据库初始化的时候配置在线收缩参数。

版权声明:除特殊说明,博客文章均为cuckooyang原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 | 博客订阅:RSS | 广告招租:留言板 | 博客VPS |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇