ORACLE内存管理简述1

来源:互联网 发布:windows损坏文件 编辑:程序博客网 时间:2024/05/20 18:43

接触ORACLE一段时间了,假如在学校的话进行一个ORACLE的考试,出一个大题,简述下ORACLE的内存结构,字数不限制。

下面来解答下:ORACLE的内存由PGA、SGA、UGA组成

由SGA、PGA、UGA构成

UGA和PGA、SGA的关系

当采用共享服务器连接模式的时候,UGA在SGA中,当采用专用服务器连接的时候UGA在PGA中,从9i R1开始就分为两种方式管理

PGA

PGA的手动管理和自动管理

  1. 手动:sort_area_size、sort_area_retatined_size、hash_area_size排序区和散列区这些参数需要手动设置。9i中共享模式下必须手动设置这些参数,因为无法用自动管理。
  2. 自动:对于workarea_size_plicy 参数,在9i R1中是manual,在9i R2中默认是auto;10G也应该是auto;通过设置workarea_size_plicy 为auto,pga_aggregate_target为一个固定的数据来开启9i和10G中的pga自动管理。如果11G启用了memory_target参数为auto(PGA和SGA都自动管理),则pga_aggregate_target 一般显示为0。

SGA

其中SGA由以下几个主要部分构成和不同数据库区别

在v$sgastat中可以看到几个组件的大小

  1. (shared_pool_size)共享池 Shared Pool
  2. (db_*_catch_size)数据库缓冲区 Buffer Catch:存数据块缓存,必须把数据块读到此处才能进行操作。针对每个分了5个类型的缓存中2/4/8/16/32 K,由db_16k_cache_size、db_2k_cache_size、db_32k_cache_size、db_4k_cache_size、db_8k_cache_size、db_cache_size、db_keep_cache_size这8个参数来控制大小
  3. (java_pool_size)java池 Java Pool
  4. (log_buffer)重做日志缓存 Log Buffer
  5. 大池:在模拟I/O异步的时候,RMAN会用到;并行查询是,各个进行交换信息的地方;采用共享架构是也会用到这个地方。 6. 流池(从10G开始,用于数据库间传输)

SGA在9i、10G、11G数据库中管理区别:

在9i中以上各个组件手动设置大小:

9i中没有SGA自动管理的功能,必须进行手动设置各个组件大小

SQL> show parameter cache_sizeNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size                    big integer 0db_2k_cache_size                     big integer 0db_32k_cache_size                    big integer 0db_4k_cache_size                     big integer 0db_8k_cache_size                     big integer 0db_cache_size                        big integer 12884901888db_keep_cache_size                   big integer 0db_recycle_cache_size                big integer 0SQL> show parameter pool_sizeNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------global_context_pool_size             stringjava_pool_size                       big integer 67108864large_pool_size                      big integer 167772160olap_page_pool_size                  integer     4194304shared_pool_size                     big integer 3221225472SQL> show parameter log_bufferNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------log_buffer                           integer     104857600SQL> 

从10G开始有自动管理sga_target参数:

在10G中可以通过sga_target来

sys@ALMTEST> show parameter sgaNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------lock_sga                             boolean     FALSEpre_page_sga                         boolean     FALSEsga_max_size                         big integer 8G --用来设置SGA自动管理sga_target                           big integer 8G --用来设置SGA可以达到的最大大小-- 在10G中是没有memory_target 、shared_memory_address  这2个参数的sys@ALMTEST> show parameter memNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------hi_shared_memory_address             integer     0shared_memory_address                integer     0

11G开始有了全部内存的自动管理,只要设置一个参数memory_target 就OK了

设置了这个参数后,自动调整PGA和SGA的大小,

idle> show parameter sgaNAME                                 TYPE                   VALUE------------------------------------ ---------------------- ------------------------------lock_sga                             boolean                FALSEpre_page_sga                         boolean                FALSEsga_max_size                         big integer            812Msga_target                           big integer            0idle> show parameter memNAME                                 TYPE                   VALUE------------------------------------ ---------------------- ------------------------------hi_shared_memory_address             integer                0memory_max_target                    big integer            812Mmemory_target                        big integer            812Mshared_memory_address                integer                0idle> 

