最直观的物理层存储方式(/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日志的缓冲