深入mysql的innodb存储引擎之文件结构
文件分类
-
参数文件:在mysql启动时,指定初始化的一些参数文件,例如初始化某些结构的大小。 -
日志文件:记录mysql执行sql操作的日志存储的文件。如:错误日志、慢查询日志文件、查询日志文件、二进制日志文件等 -
socket文件:主要是UNIX环境是连接本地的mysql需要使用socket文件。 -
pid文件:mysql实例进程ID存储的文件。 -
mysql表结构文件:定义mysql表结构的文件。 -
存储引擎文件:主要用来存储mysql的表数据和索引的文件。
参数文件
我的
my.cnf
的文件路径是
/etc/my.cnf
,然后cat一下:这里便是记录了数据文件的路径、socket文件所在的路径、log日志所在的文件路径、以及mysql实例进程pid存储的路径。
参数类型
autocommit
,事务等级参数,直接
set autocommit=0
。对于静态参数,例如我们上面看到的
my.cnf
文件中的
datadir
数据文件路径就是静态参数,修改静态参数会直接报错。
(global)
还是还是会话
(session)
两类,可以通过
set @@global|@@session.动态参数=某值
,来改变参数。例如:
set @@global.read_buffer_size=1048567
日志文件
-
错误日志:对于数据库执行某些操作失败,记录的错误日志记录,以及,某些操作的警告也会记录在这里。 -
二进制日志:记录对mysql数据库更改的所有操作,但是不包含select、show操作,因为这两类并没有对数据库进行修改操作。 -
慢查询日志:对于达到mysql自定义慢查询范围的sql语句,就会记录在这个日志中,对于检测那些sql查询耗时是比较有用的。 -
查询日志:对于mysql的所有的查询记录都会记录在这个日志文件中。
错误日志文件
my.cnf
文件中可以找到错误日志日志文件的路径位置,另一个可以通通过以下命令进行查找:该文件记录着错误信息,我们可以借助该文件很好的发现问题。当数据库不能重启的时候,通过查找该错误日志文件可以帮助我们解决问题。
慢查询日志
SET long_query_time=1
将该值设置为1秒,但是默认慢查询的日志记录功能是关闭的。如下图所示:通过命令
SET GLOBAL slow_query_log=ON
将该功能开启,最后做一个测试执行sql:
select sleep(10);
然后来到mysql的datadir目录下就会有该慢查询文件
执行cat + 改文件名,就可以看到该sql执行的时间,以及执行慢的sql语句:
另外通过设置
log_queries_not_using_indexes
参数,也可以将没有使用索引的sql记录收到该文件中。
查询日志
二进制日志
select
、
show
这类,因为这类没有对数据库进行修改,若是想记录select和show操作,只能使用查询日志。
-
恢复:某些数据的恢复需要二进制文件。 -
复制:同另一台远程的mysql进行数据的同步。 -
审计:用于判断对数据库是否有进行注入攻击。
datadir
目录下,如下图所示:二进制文件默认是没有启动的,我们需要手动的设置参数来启动它。但是启动二进制文件对数据库的整体性能会下降。但是对于数据库某一时刻宕机,对于数据的恢复是非常有用的。
show variables like 'log_bin';
,若是没有开启也可以通过set命令将该值设置为
on
,查看当前的日志
show master status;
,该日志文件的存放位置也是在
datadir
目录下socket文件以及pid文件
my,cnf
文件,这里就不进行深入了解。
表结构定义文件和存储引擎文件
表结构定义文件和表空间
*.frm
文件是所有mysql数据库都有的文件,记录了该表的表结构定义。InnoDB 中用于存储数据的文件总共有两个部分,一是系统表空间文件,包括
ibdata1
、
ibdata2
等文件,其中存储了 InnoDB 系统信息和用户数据库表数据和索引,是所有表公用的,另一个是
.idb
文件,是每张表独有的。如下图所示:innodb_file_per_table
选项时,
.ibd
文件就是每一个表独有的表空间,文件存储了当前表的 数据,索引数据和插入缓冲等信息。查看和设置
innodb_file_per_table
配置
show variables like '%per_table%';
set global innodb_file_per_table =ON;
重做日志文件
datadir
下会有
ib_logfile0
和
ib_logfile1
两个文件,这两个文件就是重做日志文件。重做日志文件的记录对于数据库的ACID事务中的 C(一致性) 提供了保障。每个innodb存储引擎中至少会有两个重做日志文件。
ib_logfile0
文件写满的时候,就会切换到
ib_logfile1
日志文件。
-
二进制文件是记录所有和mysql数据库有关的日志文件,记录的范围比重做日志文件要广。 -
二进制文件仅在事务提交的时候刷入磁盘。而在事务进行中就会不断的将重做日志写入到磁盘中,
(master thread)
,每秒会将重做日志刷入磁盘中。
近期精彩内容推荐:
在看点这里好文分享给更多人↓↓