各个数据库版本粒度大小单位是一般是16M或者4M,这个颗粒度大小是动态变化的

例如下面的两个例子分别取自9i和10G的值,如果想分配一个5MB的java池,颗粒大小是4M,则实际上分配的java池大小为8M,集按照颗粒来分配的

SQL> select component,granule_size from v$sga_dynamic_components;COMPONENT                                                        GRANULE_SIZE---------------------------------------------------------------- ------------shared pool                                                          16777216large pool                                                           16777216buffer cache                                                         16777216

10G

sys@ALMTEST> select component,granule_size from v$sga_dynamic_components;COMPONENT                                                        GRANULE_SIZE---------------------------------------------------------------- ------------shared pool                                                          16777216large pool                                                           16777216java pool                                                            16777216streams pool                                                         16777216DEFAULT buffer cache                                                 16777216KEEP buffer cache                                                    16777216RECYCLE buffer cache                                                 16777216DEFAULT 2K buffer cache                                              16777216DEFAULT 4K buffer cache                                              16777216DEFAULT 8K buffer cache                                              16777216DEFAULT 16K buffer cache                                             16777216DEFAULT 32K buffer cache                                             16777216ASM Buffer Cache                                                     1677721613 rows selected.sys@ALMTEST> 

11G中的颗粒大小是16M,这个颗粒大小是动态变化的,一般SGA越大,颗粒也就越大。

idle> /COMPONENT                                               GRANULE_SIZE------------------------------------------------------- ------------shared pool                                                  4194304large pool                                                   4194304java pool                                                    4194304streams pool                                                 4194304DEFAULT buffer cache                                         4194304KEEP buffer cache                                            4194304RECYCLE buffer cache                                         4194304DEFAULT 2K buffer cache                                      4194304DEFAULT 4K buffer cache                                      4194304DEFAULT 8K buffer cache                                      4194304DEFAULT 16K buffer cache                                     4194304DEFAULT 32K buffer cache                                     4194304Shared IO Pool                                               4194304ASM Buffer Cache                                             419430414 rows selected.idle> 

SGA各个组件的作用

共享池的组成 (以下几部分占得比例大小由oracle自动调整)

  1. 库缓存:存放执行计划,当相同的sql过来的时候可以直接在这拿到执行计划,不用再解析一次;还存放最近用的sql、pl/sql 语句,
  2. 数据字典缓存:提高硬解析的性能,减少硬解析的物理读,存放最近用到的对象的定义
  3. 结果集团缓存(11G新增):这儿和缓存区缓存有点像,我理解的是这儿放的是逻辑数据,拿出来就能用,而缓冲区缓存放的是热数据块,也需要进行逻辑读的。

redo缓存区

当对数据进行修改的时候都会产生针对这个修改一个重做项目(Redo Entry),先放到日志缓冲区中,然后再有LGWR进程将日志缓存区的REDO Entry 写入到联机日志中,如果实例崩溃,则下次重新启动实例时,依照联机日志中的Redo Entry 再执行一次,便可以将事务全数恢复。
在下面几个情况下会发生向磁盘的输出:
1. 每3秒
2. commit事务
3. 要求LGWR切换日志
4. 缓冲区1/3满,或者超过了1MB的缓存日志数据

即便Redo Entry在写到联机日志前就崩溃了,日志缓冲区的所有Redo Entry 丢失了,也不会造成已经提交的事务无法恢复,因为实例要求事务提交前,必须将事务提交的Redo Entry 写到联机重做日志文件后,才回复事务已经提交的信息,也就是说当用户看到commit成功的消息后,Redo Entry已经写入到联机日志当中了。

当实例正常停止的时候,没有写入到联机日志的Redo Entry 一定属于目前正在运行的事务,既然未提交,那么可以就不恢复。

由LOG_BUFFER这参数决定,必须是文件系统的倍数。用 select max(lebsz) log_blk_size from sys.x$kccle 查文件系统快的大小。

这个大小有log_buffer参数来决定,但是不是唯一决定的还和操作系统数据库的版本及其他参数设置有关系。一般都是很小小的,几MB而已。

块缓冲区

0 0