前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL学习笔记(二)物理文件层的实现

MySQL学习笔记(二)物理文件层的实现

原创
作者头像
scarlett学习手册
修改2020-01-17 12:11:51
7520
修改2020-01-17 12:11:51
举报
文章被收录于专栏:云学习笔记

在上一章我们了解到,物理文件层在MySQL架构位于最底层,将数据库的数据存储在文件系统上,并完成与存储引擎的交互。存储数据包括日志文件,数据文件,配置文件等。本章将介绍linux环境下MySQL的各类文件。

MySQL体系架构图
MySQL体系架构图

配置文件

启动一个数据库实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。如果没有配置文件,MySQL会按照编译时的默认参数设置实例。执行以下命令可以查看,当MySQL数据库实例启动时,它会从哪些位置查找配置文件。

代码语言:shell
复制
./bin/mysql --help | grep my.cnf
查看MySQL配置文件路径
查看MySQL配置文件路径

可以看到,MySQL是按照 /etc/my.cnf—>/etc/mysql/my.cnf—>/usr/etc/my.cnf—> ~/.my.cnf 的顺序依次读取配置文件的,如果不同文件中同一参数有冲突,将会以最后一个读取的为准。Linux环境下,配置文件一般放在/etc/my.cnf下;Windows环境下,配置文件的后缀名可以是.cnf,也可能是 .ini。

运行cat /etc/my.cnf 命令,来看配置文件中具体有哪些内容。可以见到文件中分了不同的组,每组保存不同用途的参数信息。

查看配置文件
查看配置文件

[mysqld]组

指定mysql服务器启动时,读取的初始化参数信息。

datadir指定了MySQL的数据目录,即数据文件存放的路径。

socket指定socket文件路径。socket文件是Unix/Linux环境下独有的一个文件,当MySQL客户端和数据库实例在同一台服务器上时,可以使用此文件用Unix套接字的形式来连接实例,命令如下:

代码语言:shell
复制
mysql -uroot -S /var/lib/mysql/mysql.sock
使用socket连接本地MySQL实例
使用socket连接本地MySQL实例

[mysqld_safe]组

mysqld_safe是在Unix上启动mysqld服务器的推荐方法,增加了一些安全特性,例如在发生错误时重新启动服务器,并将运行时信息记录到错误日志等。这里指定mysqld_safe服务启动时的初始化参数。

log-error指定错误日志的保存路径;

pid-file指定pid文件的保存路径。pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程ID。

[client]组

指定mysql客户端连接mysql服务器时,读取的初始化参数信息。

数据文件

数据文件包括MySQL在运行过程中产生的所有数据,数据保存的目录称为数据目录。在配置文件my.conf中可以获取到这个路径,同样也可以登录MySQL查看datadir系统变量的值来获取该路径。

代码语言:sql
复制
show variables like 'datadir';
查看数据目录所在路径
查看数据目录所在路径

数据目录具体存放了哪些内容?首先来看一个建库语句。当我们启动MySQL实例,使用CREATE DATABASE <数据库名>语句创建一个新的数据库,MySQL会在数据目录下创建一个和数据库名同名的子目录(文件夹),并在这个子目录下创建一个名为db.opt的文件,包含了新建库的各种配置属性。也就是说,每个数据库都对应数据目录下的一个子目录。

查看数据库列表
查看数据库列表

现在查看一下我在本地建立了哪些数据库。其中demo和scarlett都是自建库,其他三个为MySQL自建库。再来看对应数据目录的内容。除了information_schema这个特殊的系统数据库外,其他数据库都拥有自己的子目录。

查看数据目录
查看数据目录

再来看新建表时文件系统层面的变化。每个表实质包含2部分内容:表结构的定义,和表数据。表结构定义指标的名称,列数,数据类型等结构信息,用.frm文件存储。

表数据指的就是我们存入的一行行的数据,每个存储引擎有不同的表数据保存方式。MyISAM的数据和索引在文件层面是分开存放的,都存放到对应的数据库子目录下。新建一个表myisam_table,使用MyISAM存储引擎,打开其所在数据库对应的目录下面,会发现有如下三个文件:

代码语言:javascript
复制
myisam_table.frm  //表结构文件
myisam_table.MYD //数据文件
myisam_table.MYI  //索引文件
MyISAM表生成的对应文件
MyISAM表生成的对应文件

InnoDB的数据和索引是存放在一起的,此外,InnoDB还有两种表空间方式:独立表空间和系统表空间。

系统表空间,对应文件系统上一个或多个真实文件。默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,对应系统表空间。且这个文件为自扩展文件,不够用的时候能自己增加大小。所有表共享这些ibdata文件。

