10.InnoDB存储引擎的体系结构

2022-03-26 分类:mysql 阅读(379) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.磁盘结构(on-disk)-表空间结构

1.表空间结构介绍

表空间的概念源于Oracle数据库。最初的目的是为了能够很好的做存储的扩容。
#共享(系统)表空间
##存储方式
ibdatai~ibdataN,5.5版本默认的表空间类型。

##ibdata1共享表空间在各个版本的变化
5.5版本:
	系统相关:(全局)数据字典信息(表基本结构信息、状态、系统参数、属性..)、UNDO回滚日志(记录撤销操作)
Double Write Buffer信息、临时表信息、change
	buffer
	用户数据:表数据行、表的索引数据

5.6版本: 共享表空间只存储于系统数据,把用户数据独立了,独立表空间管理。
	系统相关:(全局)数据字典信息、UNDO回滚信息、Double write信息、临时表信息、change buffer

5.7版本:在5.6基础上,把临时表独立出来,UNDO也可以设定为独立
	系统相关:(全局)数据字典信息、UNDO回滚信息、Double write信息、change buffer

8.0.11~8.0.19版本:
在5.7的基础上将UNDO回滚信息默认独立,数据字典不再集中存储了。
系统相关:Double Write信息、change buffer

8.0.20版本:在之前版本基础上,独立 Double Write信息
系统相关: change buffer

https: //dev.mysql.com/ doc/refman/5.7/en/innodb-architecture.html

总结:对于InnoDB表来讲,例如city表
city.ibd
city.frm
ibdata1
只是通过cp备份ibd和frm文件无法实现,数据表的恢复

2.共享表空间管理

###扩容共享表空间
mysql> select @@innodb_data_file_path;
mysql> select @@innodb_autoextend_increment;
配置文件添加一下参数
innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend
重启数据库会发现报错,查看一下日志说The innodb_system data file './ibdata1' is of a different size 4864 pages (rounded down to MB) than the 6400 pages specified in the .cnf file!
这说明设置的大小不对
正确的方法:
[root@db01 ~]# du -sh /data/3316/data/ibdata1 
76M	/data/3316/data/ibdata1
配置文件设定为和实际大小一致:
innodb_data_file_path=ibdata1:76M;ibdata2:100M;ibdata3:100M:autoextend
###模拟在初始化时设置共享表空间(生产建议)
5.7中建议:设置共享表空间2-3个,大小建议512M或者1G,最后一个定制为自动扩展。
8.0中建议:设置1个就OK,大小建议512M或者1G
#清理数据
[root@db01 ~]# systemctl stop mysql.service
[root@db01 ~]# rm -rf /data/3316/data/*
#配置文件添加参数
innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend
#初始化数据库
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir= /usr/local/mysql
#检查表空间
[root@db01 ~]# ll -h /data/test/data/ibdata*
-rw-r----- 1 mysql mysql 100M Mar 24 18:16 /data/test/data/ibdata1
-rw-r----- 1 mysql mysql 100M Mar 24 18:16 /data/test/data/ibdata2
-rw-r----- 1 mysql mysql 100M Mar 24 18:16 /data/test/data/ibdata3

3.独立表空间(数据+索引)

##介绍
5.6版本开始,针对用户数据,单独的存储管理。存储表的数据行和索引。
8.0之前  city --> city.ibd city.frm ibdata1
8.0之后  city --> city.ibd
补充:
		Myisam表 t1
				t1.frm   数据字典
				t1.myd   数据行
				t1.myi   索引
通过参数控制:
mysql> select @@innodb_file_per_table;
修改为独立表空间:
mysql> set global innodb_file_per_table=0;
##利用独立表空间进行快速数据迁移
1.锁定源端t100w表
mysql> lock tables test.t100w read;
mysql> show create table t100w;
2.目标端创建test库和t100w空表
复制上面的创建命令即可
3.单独删除空的表空间文件(保留t100w的frm,ibdata1中关于t100w的系统数据)
mysql> alter table test.t100w discard tablespace;
4.拷贝源端ibd文件到目标端目录,并设置权限
[root@db01 ~]# cp /data/3306/data/test/t100w.ibd /data/3307/data/test/
[root@db01 ~]# chown -R mysql. /data/3307/data
5.导入表空间
mysql> alter table test.t100w import tablesapce;
mysql> select count(*) from test.t100w;
6.解锁源端数据表
mysql> unlock tables;

