1、Oracle 体系结构 2、Oracle 体系结构 1)oracle server :database + instance 2)database:data file 、control file 、redolog file 3)instance: an instance access a database 4)oracle memory: sga + pga 5)instance : sga + backgroud process 6)sga组成:sga 在一个instance只有一个sga,sga为所有session共享,随着instance启动而分配,instance down ,sga被释放。 3、SGA(系统全局区) 3.1 SGA的6个基本组件: 1) shared pool 共享池是对
sql、PL/
sql程序进行语法分析、编译、执行的内存区域。 共享池由库缓存(library cache),和数据字典缓存(data dictionary cache)以及结果缓存(result cache)等组成。 共享池的大小直接影响
数据库的
性能。 关于shared pool中的几个概念 library cache:
sql和pl
sql的解析场所,存放着所有编译过的
sql语句
代码,以备所有
用户共享。 data dictionary cache: 存放重要的数据字典信息,以备
数据库使用 server result cache: 存放服务器端的
sql结果集及PL/
sql函数返回值 User Global Area (UGA) 与共享服务器模式有关 2) database buffer cache 用于存储从磁盘数据
文件中读入的数据,为所有
用户共享。 服务器进程(server process)将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,则不需要再从磁盘读取。 数据缓冲区中被
修改的数据块(脏块)由
后台进程DBWR将其写入磁盘。 数据缓冲区的大小对
数据库的读取速度有直接的影响。 要弄明白Database Buffer Cache中的几个cache概念: Buffer pool=(default pool)+(nodefault pool) 其中: default pool(db_cache_size) //是标准块存放的内存空间大小,SGA
自动管理时此参数不用设置。使用LRU算法清理空间 nodefault pool: db_nk_cache_size //指定非标准块大小内存空间,比如2k、4k、16k、32k。 db_keep_cache_size //keep 存放经常访问的小表或索引等。 db_recycle_cache_size //与keep相反,存放偶尔做全表扫描的大表的数据。
sql> alter table scott.emp1 storage(buffer_pool keep);
sql> select segment_name,buffer_pool from dba_segments where segment_name='EMP1'; SEGMENT_NAME BUFFER_ --------------------------------------------------------------------------------- ------- EMP1 KEEP 2.2)default pool对应的参数是db_cache_size与标准块default block是配套的,如果default block是8k,db_cache_size这个参数将代替db_8k_cache_size。 如果要建立非标准块的表空间,先前要设定db buffer中的与之对应的db_nk_cache_size参数。 09:50:46
sql> alter system set db_16k_cache_size=8m; //改参数,先把db buffer里的16k cache建上。 09:50:49
sql> create tablespace tbs_16k datafile '/u01/oradata/timran11g/tbs16k01.dbf' size 10m blocksize 16k; 09:51:29
sql> select TABLESPACE_NAME,block_size from dba_tablespaces; TABLESPACE_NAME BLOCK_SIZE ------------------------------ ---------- SYSTEM 8192 UNDOTBS1 8192 SYSAUX 8192 TEMP 8192 USERS 8192 EXAMPLE 8192 TBS_16K 16384 2.3)查看buffer cache命中率: 18:28:20
sql>select (1-(sum(decode(name,'physical reads',value,0))/(sum(decode(name,'db block gets',0))+ sum(decode (name,'consistent gets',0))))) * 100 "Hit Ratio" from v$sysstat; Hit Ratio ---------- 97.6811923 3)redo log buffer(记录数据
文件的改变,例外:事务的回滚是不记录的) 日志条目(redo entries )记录了
数据库的所有
修改信息(
包括DML和DDL),为的是
数据库恢复,日志条目首先产生于日志缓冲区。 日志缓冲区较小,它是以字节为单位的,它极其重要。 18:29:04
sql> show parameter log_buffer NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_buffer integer 7057408 *注意:日志缓冲区的大小启动后就是固定不变的,如要调整只能通过
修改参数
文件后重新启动生效。不能动态
修改!不能由SGA
自动管理! 如果想让它是一个最小值,这样可以做: 18:30:24
sql> alter system set log_buffer =1 scope=spfile; //
修改动态参数
文件,下次启动有效。 18:31:20
sql> startup force 18:31:35
sql> show parameter log_buffer; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_buffer integer 2927616 //这就是最小值了 4)large pool(可选) 为了进行大的
后台进程操作而分配的内存空间,与shared pool管理不同,主要用于共享服务器的session memory,RMAN备份恢复以及并行
查询等。 5)java pool(可选) 为了java虚拟机及应用而分配的内存空间,包含所有session指定的JAVA
代码和数据。 6) stream pool(可选) 为了stream process而分配的内存空间。stream技术是为了在不同
数据库之间共享数据,因此,它只对使用了stream
数据库特性的系统是重要的。 3.2 sga的granules(颗粒):组成oracle内存的最小单位 SGA_MAX_SIZE Granule Size ---------------------------------------------- <=1 GB 4 MB 1GB -- 8GB 16 MB 8GB --16GB 32 MB 16GB--32GB 64 MB 32GB--64GB 128 MB 64GB--128GB 256 MB >128GB 512 MB 20:12:30
sql> select name,bytes/1024/1024 "Size(M)" from v$sgainfo; //在oracle里查看SGA分配情况 NAME Size(M) -------------------------------- ---------- Fixed SGA Size 1.2401123 Redo Buffers 1.84765625 Buffer Cache Size 56 Shared Pool Size 152 Large Pool Size 4 Java Pool Size 12 Streams Pool Size 4 Shared IO Pool Size 0 Granule Size 4 Maximum SGA Size
403.089844 Startup overhead in Shared Pool 40 Free SGA Memory Available 172 4、Oracle的进程: 三种process: 1)user process、 2)server process 、3)background process user process:属于客户端的process,一般分为三种形式,1)
sql*plus,2)应用程序,3)web方式(EM) 客户端请求,
sqlplus是客户端命令。 *注意:由user process造成的会话终止,系统将
自动回滚这个会话上的处于活动状态的事务。 如果windows作为客户端:可以通过查看任务管理器看到
sqlplus
用户进程: C:\Documents and Settings\timran>
sqlplus sys/system@timran11g as sysdba linux作为客户端时可以使用ps看到
sqlplus关键字: [oracle@timran ~]$ ps -ef |grep
sqlplus oracle 2353 2325 0 17:02 pts/0 00:00:00 rlwrap
sqlplus / as sysdba oracle 2354 2353 0 17:03 pts/1 00:00:00
sqlplus as sysdba oracle 2603 2445 0 17:25 pts/2 00:00:00 grep
sqlplus server process:这是服务器端的进程,user process不能直接访问Oracle,必须通过相应的server process访问实例,进而访问
数据库。 [oracle@timran ~]$ ps -ef |grep LOCAL oracle 2399 2354 1 17:03 ? 00:00:04 oracletimran11g (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 2503 1 0 17:05 ? 00:00:00 oracletimran11g (LOCAL=NO) oracle 2512 2445 0 17:07 pts/2 00:00:00 grep LOCAL [oracle@timran ~]$ //注意:在linux下看到的server process,(LOCAL=YES)是本地连接,(LOCAL=NO)是远程连接。 可以在oracle查看V$process视图,它
包括了当前所有的oracle进程,即
后台进程和服务器进程。
sql> select pid,program,background from v$process; background字段为1是background process,其余都是server process (还负责把磁盘中的数据读到内存中) 六个基本的
后台进程(background process) smon:系统监控进程 在实例崩溃之后,Oracle会
自动恢复实例。另一个作用是释放不再使用的临时段。 pmon:进程监控 1、当user process失败时,清理出现故障的进程。 释放所有当前挂起的锁定。释放服务器端使用的资源 2、监控空闲会话是否到达阀值 3、动态
注册监听 dbwn: 数据写入进程 1、将
修改后的缓冲区(脏buffer)数据写入数据
文件中。写脏块。 2、释放data buffer空间。 注意:以下几种情况发生时 dbwr都会写 1)ckpt发生,2)脏块太多时(阀值),3)db_buffer自由空间不够时,4)超时300秒,5)表空间read only/offline or temp tablespace/backup等 6)表drop或truncate 7)3秒会检查
sql> select kvittag,kvitval as "kvitval(%)",kvitdsc from x$kvit where kvittag in('kcbldq','kcbfsp'); KVITTAG KVITVAL KVITDSC ---------- ------- ---------------------------------------------------------------------- kcbldq 25 large dirty queue if kcbclw reaches this kcbfsp 40 Max percentage of LRU list foreground can scan for free 关于2)和3)的说明: kcbldq的kvitval=25 表示DRITY_list队列中dirty_buffer达到25%阀值时,DBWN被触发 kcbfsp的kvitval=40 表示LRU_list中free block低于40%时,DBWR被触发 注意: 1)服务器进程对数据
文件执行读操作,而DBWR负责对数据
文件执行写操作。 2)commit时dbwn有何举动?答案是:它什么也不做! lgwr:写日志条目,从redo log buffer到redo logfile (必须在dbwr写脏块之前写入日志) 负责将日志缓冲区中的日志条目写入日志
文件。 有多个日志
文件,该进程以循环的方式将数据写入
文件。 注意:以下4个状况发生时, lgwr都会写 1)commit,2)三分之一满或满1M,3)先于dbwr写(先记后写,先记日志后写脏块,保证未提交数据都能回滚),4)3秒(由DBWR的3秒传导而来) ckpt:
生成检查点,
通知或督促dbwr写脏块 完全检查点:保证数据一致性。增量检查点:不断更新控制
文件中的检查点位置,当发生实例崩溃时,可以尽量缩短实例恢复的时间。 arcn:归档模式下,发生日志切换时,把当前日志组中的
内容写入归档日志,作为备份历史日志。 注意:lgwr负责对联机日志
文件写操作,arcn负责读取联机日志
文件。其他进程与日志
文件不接触。 11g里又强调了其他几个
后台进程,它们都和
数据库性能有关,有关
内容将在053课程介绍: MMON: Oracle自我监视和自我调整的
支持进程(与AWR有关) MMNL:MMON的辅助进程(与ASH有关) MMAN:内存
自动管理,10g时推出,11g得到加强,在11g里这个进程负责Oracle内存结构(SGA+PGA)的
自动调整。 CJQN: 与job队列有关 5、PGA 属于oracle内存结构,存放
用户游标、变量、控制、数据排序、存放hash值。与SGA不同,PGA是独立的,非共享。 6、
用户与Oracle服务器的连接方式 6.1 专用连接模式(dedicated server process):(PPT-I-218) 对于客户端的每个user process,服务器端都会出现一个server process,会话与专用服务器之间存在一对一的映射。 对专用连接来说,
用户在客户端启动了一个应用程序,例如
sql*plus,就是在客户端启动一个
用户进程;与oracle服务器端连接成功后,会在服务器端
生成一个服务器进程,该服务器进程作为
用户进程的代理进程,代替客户端执行各种命令并把结果返回给客户端。
用户进程一旦中止,与之对应的服务器进程立刻中止。 专用连接的PGA的管理方式是私有的。Oracle缺省采用专用连接模式。 6.2 共享连接模式(shared server process):(PPT-I-219-222) 多个user process共享一个server process。它通过调度进程(dispatcher)与共享服务器连接,共享服务器实际上就是一种连接池机制(connectionpooling),连接池可以重用已有的超时连接,服务于其它活动会话。但容易产生锁等待。此种连接方式现在已经很少见了,但在OCP11g考试中有几个注意点与其有关。 *注意: 1)所有调度进程(dispatcher)共享一个公共的请求队列(resquest queue),但是每个调度进程都有与自己响应的队列(response queue)。 2)在共享服务器中会话是在SGA中的(UGA)存储信息,而不像专用连接那样在PGA中存储信息,这时的PGA的存储结构为堆栈空间。 6.3 驻留连接池模式(database resident connection pooling,简称DRCP): 适用于必须维持
数据库的永久连接。结合了专用服务器模式和共享服务器模式的特点,它提供了服务器连接池,但是放入连接池的是专用服务器。它使用连接代理(而不是专用服务器)连接客户机到
数据库,优点是可以用很少的内存处理大量并发连接。