在MySQL5.6.6及之后的版本里,InnoDB开始为每个表建立一个独立表空间,单独存放表数据。独立表空间用.ibd文件表示,每个表对应一个.ibd文件,存放在所属数据库目录下。

新建一个表innodb_table,使用InnoDB存储引擎,打开其所在数据库对应的目录下面,会发现有如下文件:

代码语言:javascript
复制
innodb_table.frm //表结构文件
innodb_table.ibd //数据文件
InnoDB表生成的对应文件
InnoDB表生成的对应文件

同时,数据目录下面的ibdata1文件,即为InnoDB的系统表空间。

查看数据目录
查看数据目录

目前为止,我们已经介绍了大部分的文件了,看上面的数据目录,还有auto.cnf,ib_logfile0,ib_logfile1几个文件没有介绍。其中auto.cnf保存MySQL实例的server-uuid值。server-uuid与server-id一样,用于标识MySQL实例在集群中的唯一性,这两个参数在主从复制中具有重要作用。

auto.cnf保存MySQL实例的server-uuid值
auto.cnf保存MySQL实例的server-uuid值

ib_logfile0,ib_logfile1两个文件属于InnoDB的重做日志文件,主要作用是在实例意外断电宕机后,InnoDB能够使用重做日志回放还未写入磁盘的操作,以此来保障数据的完整性。

总结一下,MySQL的文件结构描述如下。

MySQL文件结构
MySQL文件结构

auto.cnf

保存MySQL实例server-uuid的值。

mysql.sock

MySQL socket套接字文件,当MySQL客户端和数据库实例在同一台服务器上时,可以使用此文件用Unix套接字的形式来连接实例。

.frm文件

存储与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。

不管什么存储引擎,每一个表都会有一个以表名命名的.frm文件。

.MYD文件和.MYI文件

MyISAM引擎的索引与数据是分开存储的。.MYD文件存放MyISAM表的数据,.MYI文件存放MyISAM表的索引相关信息。且对于MyISAM表,MySQL只缓存其索引文件,数据文件的缓存由操作系统本身完成。一个MyISAM表对应一个.MYD文件和一个.MYI文件,它们都存放在所属数据库目录下。

.ibd文件和ibdata文件

存放InnoDB的数据文件(包括索引)。

InnoDB存储引擎有两种表空间方式:独享表空间和共享表空间。

独享表空间使用.ibd文件来存放数据,且每个表一个.ibd文件,文件存放在所属数据库目录下;

共享表空间使用.ibdata文件,所有表共同使用一个(或多个,自行配置)ibdata文件。

ib_logfile0,ib_logfile1

InnoDB的重做日志文件。每个InnoDB至少有一个重做日志文件组,每个文件组下面至少有2个重做日志文件,比如默认的ib_logfile0和ib_logfile1。

db.opt文件

此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规则。

日志文件

日志文件记录了影响MySQL的各种类型活动,它们的存在为DBA优化查询,问题查找带来了便利。常用的日志文件有以下五种。

错误日志(Error Log)

错误日志记录了MySQL服务启动、停止、运行过程中遇到的各种错误信息,也包含一些警告和正确信息。当数据库出现问题时应该优先查看错误日志。通过以下命令查找错误日志的保存路径,并查看错误文件记录的具体信息。

代码语言:sql
复制
show variables like 'log_error';
错误日志
错误日志

二进制日志(Binary Log)

二进制格式的文件,记录所有更改数据的语句,用于数据库的主从复制及数据的增量恢复;

查询日志(General query Log)

记录所有对MySQL数据库请求的信息,不管请求是否得到正确的执行。连接和执行的语句。默认文件名为主机名.log.

慢查询日志(Slow Log)

通过设置一个超时阈值,慢查询日志将记录所有执行时间超过阈值的慢查询语句。可以用于分析优化SQL。默认情况下MySQL数据库不启动慢查询日志,需要手动将slow_query_log参数设置为ON打开此功能。

超时阈值通过参数long_query_time设置,默认为10,代表10秒。

代码语言:sql
复制
show variables like 'slow_query%';
show variables like 'log_slow_query_time';
查看慢查询日志相关参数
查看慢查询日志相关参数
慢查询阈值默认为10秒
慢查询阈值默认为10秒

中继日志(Relay Log)

主从复制时使用的日志。

关于二进制日志和中继日志的详细介绍,可阅读文章https://cloud.tencent.com/developer/article/1541850

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置文件
  • 数据文件
  • 日志文件
    • 错误日志(Error Log)
      • 二进制日志(Binary Log)
        • 查询日志(General query Log)
          • 慢查询日志(Slow Log)
            • 中继日志(Relay Log)
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档