数据库运维
记录DBA学习成长历程

MySQL的InnoDB存储引擎物理存储结构

最直观的物理层存储方式(/data/mysql)

1.MyISAM:
myt.frm:数据字典信息(列的定义和属性)
my.MYD:数据行
myt.myi:索引
2.Innodb:
city.frm:存储表的列信息
city.ibd(独立表空间文件):表的数据行和索引
ibdata1(共享表空间文件):系统数据字典信息(数据库启动后的所有元数据统计信息),UNDO表空间等数据(每次64M形式增长,
存储在共享表空间中,回滚日志 )double write 磁盘区域,change buffer磁盘区域。
ib_logfile0~ib_logfileN: REDO log日志文件,事务重做日志 文件。
ibtmp1: 临时表空间磁盘位置,存储临时表,缓存区不够用时为替补,用于临时存储排序,分组,多表链接,子查询,逻辑备份 ,
join union操作产生临时数据
ib.buffer_pool:正常关库的时候,存储缓冲区的热数据,好处是提升加载速度。
所以innodb表,仅仅拷贝idb和frm文件到新的数据库,是无法正常使用的。

物理层的逻辑层-表空间

引入于oracle数据库,起初是为了解决存储空间扩展的问题,mysql5.5之后引入、
数据库到存储层之间存储的一个耦合度,类似/data和sda之间的lvm层。

MySQL表空间种类

共享表空间:在5.5版本引入共享表空间功能(ibdata1).作为默认存储方式,用来存储系统数据,日志,undo,临时表,用户数据和索引。
独立表空间:5.6版本默认独立表空间模式,单表单表空间功能,进行独立存储。
普通表空间:5.7版本自定义表空间,完全和oracle一致的表空间管理模式。
undo表空间:存储undo logs (回滚日志)
临时表空间:存储临时表,与共享表功能类似,5.7版本默认独立出来了。

表空间管理

用户数据默认的存储方式为独立表空间模式,独立表空间和共享表空间可以互相切换。
独立表空间主要存储的是用户数据,存储特点为一个表一个ibd文件,存储数据行和索引信息,基本表结构信息元数据存储是xxx.frm
mysql表数据 =(ibdataX+frm)【元数据】+ibd(段、区、页)【真实数据】 
不同版本idbdata1存储的数据不一样, 
5.5:ibdata1中存储临时表数据+用户数据(数据行+索引) 
5.6:ibdata1中会存储临时表数据,要保证和frm中的数据字典统一。 
8.0:idbdata1取消存储数据字典信息,undo独立。 
具体变化参考官方文档: https://dev.mysql.com/doc/refman/5.6/en/innodb-architecture.html 
https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html 
https://dev.mysql.com/doc/refman/5.8/en/innodb-architecture.html
1.查看默认表空间模式?
db01 [(none)]>select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
|                       1 |
+-------------------------+
(1代表独立表空间,0代表共享表空间模式)
2.切换表空间(5.5版本时更改为独立表空间)
临时:
set global innodb_file_per_table=0; 
永久:
vim /etc/my.cnf
innodb_file_per_table=0;
重新登录会话
说明:修改完成之后,只影响新创建的表。
3.扩展共享表空间大小和个数
db01 [(none)]>select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend  |
+-------------------------+
方法1:初始化数据之前设置到参数文件my.cnf中
innodb_data_file_path=ibdata1:1G:ibdata2:1G:autoextend
方法2:
db01 [(none)]>select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend |
+-------------------------+
db01 [(none)]>show variables like '%extend%';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64    |
+-----------------------------+-------+
在设置innodb_data_file_path参数时,已有的ibdate1文件大小应该和磁盘上真实大小一致,而不是随便指定的
正确的调整方式
innodb_data_file_path=ibdata1:76M:ibdata2:1G:ibdata3:1G:autoextend
扩展:查看报错信息
[root@db01 ~]# ll /data/mysql/data/db01.err
alter table city dicard tablespace; 删除city表的ibd独立表空间 
alter table city import tablespace; 导入city表的ibd独立表空间

事务日志

redo log 重做日志

文件位置:ib_logfile0~ib_logfileN
控制参数:
db01 [(none)]>show variables like '%innodb_log%';
| innodb_log_file_size        | 50331648 |  #设置文件大小
| innodb_log_files_in_group   | 2        |  #设置文件个数
| innodb_log_group_home_dir   | ./  #设置文件位置
功能:
用来记录MySQL在做修改类操作(DML)操作时的数据页变化及版本号LSN,属于物理日志。默认两个文件,循环使用。

undo 回滚日志

文件位置:(5.7默认位置)
ibdataN
ibtmp1 
db01 [(none)]>show variables like '%segments%';回滚段个数默认128
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_rollback_segments | 128   |
+--------------------------+-------+
功能:
用来存储回滚日志,记录每次操作的反操作,属于逻辑日志。
提供InnoDB多版本读写。对于每个操作开启一个版本快照,提供回滚功能。

内存

数据内存区域

分为共享内存区域和会话内存区域。
共享内存缓冲区:
InnoDB_buffer_pool缓冲区池
默认参数:select @@InnoDB_buffer_pool_size;
db01 [(none)]>select @@InnoDB_buffer_pool_size;
+---------------------------+
| @@InnoDB_buffer_pool_size |
+---------------------------+
|                 134217728 |
+---------------------------+
功能:缓存表空间的数据页和索引页进行增删改等,默认128M。
会话内存缓存区:
db01 [(none)]>show variables like '%buffer%'; 
| join_buffer_size                    | 262144         |
| key_buffer_size                     | 8388608        |
| read_buffer_size                    | 131072         |
| read_rnd_buffer_size                | 262144         |
| sort_buffer_size                    | 262144

日志

| innodb_buffer_pool_size | 134217728 |
负责redo日志的缓冲
赞(1)
MySQL学习笔记 » MySQL的InnoDB存储引擎物理存储结构