oracle 体系结构

1)oracle server :database + instance
2)database:data file 、control file 、 redolog file
3)instance(实例):access a database

1、在启动database时,建立instance
2、一个instance 只能访问一个database
3、一个database可以有多个instance访问(RAC 集群环境)
----------oracle memory: sga + pga
memory_max_target :系统分配给oracle的最大内存空间(可以设定为物理内存的80%)

memory_target :Oracle 可用的内存空间(memory_target <=memory_max_target),如果memory_target 是一个非零的数值,就启用了oracle的内存自动管理,对oracle11g,不用再去设置sga_target 和 数值,就启用了oracle的内存自动管理,对oracle11g,不用再去设置sga_target 和pga_aggregate_target。

4)instance : sga + backgroud process
5)sga组成:sga 在一个instance只有一个sga,sga所有的session共享;随着instance启动而分配,instance down ,sga被释放。

--------查看OS分配给oracle的内存
[oracle@work oradata]$ ipcs

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status 
0x995eb2e8 65537 oracle 640 379584512 18

------ Semaphore Arrays --------
key semid owner perms nsems 
0xbe3edae0 98304 oracle 640 44

------ Message Queues --------
key msqid owner perms used-bytes messages

[oracle@work oradata]$ ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status 
0x995eb2e8 65537 oracle 640 379584512 18

6)share pool :存储最近访问的sql和plsql语句及数据字典,用于sql访问共享,减少sql硬解析(hard parse)。
sql 语句的执行过程:
例如:select ename,sal,deptno from emp where empno=7788;
①parse
首先对sql语句执行hash运算,得出一个hash值,再和libary cache保存的hash值进行对比,看是否有相同的hash值,如果有相同的hash值,说明这个sql被共享,找到这个保存的执行计划,进入第二步。
如果没找到相同hash值或sql第一次执行,先要对sql进行语法分析,语义分析(字段名、表名,访问数据字典,先从dict cache 访问,如果没有,从磁盘访问system 表空间,再读入dict cache)和查看权限;对sql进行编译,分析访问的对象,统计数据分布、建立执行计划,将执行计划保存到libray cache。

② 绑定变量
③execute (执行计划)
④fetch (从buffer cache 读取数据, 返回结果)(sql硬解析从头开始,软解析从执行计划开始)
library cache:存放最近最常使用的sql和plsql 代码,通过LRU的算法,管理共享的sql和pl/sql代码
dict cache: 存放数据字典信息

7)sga_target:sga内存分配自动管理(ASMM)
sga_target =0 关闭ASMM,>0 启动内存自动管理(可以对share pool、data buffer、large pool、java pool 可以实现自动管理)
sga_target<= sga_max_size

-------share pool 通过内存自动管理分配的空间为100m ,shared_pool_size 的大小是分配给share pool的最小值

8) data buffer:存放从datafile 里读出的数据块的镜像。(在oracle访问数据时,是以oracle block为单位)
----oracle 从磁盘读取数据是以块为单位,将读出的块放入到databuffer 中
db_block_size 指定了oracle 的标准块的大小,默认10g 为8k
db_cache_size --------指定default cache大小-----LRU 默认数据块放到default cache(可以通过内存的自动管理调整)
db_keep_cache_size 保留 存放经常使用小表和索引块等(数据块一直存放到buffer里,直到重启instance,大小需要手工指定,不能通过内存自动分配)
db_recycle_cache_size 回收 存放偶尔访问做全表扫描的表的数据块(数据块使用完后,自动被清理出内存,大小需要手工指定,不能通过内存自动分配)

db_cache_advice 建议data_buffer大小的调整

9) log buffer: 存放redo entries ,用于recover “先记后写”
---------当做DML或DDL 操作,修改数据块时,会生成日志条目,保存到log buffer,然后及时的写入到redo log file;当脏块(在内存中被修改的块)丢失时,可以通过redo 日志重做,恢复数据

10) large pool: 做批处理、备份恢复、用share server模式
当数据库分配一个server process建立session时,如果是dedicated server,会从pga分配内存给每个session(存放session信息、游标等);如果是shared server
从large pool 分配内存给每个session。
server process :
①dedicated 专有模式(一个user process 会有一个server process 提供服务)
②shared 共享模式(数据库先建立多个server process,当user process 访问数据库时,数据库会通过dispatch(调度器)分配server process 给user process。

11) java pool:java 代码的解析
12)stream pool 流池 :数据库高级复制

13)pga:随着server process分配给每一个session,随着server process终止,而被释放,独立非共享存放用户游标、变量、控制信息数据排序、存放hash值

14) process: user process、 server process 、background process
user process:客户端请求,不能直接和oracle server交互,必须通过server process 访问oracle server

 

posted on 2017-03-22 14:10  Tomatoes  阅读(172)  评论(0编辑  收藏  举报