MySQL技术内幕 InnoDB存储引擎-文件
学习构成MySQL数据库和InnoDB存储引擎表的各种类型文件
-
参数文件:
当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义某种内存结构有多大等。在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取,用户只需通过命令mysql--help|grep my.cnf来寻找即可。
MySQL数据库也可以不需要参数文件,这时所有的参数值取决于编译MySQL时指定的默认值和源代码中指定参数的默认值。但是,如果MySQL实例在默认的数据库目录下找不到mysql架构,则启动同样会失败,mysql架构记录了访问该实例的权限,当找不到这个架构时,MySQL实例不能成功启动。
MySQL数据库中参数分为两类:动态参数、静态参数
- 日志文件:
□ 错误日志(error log)
□ 二进制日志(binlog)
□ 慢查询日志(slow query log)
□ 查询日志(log)
- 套接字文件:
在UNIX系统下本地连接MySQL可以采用UNIX域套接字方式,这个方式需要一个套接字(socket)文件。套接字文件可由参数socket控制。一般在/tmp目录下,名为mysql.sock:
mysql> show variables like 'socket'\G;
- pid文件:
当MySQL实例启动时,会将自己的进程ID写入一个文件中—该文件即为pid文件。该文件可有参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid:
mysql> show variables like 'pid_file'\G;
- 表结构定义文件:
MySQL插件式存储引擎的体系结构,数据的存储根据表进行,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MySQL都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义 。对于MyIsam表:还有另外两种文件,.MYD保存表数据 .MYI存储表索引。
frm用来存放视图的定义,如用户创建了一个v_a视图,那么对应地会产生一个v_a.frm文件,用来记录视图的定义,该文件是文本文件,可以使用cat进行查看。
- InnoDB存储引擎文件:
□ 表空间文件
InnoDB采用将存储的数据按表空间(tablespace)进行存放,在默认配置会有一个初始大小为10MB,名为ibdata1的文件。该文件就是默认表空间文件(tablespace file),用户可以通过参数innodb_data_file_path对其进行设置,通过多个文件组成一个表空间。同时指定属性如:
[mysqld]
innodb_data_file_path = /data1/ibdata1:2000M;/data2/ibdata2:2000M:autoextend
这里将/data1/ibdata1和/data2/ibdata2两个文件用来组成表空间,若两个文件位于不同的磁盘,磁盘的负载可能被平均,因此可以提高数据库的整体性能。同时两个文件的文件名都跟了属性,可以自动增长(autoextend)。
若设置innodb_data_file_path参数后,所以基于InnoDB存储引擎的表的数据都会记录到该共享表空间中。 若设置了innodb_file_per_table,则用户可以将每个基于InnoDB存储引擎产生一个独立表空间。独立表空间的命名规则为:表名.ibd。通过这个方式,用户不用将所有数据都存放于默认的表空间中。
mysql> show variables like 'innodb_file_per_table'\G;
*************************** 1. row ***************************
Variable_name: innodb_file_per_table
Value: ON
1 row in set (0.00 sec)
mysql> system ls -lh /usr/local/mysql/data/*
-rw-rw---- 1 mysql mysql 8.7k 9月 27 13:25 /usr/local/mysql/data/t1.frm
-rw-rw---- 1 mysql mysql 17M 9月 27 13:40 /usr/local/mysql/data/t1.idb
-rw-rw---- 1 mysql mysql 8.7k 9月 27 14:24 /usr/local/mysql/data/t2.frm
-rw-rw---- 1 mysql mysql 17M 9月 27 14:24 /usr/local/mysql/data/t2.idb
表t1和t2都是基于InnoDB存储的表,由于设置参数innodb_file_per_table=ON,因此产生了单独的.idb独立表空间文件。需要注意,这些单独的表空间文件仅存储该表的数据、索引和插入缓存BITMAP等信息,其余信息还是存放在默认的表空间中。下图显示InnoDB存储引擎对于文件的存储方式:
□ 重做日志文件
每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1.为了得到更高的可靠性,用户可以设置多个镜像日志组(mirrored log groups),将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性。在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行。InnoDB存储引擎先写重做日志文件1,当达到文件的最后时,会切换至重做日志文件2,再当重做日志文件2也被写满时,会再切换到重做日志文件1中。
下列参数影响着重做日志文件的属性:
□ innodb_log_file_size
□ innodb_log_files_in_group
□ innodb_mirrored_log_groups
□ innodb_log_group_home_dir
参数innodb_log_file_size指定每个重做日志文件的大小。在InnoDB1.2.x版本之前,重做日志文件大小不得大于等于4GB,而1.2.x版本将该限制扩大为了512GB.
参数innodb_log_files_in_group指定日志文件中重做日志文件的数量,默认为2.
参数innodb_mirrored_log_groups指定日志镜像文件组的数量,默认为1,表示只有一个日志文件组,没有镜像。
参数innodb_log_group_home_dir指定日志文件组所在的路径,默认为./
重做日志与二进制日志的区别?
1:二进制日志会记录所有与MySQL数据库相关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该存储引擎本身的事务日志。
2:记录内容不同,二进制日志文件记录的格式有STATEMENT、ROW、MIXED,其记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志。而InnoDB存储引擎的重做日志文件记录的是关于每个页(Page)的更改的物理情况。
3:写入时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,不论这时该事务多大。而在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南