4.undo表空间

1.作用:用来做撤销工作
2.存储位置:5.7版本,默认存储在共享表空间中(ibdataN)。8.0版本以后默认就是独立的(undo_001-undo002).
3.生产建议:5.7版本后,将undo手工进行独立
4.undo表空间管理
4.1如何查看undo的配置参数
select @@innodb_undo_tablespaces;---> 3-5个      ##打开独立undo模式,并设置undo的个数
select @@innodb_max_undo_log_size;              ##undo日志的大小,默认1G。
select @@innodb_undo_log_truncate;           ##开启undo自动回收的机制(undo_purge)
select @@innodb_purge_rseg_truncate_frequency;###触发自动回收的条件,单位是检测次数
4.2配置undo表空间
pkill mysqld
rm -rf /data/3316/data/*
vim /etc/my.cnf
#添加如下参数
innodb_undo_tablespaces=3
innodb_max_undo_log_size=128M
innodb_undo_log_truncate=ON
innodb_purge_rseg_truncate_frequency=32
重新初始化数据库生效
##如何将undo独立存储到其他目录
配置文件添加如下参数即可
innodb_undo_directory=/data/3316/undologs
ps:5.7和8.0不一样,具体参考
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html

5.临时表空间

1.作用:存储临时表
2.管理
innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:128M:autoextend:max:500M
重启生效
3.建议数据初始化之前设定好,一般2-3个,大小512M-1G

2.磁盘结构(on-disk)-InnoDB事务日志

1.redo log重做日志

1.作用:记录内存数据页的变化。实现“前进”的功能。WAL(write ahead log),MySQL保证redo优先于数据写入磁盘。
2.存储位置:数据路径下,进行轮序覆盖记录日志
ib_logfile0 48M
ib_logfile1 48M
3.管理:
3.1查询redo log文件配置
mysql> show variables like ‘%innodb_log_file%’;
3.2设置
生产建议大小:512M-4G  组数2-4组
vim /etc/my.cnf
#添加参数
innodb_log_file_size=100M
innodb_log_files_in_group=3
重启生效

3.磁盘结构(on-disk)-其他结构

# ib_buffer_pool预热文件
作用:
缓冲和缓存,用来做“热”(经常查询或修改)数据页,减少物理I0.
当关闭数据库的时候,缓冲和缓存会失效。
5.7版本中,MySQL正常关闭时,会将内存的热数据存放(流方式)至ib_buffer_pool。下次重启直接读取ib_buffer_ool加载到内存中。
mysql> select @@innodb_buffer_pool_dump_at_shutdown;
mysql> select @@innodb_buffer_pool_load_at_startup;

# Double write Buffer (DNB)(8.0.19之前默认在ibdataN中,8.0.20以后可以独立了。)
作用:
MySQL,最小IO单元page (16KB),0S中最小的IO单元是block (4KB)

为了防止出现以下问题:
mysqld process crash in the middle of a page write

4.内存结构(in-memory)

1.InnoDB BUFFER POOL(IBP)

作用:
用来缓冲、缓存,MySQL的数据页和索引页。MySQL中最大的、最重要的内存区域。管理:
查询:
mysql> select @@innodb_buffer_pool_size;默认大小:128M
生产建议:物理内存的:50-80%。
在线设置:
mysql> set global innodb_buffer_pool_size=268435456;重新登录mysql生效。
永久设置:
vim /etc/my.cnf#添加参数
innodb_buffer_pool_size=256M重启生效

2.InnoDB LOG BUFFER(ILP)

作用:用来缓冲 redo log日志信息。
管理:
查询:select @@innodb_log_buffer_size;
默认大小:16M
生产建议:和innodb_log_file_size有关,1-N倍
设置方式
vim /etc/my.cnf
innodb_log_buffer_size=33554432
重启生效

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1