Oracle SGA区

像很多数据库如db2,mysql等等都是关系型数据库。但是他们也有区别,区别就在数据库的架构上面。

整个Oracle来讲就两个部分,一部分是实例(由两部分构成,一部分是里面的内存结构由sgaPga构成。SGA全称为system gloable area,系统全局区域,也就是说在SGA区里面放的是共享的,全部的人都可以看到的数据。只有这一类的数据会放到SGA区里面。PGA是某个会话独有的数据和其他的东西,每个会话都是不一样的,所以每一个会话都有一个PGA。而SGA里面的就不是这样划分的,SGA里面的东西是共享的。比如说data buffer cache,这个就是存放数据块的,比如说在内存里面无论是哪个用户从内存里面在磁盘上读了一个数据块放到内存里面,那么这个数据块就会被所有人共有,都会看到被共有。大家都会来访问这个数据块,这个就是一个全局区,只有这个数据要被所有人共同使用的时候这个数据会被放在SGA区里面。按照功能SGA又可以进行划分,数据块,表里面的数据,表里面的记录是放在数据块里面。Oracle最小的单位就是数据块,这些数据块被读取到内存里面,因为Oracle查询是要在内存里面完成的,数据处理需要内存来完成。数据块是读到database buffer里面,读进去之后所有人都可以看到了。

Share pool里面包含了两部分,一部分是library pool包含了sql的一些信息,如某条sql被解析了,生成了执行计划,那么这个执行计划就可以被其他用户所使用,是共享的。所以share pool是保存sql信息的并且是被共享的。

Data directory是数据字典的信息,包含了某些对象属性信息,如某一张表的一些属性,这张表的列,权限等等都放在数据字典里面。这个也是共享的,可以被所有的人查到对象相关的信息。

Java pool是和java相关的池子。

Larger poolrman备份的时候会用到。日志是所有用户产生的日志都会放在redo log buffer里面。一句话总结,SGA里面存放的是公用的数据。PGA是一个私有的内存区域每一个用户都会开辟一块内存,这个是会话私有的内存区域。SGA+PGA内存构成了整个oracle的实例内存区域,实例还包括实例的后台进程。内存实际上就是一块区域,这块区域如何使用以及操作就是靠oracle的后台进程。实例由两部分构成,内存加进程。)一部分是数据库,里面存放的都是数据文件。


所以oracle是由两部分构成,databaseinstanceOracle最活跃的部分不叫数据库叫实例,比如内存的不断分配和释放,还有数据来回交换写到数据块里面。数据库是一个相对静止的东西。

 

Redo文件只有三组,如果第三组写满之后就会将第一组覆盖,在覆盖之前需要备份,备份出来的文件就叫做归档Archive log file

 

进程实际上是分为三种的,一种是Oracle的后台进程,专门为Oracle干活的,PMON,SMON.DBWR,LGWR,CKPT,这些都是Oracle的后台进程,为实例服务的。服务端进程和客户端进程是相对的,一般来说Oracle有两种模式,默认是专有模式,当用户发出请求的时候,客户端通过监听器连接过去的时候,同时会在Oracle端起一个进程来响应。Oracle端的进程和客户端进程一通信就组成了会话。数据库端的进程是执行用户发出的请求的,然后将最终的结果返回给用户。


从下往上看,最下面有一个用户进程,首先向数据库发送了一条sql语句,那么数据库端就会启动一个server processclient processserver process组成了一个会话session。然后server process就会处理用户的一些请求。这些请求,sql语句是放在pga里面,就是说服务端的进程要开一块内存,这个内存就叫做pga,里面包含了一些会话和私有的一些内存和私有的sql语句。然后服务器端的进程开辟了内存之后就要执行sql语句了。执行sql语句就要访问sga了。实际上先去share pool里面解析sql语句,解析了sql语句得到了执行计划之后,再按照这个执行计划访问数据,有了执行计划先去内存里面找数据,先去data bufferc ache里面找。找不到话就会去磁盘上面读取数据,在磁盘上面读取数据不是要后台进程读数据,而是server process将磁盘上面的数据读取到data buffer cache里面。假设用户要修改数据就会在data buffer cache里面将数据块改了。修改了数据块就产生了一系列的问题,修改了数据块就产生了一个redo log buffer重做日志,凡是修改了的东西都要产生重做日志。这个时候如果用户发出来一个commit,会话将这个事务提交了redo就会将里面的数据通过LGWR这个进程写到磁盘上面,如果发出来checkpoint这样的命令检查点,这个时候数据又会由另外一个进程DBWN将修改后的数据写到磁盘上面。


Share pool这个区域就是sql语句解析方面的信息和字典的数据。比如一条sql语句的解析就要在share pool里面。

数据缓冲区是放数据块的,实际就是数据库文件被读到内存里面就放在数据缓冲区里面。

重做日志,凡是Oracle修改了数据块在Oracle里面都要产生重做日志。


先是在share pool里面将sql语句进行解析生成执行计划,之后到数据缓冲区里面寻找所需要的数据块,如果数据不在数据缓冲区,那么就会在磁盘上面将数据读取到数据缓冲区里面。

对于查询来说这个过程差不多就基本结束了,如果要对数据块进行修改那么Oracle就会产生重做日志了,重做日志就放在重做日志的内存里面。只要日志写到磁盘上面了那么数据块没有写到磁盘上面都没有关系,即使这个时候机器掉电了,数据块在内存里面丢了没有写到磁盘上面都可以通过重做日志将其恢复。

所以基本上来说sga区里面就发生了图片上的三件事情。

show parameter sga;查看sga的参数

NAME         TYPE        VALUE

------------ ----------- -----

lock_sga     boolean     FALSE

pre_page_sga boolean     FALSE

sga_max_size big integer 3248M

sga_target   big integer 0   0代表自动调整

 

show parameter memory;查看分配的内存  包括sga pga

NAME                     TYPE        VALUE

------------------------ ----------- -----

hi_shared_memory_address integer     0     

memory_max_target        big integer 3248M

memory_target            big integer 3248M 分配的内存大小是SGA+PGA总大小

shared_memory_address    integer     0  

 

 

查看sga多大

show sga;

NAME                     TYPE        VALUE

------------------------ ----------- -----

hi_shared_memory_address integer     0     

memory_max_target        big integer 3248M

memory_target            big integer 3248M

shared_memory_address    integer     0     

Total System Global Area   3390558208 bytes    可以看到sga现在有3个多g的内存。      

Fixed Size                    2180464 bytes  

Variable Size              2113931920 bytes      

Database Buffers           1258291200 bytes      

Redo Buffers                 16154624 bytes


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值