前言
这是非常纠结的一节,该简单还是该详细。简单了等于啥也没说,详细了,实话就是很多地方,我也搞不懂。说得简单就几个物理文件,几个内存块,几个进程干什么的。说得难它涉及到整个Oracle的运行原理。这里面难度的拿捏,我尽力而为,而且上一篇还有一部分没来得及说,主要昨天时间紧,以后有时间补上。
物理结构
内存我们是看不到的,物理结构肯定在硬盘上,我们先上张图。
1、控制文件(control file)
控制文件除了我们上面目录上那个之外,还有一个,这个有什么特点?如果我们找出来,用编辑器打开,发现就是一样的。完全一模一样。一模一样的东西几个,有什么用?镜像是因为这个文件太重要,所以要多备份一个,甚至几个,以保障某一个损坏的情况下,数据库仍能正常运行。至于有什么作用,下一篇我们再说。2、数据文件(data file)
数据文件是数据库存放数据的地方。这点毋庸置疑。文件全在我们上面的那个目录。文件的具体详情,也是以后再说。3、日志文件(log file)
我能说这就是存放日志的文件吗?我能说详情以后再说吗?我觉得目前为止,我们确实可以这样说。你了解有这么三种文件就行了。对应在哪里,怎么查找。
Instance
先盗一幅图。
1) SGA我要强调的是SGA是共享的,是共享的shared是它的属性。第一张图
第二张图
再上张图
1、buffer cache里面存放着从磁盘读到内存的数据块。这些数据可以被所有会话访问到,是全局共享的。它又分为几种。1.default pool正常情况下,数据都存放在这块地方。同时也会根据过期算法把过期的脏数据写到磁盘里。(写到磁盘的什么文件里面?我们上面说了三种,哪一种?)2.keep pool将一些数据始终固定在内存中。3.recycle pool存放一些不常用的数据,避免在default pool中抢位置。4.2k、4k等等把非标准的数据块存放在这里。至于什么是标准数据块,我也只能以后再说。2、redo log bufferredo log buffer存放的是数据库产生的redo数据。什么叫redo数据,现在不说。redo log buffer以循环写的方式写到磁盘中,磁盘中的哪里?我们上面不也是有3种磁盘文件吗?redo01,redo02,redo03里面。3、shared pool用来放sql1.library cache:保存着sql和pl/sql包以及很多重要信息,比如执行计划之类,控制结构锁。这里主要涉及硬解析和软解析。2.data dictionary cache:数据字典的一些数据信息、结构信息。在sql被解析的时候需要频繁访问。3.Server Result Cache:保存了一些sql的结果集,默认不开启。需要强制启用。4.reserved pool:系统保留区。4、large pool主要供并行,备份,恢复的时候使用。5、streams pool使用流复制之类的时候用到的内存区。6、java pooljava代码的运行区域。7、fixed pool保留通用的数据库和实例信息。PGA是进程专属的内存区域。组成部分就不详细解释了。
后台进程
关于后台进程,我们先上一张图。
SMON:启动实例的恢复。清理和释放临时段上的数据。对于字典管理表空间,可以合并连续的extent。维护回滚段online,offline以及空间的回收。简单说恢复清理任务。PMON:进程异常终止,会话被杀掉,事务超过空闲时间,网络连接超时,回滚未提交数据,释放事务相关资源。DBWn:负责把buffer cache中的数据写入硬盘数据文件中。LGWR:负责把log buffer中的数据写入磁盘上online redo log file。ARCn:在归档模式下将online redo log file写入指定位置。CKPT:通知DBWn将内存数据写入硬盘文件。
总结
我觉得最开始我们没必要记住这些东西,没必要,有个大概的了解就足够了。三大块:内存:提高数据查询的速度,更好的提升数据的处理速度。后台进程:为了完成特定的任务的服务进程。数据文件:数据永久性保存。知道个大概就行了,最后送上我当初自己画的丑图。