面试素材整理_体系结构概述
用户发起远程连接的请求,首先通过监听校验IP地址,端口号,服务名和域名,校验成功之后,会连接到一个数据库实例(实例=内存+进程)去管理数据库。然后Oracle就会给用户分配一个PGA空间和server process 进程。
PGA,私有全局区,用来存放用户的连接信息和用户权限等信息。
server process ,用来处理用户的请求,解析SQL语句和执行PL/SQL,创建执行计划和生成哈希值的。
一条SQL语句的执行过程:
首先server process 会拿着这条SQL语句再share pool 的library cache里进行语法语义的校验,校验成功,看有没有相同的执行计划,如果有相同的执行计划,就证明这条语句曾经被执行过,就执行它,这就是软解析;如果没有相同的执行计划,server process 就自己对这条sql 语句生成一大堆的执行计划,然后从这么多的执行计划中选择最优的执行计划保存到share pool 的library cache 中,这就是硬解析。
share pool :是非共享内存区,包括库缓存区,数据字典缓存区,和保留池。其中,库缓存区用来缓存可执行的sql 和pl/sql 代码的;数据字典缓存区用来存放数据字典元数据的信息;保留池用来解析内存碎片而无法分配足够的内存空间的问题。当share pool 中的chunk 被用到只剩下一小部分的时候,就会启用reserve pool 中的chunk .
buffer cache(数据库缓冲区):是用来存放来自数据文件中数据块的副本,包括未被使用的块,脏块,干净的块。buffer cache 的最小单位是buffer ,数据缓冲区的目的,所有操作都在内存中进行,优化物理的IO ,能够缓存经常被访问的数据块,提高数据处理的效率。
redo log buffer ,重做日志缓冲区),它的工作流程是先记录日志,再修改数据,保证数据的一致性,它记录了数据的scn ,rowid,commit ,新值,原值,通过lgwr写道redo log buffer 中。
large pool :处理并行;Java池:解析java 代码;流池:处理流复制。
如果是insert,update等语句,执行执行计划的时候,因为此时数据块已经在内存中了,可以直接调用数据库缓冲区里的数据进行dml 操作,在进行dml 操作之前,首先server process 在redo log buffer 里面保存下来这条数据修改的信息,之后,再去buffer cache 里面修改这个数据,这条数据所在的块就会变成脏块。如果有提交的话,会立即触发lgwr 进程,把redo log buffer 里这条数据的信息写道redo log file 文件中,然后过一段时间后dbwr 进程会把脏块写道数据文件里面。
-----------------------------------???????
当buffer cache 里面的数据块是被修改过的但没有提交,server process会根据这个数据块的块头中的itl事物槽的信息就能找到这条数据所在的前镜像undo的地址,找对应的数据。
根据这条数据,这时我们就要考虑这条数据是回滚了还是提交了–》这个是能在undo里面能找到的,如果这条数据提交了,它就在undo里面找确定这条数据已经提交了以后,那么这个server process 会自动把这个数据块的信息重新清空一遍,说这条数据已经提交了(就意味着这条数据直接被读出来了),然后 这时redo log buffer 里就会产生一条数据的修改的信息。如果这个块是没有被修改的是一个非常干净的一个块,扔到buffer cache,然后 server process把这个块返还给我们用户,第二次再运行的时候,修改数据的修改信息在PGA中生成,
————————————————————————————?????
ckpt 进程:把数据库,磁盘上的文件由于数据文件的版本向前推进,推进到尽可能接近内存中最新的版本。--------->这个过程:ckpt 会通知dbwr 把脏块写道数据文件里面;
检查点可以分为完全检查点和增量检查点。完全检查点的作用是,把buffer cache 的所有脏块写道数据文件里,同事更新库文件和数据文件头sid 的信息,这样内存版本和数据版本就是最新的,接下来就可以安全的关闭数据库;增量检查点:每3秒告诉dbwr 进程要往下写脏块。
lgwr 进程的触发条件:用户提交;日志切换;秒三秒钟触发一次;日志缓冲区达到1/3满或者容量达到1M。
dbwr 进程的触发条件:当 server process 扫描了一定量的buffer 后,仍没找到可用的buffer,会触发dbwr写(40%);根据检查点信息,定期的触发dbwr;当发生drop 或者truncate 的时候,会触发dbwr 进程;当表空间置为read only;表空间置为offline ;当做begin backup 的时候,也会触发dbwn 进程。
pmon ,进程监视器进程,每隔一分钟pmon 进程会把数据库的信息注册到监听器中,然后用户会携带着相应的信息和pmon中的信息进行校验(所以,也就是说监听器是知道数据库的状态的,如果数据库关闭了,那么pmon 进程也就没了,监听器也就连接不到数据库了,但是用户是可以连接到监听器的。)
smon ,系统监视器进程,在没有dba 介入的时候,可以执行实例恢复;恢复中断的事务;清理不再使用的临时段,清理undo 表空间。