1.实例(内存+进程)
内存:
1)SGA (System Global Area):里面的数据为共享数据(数据需要被所有人共同使用)
a.数据块(表记录)
b.library cache:一条sql被解析,执行计划存放在library cache中,另一用户再执行这个sql,就会从library cache中找,如果 有这个sql执行计划,此sql就不需要被解析了
c.Data Dictionary cache:存储某个对象,例如表的属性(列、空间、权限)
2)PGA(Program Global Area,也叫做程序缓存区):某个会话独有的数据和其他,每个会话都有自己的pga
SGA和PGA构成了实例的内存部分(内存就是放置在这的一块区域,后台进程操纵实现功能)
进程:
oracle后台进程、服务器端进程、客户端进程
oracle服务端进程有两种模式:默认是delicated(专有),share(共享)
文件:
控制文件、重做日志文件、数据文件
只有相关进程需要写数据和读数据的时候,才会使用到这些文件
3.其他组成部分
参数文件、密码文件、归档日志
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
详解:
1.实例:
用户进程首先向数据库发送一条sql指令,数据库端启动server process与client process组成一个session,server process会处理用户的请求,服务器端要自己开一块内存,这个内存就是pga,执行sql语句就要访问sga,先去shared pool解析sql语句,得到执行计划,按照执行计划访问数据(database buffer cache),访问数据有多种方式,访问方式与执行计划有关,先去内存database buffer cache中找,找不到再去磁盘上读,不是后台进程读,而是server profess直接去文件里读,修改数据块在database buffer cache上改,修改数据块就会产生redo log,当用户commit后,redo会通过LGWR把数据写到磁盘上,发出check point命令,DBWN会把脏数据写到磁盘上
a.SGA区
oracle最重要的内存区域,是数据库中共享资源的内存区域。
a.SQL语句解析,生成执行计划,执行计划被共享
b.数据被访问,被共享
c.产生重做日志
select只需要前两步就可以完成,如果对数据块进行修改,则会产生重做日志
重做日志每三秒往磁盘上刷一次或者用户commit后立刻往磁盘上刷一次,只要重做日志写到磁盘上了,数据块写没写到磁盘上无所谓,可利用重做日志恢复
私有SQL区包含了绑定变量值和运行时期内存结构信息等数据,每一个运行SQL语句的会话都有一个块私有SQL区。所有提交了相同SQL语句的用户都有各自的私有SQL区,并且他们共享一个共享SQL区。因此,一个共享SQL区可能和多个私有共享去相关联。
b.游标和SQL区
一个ORACLE预编译程序或OCI程序的应用开发人员能够很明确的打开一个游标,或者控制一块特定的私有SQL区,将他们作为程序运行命名的资源
c.会话内存
基于排序的操作(ORDER BY、GROUP BY、ROLLUP、窗口函数)
查看pga大小
---后台进程:
查看后台进程数量:
DBWRn(Data Base Writer):
将数据缓冲区中的所有修改过的缓冲块数据写到磁盘数据文件,如果有大量的脏数据需要往磁盘上写,就需要n个DBWR
LGWR(Log Writer):
把日志缓存区的数据从内存写到磁盘的REDO文件里
CKPT(Check Point):
启动DBWn来写脏数据
然后会更新DATAFILE的HEADER和控制文件的HEADER。而HEADER中有同步所需要的信息,即CHECKPOINT的信息
正常情况下,ORACLE的所有文件必须靠CHECKPOINT同步
监听器会把服务转到实例上,oracle启动服务器进程,和客户端建立连接,一条会话完成(v$session),在shared pool中进行sql解析,生成执行计划,server process会按照执行计划访问数据,在db buffer中找不到再去数据文件里找,数据文件里找到之后再读到db buffer中,可以修改数据块。修改的时候要产生undo数据,set id=1(之前id=99),会将99放到undo表空间中,以便于进行回滚,放完之后才会将id修改为1,commit后,lgwr把undo产生的回滚日志和当前数据块产生的日志写到磁盘上,更新成功,系统作检查点,把修改的脏数据块写到数据文件中
参考视频:炼数成金