数据库底层有些啥(以Oracle为例)
什么是数据库
首先,问一个经典的问题,什么是数据库?”数据库是物理操作系统文件或磁盘的集合。“也就是说,数据库其实是死的,就是一堆磁盘文件,那么数据库是怎么为应用提供服务呢?这就是另一个概念了:实例。“实例是一组Oracle后台进程/线程以及一个共享内存区。”实例中的进程和内存区是数据库运转的关键。它们调动CPU,对磁盘进行读写,一边为应用提供服务,一边维护数据库。绝大多数情况下,数据库和实例都是一对一的关系,因此下文就不区分数据库和实例了。可以看出,数据库底层就三个东西:文件、进程和内存结构。
一、数据库文件
Oracle数据库中有10种以上的文件,而对于开发而言,最常见到的就是数据文件和重做日志文件了。
1)数据文件
数据文件体系可以概括为:表空间、段、区段和块,四者之间是包含关系。
表空间
1)system表空间
真正的Oracle数据字典
2)sysaux表空间
非字典对象
3)user表空间
这里面存储的就是用户数据了,所有用户创建的表的数据都在这里存储。
段
段结构中最常见是:
1)表段、表分区段、子分区段:存储表的数据或者表分区的数据等等;
2)索引段、索引分区段:保存索引结构
3)回滚段:旧数据副本,以备回滚
4)临时段:临时数据、排序数据
2)重做日志文件
在线重做日志
形式:磁盘文件;
作用:在断电恢复时,将系统恢复到断电前的时刻,避免因为内存(数据库缓冲区缓存)在断电后数据清空导致数据丢失,维护数据库的持久性。
工作机制:在断电重启时,利用在线重做日志,对事务进行重放,以同样的方式修改与提交。
维护机制:数据变更时,在缓冲区缓存中进行变更,并将重做这些修改所需的全部信息保存在重做日志缓冲区中,**当commit时,将重做日志缓冲区的内容写到在线重做日志中。**只有缓存区中的数据被刷到磁盘上,重做日志才可以被覆盖。
如果每次commit时,都把数据从内存刷回磁盘,也可以保证数据库的持久性。但是,将数据刷回磁盘是分散写,将日志写到磁盘是连续写,连续写更快。
归档重做日志
形式:磁盘文件;
作用:当磁盘异常时,用于恢复数据库。
工作机制:上个时间点的备份文件+上个时间点至今的归档重做日志–>最新数据
维护机制:开启archivelog模式时,当覆盖在线重做日志时,将在线重做日志备份。
二、数据库内存结构
内存体系:
1、PGA
进程全局区,一个进程或线程专用的内存
2、UGA
用户全局区,与特定的会话相关联。若是专用服务器连接,则属于PGA;若是共享服务器连接,则属于SGA。
3、SGA
系统全局区
SGA
1)固定SGA:SGA的自启区
2)重做缓存区:用于缓存在线重做日志
3)块缓冲区缓存
a)从磁盘中读的数据库块
b)将要写到磁盘的数据库块
4)共享池
5)大池:用于大块内存的分配,如UGA
6)Java池
7)流池
共享池
形式:内存结构
作用:缓存“程序”,如PLSQL代码、系统参数、数据字典缓存(数据库对象的已缓存信息)
工作机制:多个会话执行同一代码时,只加载一个副本,所有会话共享
维护机制:LRU(最近最少使用);
三、数据库进程
1)服务器进程
是什么:进程或线程
作用:代表客户会话完成工作,接收应用向数据库发送的SQL语句并执行
工作机制:会话SQL–》连接–》服务器进程
连接:
a)专用服务器连接:客户连接与服务器进程一对一映射
b)共享服务器连接:由调度程序将客户连接的请求放在请求队列中,由第一个可用的共享服务器进程来处理
c)数据库常驻连接池
2)后台进程
随数据库而启动,完成各种维护工作
中心后台进程
a)各种维护进程,监视进程、系统,清理、合并空间等等
b)DBWn:数据库块写入器,负责将脏块写入磁盘;
c)LGWR:日志写入器,将重做日志从内存刷到磁盘,作用的充分而非必要条件是“commit”;
d)ARCn:归档进程,维护归档日志
工具后台进程
全都是可选的,提供了一些工具,如数据泵。。。
3)从属进程
代表前两种进程完成一些额外工作
作为一个CRUD菜鸟,而非数据库底层开发或者运维大佬,本文主要是对数据库底层的一些常用的概念进行思考和总结,因此内容可能既不完善也不准确。主要目的是希望通过学习,可以看懂数据库的一些报错的底层原理,如果因此能站在更底层的角度去思考如何CRUD,那就属于是意外收获了。
参考文献
Oracle编程艺术:深入理解数据库体系结构(第3版)【作者:Thomas Kyte】