您的位置:首页 > 数据库 > SQL

MYSQL架构组成

2011-11-16 12:22 162 查看
一, MySQL 物理文件组成

1,日志文件

1.1 错误日志:Error Log 在默认情况下,系统记录错误日志的功能是关闭的,错误日志的默认存放位置在数据目录下,以 hostname.err 命名。但是可以使用命令:--log-error[=file_name],修改其存放目录和文件名。可以利用 MySQL 的 FLUSH LOGS 命令来告诉 MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。

1.2 二进制日志:二进制日志,也就是我们常说的 binlog,也是 MySQL Server 中最为重要的日志之一。当我们通过“--log-bin[=file_name]”打开了记录的功能之后,MySQL 会将所有修改数据库数据的 query 以二进制形式记录到日志文件中。当然,日志中并不仅限于 query 语句这么简单,还包括每一条 query 所执行的时间,所消耗的资源,以及相关的事务信息,所以 binlog是事务安全的。

1.3 更新日志:其功能和 binlog 基本类似,。从版本 5.0 开始,MySQL 已经不再支持更新日志了

1.4 查询日志:查询日志记录 MySQL 中所有的 query,通过“--log[=fina_name]”来打开该功能。由于记录了所有的 query,包括所有的 select,体积比较大,开启后对性能也有较大的影响,所以请大家慎用该功能。一般只用于跟踪某些特殊的 sql 性能问题才会短暂打开该功能。默认的查询日志文件名为 hostname.log。

1.5 慢查询日志:,慢查询日志中记录的是执行时间较长的 query,也就是我们常说的 slowquery,通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名,默认文件名为 hostname-slow.log,默认目录也是数据目录。

1.6 Innodb 的在线 redo 日志:Innodb 是一个事务安全的存储引擎,其事务安全性主要就是通过在线 redo 日志和记录在表空间中的 undo 信息来保证的。redo 日志中记录了 Innodb 所做的所有物理变更和事务信息,通过 redo 日志和 undo 信 息 ,Innodb 保证了在任何情况下的事务安全性。Innodb 的redo日志同样默认存放在数据目录下,可以通过 innodb_log_group_home_dir 来更改设置日志的存放位置,通过 innodb_log_files_in_group
设置日志的数量。

2,数据文件

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

2.2 “.MYD”文件 是 MyISAM 存储引擎专用,存放 MyISAM 表的数据。

2.3 “.MYI”文件 件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。

2.4 “.ibd”文件和 ibdata 文件 独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空

间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。

3,Replication Replication 相关

3.1 master.info 文件 面存放了该 Slave 的 Master 端的相关信息,包括 Master 的主机地址,连接用户,连接密码,连接端口,当前日志位置,已经读取到的日志位置等信息。

3.2 relay log 和 relay log index 用于存放 Slave 端的 I/O 线程从 Master 端所读取到的 Binary Log 信息,然后由 Slave 端的 SQL 线程从该 relay log 中读取并解析相应的日志信息,转化成 Master 所执行的 SQL 语句,然后在 Slave 端应用。

3.3 relay-log.info 文件: 类似于 master.info,它存放通过 Slave 的 I/O 线程写入到本地的 relay log 的相关信息。供 Slave 端的 SQL 线程以及某些管理操作随时能够获取当前复制的相关信息。

4,其它文件

4.1 system config file MySQL 的系统配置文件一般都是“my.cnf”,Unix/Linux 下默认存放在"/etc"目录下,Windows 环境一般存放在“c:/windows”目录下面。

4.2 pid file pid file 是 mysqld 应用程序在 Unix/Linux 环境下的一个进程文件,和许多其他Unix/Linux 服务端程序一样,存放着自己的进程 id。

4.3 socket file socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端连接可以不通过 TCP/IP 网络而直接使用 Unix Socket 来连接 MySQL

二、 逻辑模块组成

1,初始化模块 就是在 MySQL Server 启动的时候,对整个系统做各种各样的初始化操作,比如各种 buffer,cache 结构的初始化和内存空间的申请,各种系统变量的初始

化设定,各种存储引擎的初始化设置

2,核心 API 主要是为了提供一些需要非常高效的底层操作功能的优化实现,包括各种底层数据结构的实现,特殊算法的实现,字符串处理,数字处理等,小文件 I/O,格式化输出,以及最重要的内存管理部分。代码都集中在 mysys 和 strings文件夹下面

3,网络交互模块 实现底层网络数据的接收与发送,以方便其他各个模块调用,以及对这一部分的维护,所有源码都在 vio 文件夹下面

4,Client & Server 交互协议模块 实现了客户端与 MySQL 交互过程中的所有协议。当然这些协议都是建立在现有的 OS 和网络协议之上的,如 TCP/IP 以及 Unix Socket。

5,用户模块 主要包括用户的登录连接权限控制和用户的授权管理

6,访问控制模块 是根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。用户模块和访问控制模块两者结合起来,组成了 MySQL 整个数据库系统的权限安全管理的功能。

7, 连接管理、连接线程和线程管理 连接管理模块负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

8,Query 解析和转发模块 将 query 语句进行语义和语法的分析,然后按照不同的操作类型进行分类,然后做出针对性的转发。

9,Query Cache 模块 Query Cache 模块在 MySQL 中是一个非常重要的模块,他的主要功能是将客户端提交给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值做一个对应。

10, Query 优化器模块 就是优化客户端请求的 query,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果

11, 表变更管理模块 表变更管理模块主要是负责完成一些 DML 和 DDL 的 query

12, 表维护模块 表的状态检查,错误修复,以及优化和分析等工作都是表维护模块需要做的事情。

13, 系统状态管理模块 系统状态管理模块负责在客户端请求系统状态的时候,将各种状态数据返回给用户

14, 表管理器 是维护.frm文件,以及一个 cache,该 cache 中的主要内容是各个表的结构信息。此外它还维护 table 级别的锁管理。

15, 日志记录模块 日志记录模块主要负责整个系统级别的逻辑层的日志的记录

16, 复制模块 复制模块又可分为 Master 模块和 Slave 模块两部分, Master 模块主要负责在Replication 环境中读取 Master 端的 binary 日志,以及与 Slave 端的 I/O 线程交互等工作 。Slave 模块比 Master 模块所要做的事情稍多一些,在系统中主要体现在两个线程上面。一个是负责从 Master 请求和接受 binary 日志,并写入本地 relay log 中的 I/O 线程。另外一个是负责从 relay log 中读取相关日志事件,然后解析成可以在
Slave 端正确执行并得到和Master 端完全相同的结果的命令并再交给 Slave 执行的 SQL 线程。

17,存储引擎接口模块 实际上只是一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: