MySQL高级开发(二)–物理结构介绍

标签(空格分隔): MySQL



  • MySQL高级开发二物理结构介绍
  • 结构总览
  • data目录
  • 数据库存储目录
  • 系统数据库
  • 用户数据库
  • ibdata共享表空间
  • 基于ib_logfileN的重做日志
  • logs目录
  • 基于mysql-binn的二进制日志
  • undo表空间
  • errorlog
  • slowlog


结构总览

本文,我通过Windows下的MySQL免安装版本的目录结构进行总结。如下图为免安装版本的目录结构:

mysql物理文件构成 mysql的物理结构_mysql物理文件构成

  1. bin
    bin目录包含的是MySQL的所有可执行文件
  2. data【重点】
    data目录包含mysql的系统数据库和用户数据库和一些日志文件,后面做详细讲解
  3. docs
    docs目录存储的是一些描述文档信息
  4. include
    include目录存放的是一些源码文件
  5. lib
    lib存储的是第三方类库
  6. logs【重点】
    日志存放目录
  7. share
    存储一些源码文件

在上述的简略说明中,data和logs目录在实际开发应用中比较常见,作为重点讲解。

data目录

数据库存储目录

mysql物理文件构成 mysql的物理结构_mysql物理文件构成_02


从目录结构中可以得知,系统数据库和用户自定义的数据库存储在同一个路径下。展开之后,每个数据库为一个文件夹,文件夹下面根据存储引擎的不同,是对应的每个数据库自己的对象。

系统数据库

在MySQL5.7.18中,系统数据库包括:information_schema,mysql,sys,performanace_schema
1.information_schema库,提供了数据库的源数据信息,是数据库的数据,比如数据库的名字,数据库中的表名,字段名,字段类型等。可以说是数据库的数据字典信息。
这个库中的信息并非物理地保存在表中,而是动态地去读取其他文件得到的。
2.performanace_schema库,数据库性能相关的信息的数据,记录的是数据库服务器的性能参数。
2.1 保留进程等待信息,包含锁,互斥变量,文件信息等
2.2 保存历史事件汇总信息,为MySQL服务器性能评估提供参考信息
2.3 配置型选项,来决定是否记录一些与性能相关的信息,比如profile信息,
3.sys库,可以根据sys库中的数据快速了解系统的运行信息,方便地查询出来数据库的信息,在性能瓶颈,自动化运维等方面都有很大的帮助
sys库中的信息是通过视图的方式,将information_schema和performance_schema库中的数据结合起来,可以得到更加直观和容易理解的信息
4.mysql库,存储了系统的用户权限信息及帮助信息,新建的用户,用户的权限信息都存储在MySQL库。比如在修改MySQL的root密码的时候,都要先use mysql这个系统库,然后再执行用户,授权等操作。

用户数据库

用户自定义数据库实际上是一个目录,目录中保存了数据库中的表以及数据信息,,如下截图是一个典型的数据库目录下的文件信息。
  对于innodb引擎的表,一个表分别对应两个文件,一个是.frm,存储的是表结构信息,一个是.ibd,存储的是表中的数据,从大小也可以看出来.ibd较大而.frm较小。
  另外一个文件是db.opt,保存的是数据库的配置信息,比如编码信息等。
  对于innodb表,如果是独立的表空间的话,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间中ibdata1文件中)
  但是数据中的其他对象,包括undo信息,也即数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的ibdata1文件中

  tb_card对应的数据库物理文件

 

mysql物理文件构成 mysql的物理结构_数据库_03

ibdata共享表空间

对于innodb,innodb_file_per_table选项决定了是否启动独立表空间,MySQL5.7中是默认启动的,也就是说MySQL的用户数据库将使用独立表空间来存储数据。

mysql物理文件构成 mysql的物理结构_MySQL_04

基于ib_logfileN的重做日志

redo日志默认情况下有两个文件,也即:ib_logfile0和ib_logfile1,如果在数据库启动的过程中没有这两个文件,系统会默认自动生成这两个文件。

  默认情况下,ib_logfile0和ib_logfile1是两个独立的日志文件(可以配置的更多个ib_logfile文件),但是redo日志的写入在逻辑上对于ib_logfile0和ib_logfile1是连续的。

  重做日志是MySQL事物处理的核心文件,事务处理的核心之一是一致性,也就是说要么全做,要么全不做。

  事物性操作都是基于一个或者多个表中部分数据的操作,为了保证一致性,在确保事物的一致性的时候,需要事物提交的时候直接或者间接写盘操作。

  MySQL事物操作是logwrite-ahead操作,也即先写日志(具体怎么写日志取决于innodb_flush_log_at_trx_commit的配置),相当于间接写盘操作。

  目的是将对数据库具体的数据文件的分散随机写入(多个表的数据写入数据文件)转换成基于日志的顺序写入操作,而数据文件是异步写盘,

  如果数据文件写盘异常,可以通过redo日志来“重做”,据此来提高事物性操作的效率。

  redo日志空间的使用,在逻辑上相当于一个环形空间,redo日志不断向前推进写入记录,后台的定时执行的checkpoint将事务修改过尚未写盘的记录异步写入数据文件之后,日志空间可重用。

  

mysql物理文件构成 mysql的物理结构_数据库_05


  

logs目录

基于mysql-bin.n的二进制日志

bin-log日志记录数据中发生的写入性操作(增删改),但不记录查询操作,语句以事件的方式保存,描述了数据的更改过程,此日志对发生灾难时数据恢复起到了极为重要的作用。

undo表空间

MySQL将undo日志记录在共享表空间中(上文提到的bdata1共享文件),如果事物成功提交,记录在共享表空间的undo日志会被后台进程做puege清理

errorlog

error_log.log,记录启动、运行或停止MySQL服务器过程,以及MySQL运行过程中一些较为严重的错误信息

slowlog

MySQL服务中尚未配置慢查询日志,如果配置了MySQL的慢查询日志,MySQL会将运行过程中的慢查询日志记录到slow_log文件中