数据库管理系统由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据集合通常称为数据库。
一、文件系统的弊端
在形成数据库管理系统之前,数据的管理采用一般的文件处理系统。文件处理系统存在以下弊端:
- 数据的冗余和不一致:文件通常由不同人创建、维护,相同信息可能存在多个文件,冗余的信息占用了存储空间,并且当部分数据进行修改时可能因某些文件未同时修改而导致数据不一致。
- 数据访问困难:文件一般以一定规律排布信息,数据的访问只能依赖于该规律,当出现新需求时,又需要重新编排。
- 数据孤立:数据分散在不同文件中,并且文件格式可能不同。
- 完整性问题:
- 原子性问题:典型的银行转账问题。
- 并发访问异常:文件处理系统无法应对高并发访问。
- 安全性问题:并非文件系统的所有用户都可以访问所有数据。
二、数据库系统架构
数据库系统通过相关程序管理维护文件系统来解决以上弊端。
以下是一个一般的数据库系统架构图:
- 存储管理:逻辑关系与物理存储的映射
- 缓存机制:优化执行效率
- SQL解析:提供外部可操作的语言解析
- 日志管理:记录操作、运行信息,并提供恢复依据
- 权限划分:多用户管理
- 容灾机制:灾难应对及恢复机制
- 索引管理:优化查找效率
- 锁管理:应对并发
三、MySQL体系架构
MySQL由以下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式存储引擎(InnoDB,MyISAM,NDB,Memory,Archive等等)
- 物理文件
四、InnoDB存储引擎体系架构
innodb引擎主要由多个内存块组成的内存池和后台线程组成。
后台线程:
- Master Thread:主要负责将缓冲池中的数据异步刷新到磁盘
- IO Thread:负责异步IO写请求的回调处理
- Purge Thread:事务提交后,回收undo页。早先的版本是在主线程中进行,独立出该线程可减轻主线程工作,提高CPU使用率及存储引擎性能。
- Page Cleaner Thread:将脏页的刷新操作独立到该线程进行。早先的版本也是在主线程中进行。
内存:
- 缓冲池:由于内存读取与磁盘读取存在较大速度差异,一般采用缓冲池提升数据库整体性能。
- LRU List: 缓冲池的空间是有限的,数据库中的缓冲池通过LRU(最近最少使用)算法来维护。
- 重做日志缓冲:用户的事务会先存入重做日志缓冲,再以一定频率写入重做日志文件。重做日志缓冲无需过大,也不能太小,需大于用户每秒产生的事务量。
- 额外的内存池:存储额外的信息。
五、mysql的构成文件
mysql数据库的构成文件:
- 参数文件:数据库文件存储信息、实例启动的初始化参数等等
- 日志文件:错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件
- socket文件:使用套接字方式进行连接时需要的文件
- pid文件:mysql实例时,会将进程ID写入该文件
- 表结构定义文件:mysql是根据表进行数据存储的,不论表采用何种引擎,都有一个对应的frm文件记录其表结构定义。
错误日志:包含mysql启动、运行、关闭时的错误、警告、正确信息。
慢查询日志:mysql默认没有开启慢查询日志,并且默认的long_query_time为10秒,即查询时间超过10秒的sql才会被记录该日志。用户可自行开启并设置阀值。
查询日志:记录所有对mysql数据库的请求信息。
二进制日志:对数据库进行更改的所有操作都将被记录到该日志。该日志可用于数据恢复、主从复制、审计注入攻击。
InnoDB存储引擎的构成文件:
- 表空间文件:所有采用InnoDB引擎的表数据都会默认共享到该空间,也可通过设置参数为各表生成独立表空间,此时独立表空间仅存储该表的数据、索引、插入缓冲等信息,其余信息仍在默认表空间中。
- 重做日志文件:记录InnoDB引擎的事务日志,用于断电宕机等情况发生后的数据恢复。重做日志的写入是先写入一个重做日志缓存,然后主线程以每秒一次的频率写入512字节,或者在事务提交时写入。
重做日志文件相关属性:
innodb_log_files_in_group指定日志文件组的重做日志文件的数量,当一个日志满了之后,切换到另一日志。默认为2.
innodb_log_file_size文件大小,太小容易频繁切换,且事务量受限,太大则恢复时间较长。
innodb_mirrored_log_groups为高可用可开启设置日志镜像文件组。
innodb_log_group_home_dir指定日志文件路径
参考资料:
《MySQL技术内幕--InnoDB存储引擎》
《数据库系统概念》