客户端连接到oracle实例就会在oracle实例端产生一个server process进程,此为前台进程,oracle为该进程分配独自的PGA。
SQL语句执行过程:
1. 客户端输入SQL语句,SQL语句通过网络到达oracle实例,server process接收SQL语句;
2. Oracle无法直接执行SQL,需要将SQL解析成执行计划才能执行;
3. 解析消耗很多资源:CPU、IO,故有必要缓存执行计划以备后用。执行计划被缓存在SGA的shared pool内存区里面;
4. 故server process拿到一条SQL后首先进入到shared pool,看SQL在shared pool中有没有缓存。如果有缓存则直接取出执行计划执行,如果没有则解析SQL;
5. 对shared pool的访问和修改以及解析SQL都是由server process做的。Shared pool缓存SQL语句和SQL语句对应的执行计划;
6. 数据库的数据是放在*.dbf文件中的,执行计划一来并非直接查询*.dbf文件,而是到buffer cache内存区中查询是否有相应的数据缓存,如果有缓存则直接从buffer cache返回数据,否则再查询*.dbf文件;
7. 执行计划从*.dbf文件中查询出数据后不是直接返回给用户,而是先把数据放到buffer cache中缓存,然后从buffer cache中返回数据;
8. 对数据的查询是由server process完成的;
9. 如果是修改数据,server process把表读到内存里面,在内存里对表进行修改,oracle对所有的修改都会产生日志,日志是由server process产生的,产生的日志会写到redo log buffer内存区中。Server process修改或完之后,由另外一个进程DBWR负责把数据从内存写回磁盘。Redo log buffer内存区的日志由LGWR进程写入*.log文件;
10. Server process叫做前台进程,DBWR和LGWR叫做后台进程;
11. 在修改数据的时候,server process只是负责读出数据,在内存里修改,产生日志并写入redo log buffer内存区。Server process对buffer cache可读可写;
12. Server process是直接面向用户的,如果serverprocess慢了用户会感觉到。Server process把数据读出并修改,返回修改结果,至于修改的数据什么时候写回磁盘server process不去管,故交给后台进程去做;
13. 所以数据库优化和性能监控的时候我们主要关心server process,因为server process的快慢直接反应数据库的快慢,直接反馈用户对数据库的感受;
14. DBWR和LGWR以及CKPT都是周期性运行的,其中DBWR和LGWR频率很高负载很大。而CKPT进程的频率相对较低负载小,CKPT把数据库当前的状态信息写到控制文件和数据文件的头部。每个数据文件的头部都记录了数据文件的状态信息。
15. SMON(S monitor)进程负责对数据库实例进行维护(主要是维护SGA)。例如shared pool使用时间长了之后会产生许多的碎片,SMON就负责对碎片进行整合。SMON主内;
16. PMON(P monitor)进程负责对serverprocess进行维护。如客户与数据库实例的连接突然中断,此时针对该客户的server process进程并没有失效,PMON会周期性检测,如果发现无效的server process就会kill掉该server process进程并回收相应的PGA。
Oracle归档日志:
1. 数据库默认有三个redo日志文件,redo01.log、redo02.log、redo03.log。oracle首先使用redo01.log记日志,记满之后开始使用redo02.log,最后使用redo03.log。如果redo03.log写满了,oracle反过来继续用redo01.log,这就会覆盖redo01.log中的内容。也就是说oracle只能保留三组日志,日志的作用很大,仅仅保留三组是不够的。
2. Oracle为了保留更多的日志产生了归档的模式。Oracle先写redo01.log,写满之后oracle会启动一个叫ARC的进程,ARC会把redo01.log日志归档到另外一个目录底下去,另起一个名字,大小与内容和redo01.log一样。同理,如果redo02.log写满了,ARC就会把redo02.log归档到目录下面。同理redo03.log;
3. 在归档目录下保留了oracle所有的日志;
数据类型:
1. 脏数据:如果buffer cache中对应的数据和*.dbf对应的数据不一致,则为脏数据。脏数据需要及时的被写回*.dbf中;
2. 已连接:server process在读取或修改buffer cache数据的一瞬间,该数据的状态是已连接(PIN);
3. 空闲或未使用:Buffer cache中未使用的空间;
4. 干净数据:buffer cache中对应的数据与*.dbf对应的数据相同,则为干净数据;