oracle体系结构-实例篇

用户访问oracle数据库路径
用户进程-监听-服务器进程-PGA-SGA-DBWn-数据文件

1.1     oracle数据服务器

-oracle实例:SGA内存区域与后台进程
Ø  用户必须通过oracle实例才能访问到oracle数据库
Ø  一个oracle实例只能对应一个oracle数据库
Ø  oracle实例由内存结构与后台进程结构组成
Ø  查看SGA与后台进程
SQL> show parameter sga
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 160M
sga_target                           big integer 160M
SQL> !ps -ef | grep ora_
oracle    5274     1  0 09:22 ?        00:00:12 ora_pmon_TEST
oracle    6935  6798  0 16:53 pts/1    00:00:00 /bin/bash -c ps -ef | grep ora_
-数据库
控制、数据、日志文件

1.2     system global area SGA

SGA的内存组成结构
shared pool
database buffer cache
redo log buffer
other structures e.g.lock and latch management,statistical data
另外两个可选组件
large pool
java pool
SGA是动态的,最大值由SGA_MAX_SIZE参数控制。SGA_MAX_SIZESGA_TARGET的关系:
oracle运行过程中,修改SGA_TARGET值,不能大于SGA_MAX_SIZE
SQL> alter system set sga_max_size=200M scope=spfile;   

System altered.
SQL> alter system set sga_target=150M scope=both;

System altered.
#
scope=memory;只写到内存,当前生效,重启数据库后失效。
scope=spfile;将参数写到spfile文件,当前不生效,重启数据库后生效。
scope=both;以上两者
oracle启动前
Ø  如果SGA_MAX_SIZE配置值小于SGA_TARGET,那么在数据库启动后,SGA_MAX_SIZE=SGA_TARGET,在此期间SGA_TARGET值,不能再向上调整。
Ø  如果SGA_MAX_SIZE配置值大于SGA_TARGET,那么在数据库启动后,SGA_MAX_SIZESGA_TARGET分别使用自己的配置值。
SQL> startup force;
ORACLE instance started.

Total System Global Area  209715200 bytes
Fixed Size                  1218580 bytes
Variable Size             121636844 bytes
Database Buffers           83886080 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 200M
sga_target                           big integer 152M
#
startup force为强制重启命令,在生产环境下,应该:
Ø  操作系统sync
Ø  关闭监听
Ø  sqlplusSQL> alter system checkpoint;运行几次此命名(将数据缓冲区内容写入到数据文件)
Ø  tail –f 查看alertSID.log日志文件
Ø  shutdown immediate (关闭数据库)
Ø  查看alertSID.log输出信息,如果输出dismount信息,而且shutdown immediate卡住,则执行shutdown abort

1.3     shared pool

用于存储最近执行的sql语句与数据对象定义信息
关键组件:library cachesql)和data dictionary cache(数据定义)
利用SGA自动分配能够更好的利用内存,为了避免自动分配造成shared_pool或数据缓存区分配过小造成性能低下,通过人工设置share pool下限值,避免此消彼长过于严重,以保证数据库性能。
首先估算shared_poolbuffer_cache的实际使用量
select * from V$shared_pool_advice;
select * from V$db_cache_advice;

SQL> alter system set shared_pool_size=32M scope=both;

System altered.

shared_poolbuffer_cache设置内存量总和不能大于sga_target

1.4     database buffer cache

从数据文件检索出的数据块拷贝
Ø  通过缓存可以提升数据检索与更新性能
Ø  数据缓存机制通过lru算法完成
Ø  尺寸设置
sga自动管理
手工设置下限值
SQL> alter system set db_cache_size=80M scope=both;

1.5     redo log buffer cache

记录所有关于数据块的变化
Ø  主要用于数据库恢复
Ø  改变的数据都要依赖于redo日志条目
Ø  redo日志条目包含数据重建与重做信息
Ø  尺寸设置
sga自动管理
手工设置下限值
SQL> alter system set log_buffer=7057499 scope=spfile;
注意单位是字节

1.6     SGAPGA大小的设置

ESTD_PHYSICAL_READS值不再减小时,取SGA_SIZE对应值
SQL> select t.sga_size,t.estd_physical_reads from v$sga_target_advice t order by 1;

  SGA_SIZE ESTD_PHYSICAL_READS
---------- -------------------
        76                6574
       114                5664
       152                5664
       190                5664
       228                5664
       266                5664
       304                5664

7 rows selected.
SQL> alter system set sga_max_size=114M scope=spfile;

System altered.

SQL>  alter system set sga_target=114M scope=both;

System altered.

SQL> show parameter sga;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 200M
sga_target                           big integer 116M
# sga_max_size对应值,重启数据库后生效。
ESTD_PGA_CACHE_HIT_PERCENTAGE达到100%时,取PGA_TARGET_FOR_ESTIMATE对应值
SQL> select s.pga_target_for_estimate,s.estd_pga_cache_hit_percentage from v$pga_target_advice s order by 1;

PGA_TARGET_FOR_ESTIMATE ESTD_PGA_CACHE_HIT_PERCENTAGE
----------------------- -----------------------------
               12582912                           100
               16777216                           100
               20131840                           100

…… 

11 rows selected.
SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 16M
SQL> alter system set pga_aggregate_target=12582912 scope=both;
SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 12M

1.7     进程结构

oracle利用不同类型的进程来完成不同的任务
Ø  用户进程:用户与oracle实例之间连接时创建。sqlplus连接oracle
在用户与oracle服务器之间创建一个连接
oracle服务器端创建一个会话(session
查看自己的连接与会话 select * from V$session
Ø  服务器进程:用户连接oracle实例时在服务器端创建。
SQL> !ps -ef | grep LOCAL=NO
oracle    7198  6798  3 18:29 pts/1    00:00:00 /bin/bash -c ps -ef | grep LOCAL=NO
oracle    7200  7198  1 18:29 pts/1    00:00:00 grep LOCAL=NO
Ø  后台进程:当oracle实例启动时创建
SQL> !ps -ef | grep ora_

1.7.1  后台进程

1.         数据写进程(DBWn):
DBWn写入时间:
Ø  checkpoint检查点,将数据从内存中写入磁盘
Ø  无空闲数据内存
2.         日志写进程(LGWR
LGWR写入时间:
Ø  commit
Ø  日志缓存写满1/3
Ø  日志缓存写满1M
Ø  3秒钟
3.         系统监控进程(SMON
SMON作用:实例恢复,在oracle断电或者shutdown abort关闭数据库后,重新启动数据库时将执行“回滚日志文件中的记录修改”
4.         进程监控进程(PMON
在数据库运行过程中,清理失败的进程(锁* alter tables test01 disable table lock;)
5.         检查点进程(CKPT
作用:在checkpoint时通知DBWn将数据缓冲中的脏(在内存中修改过,还没写入硬盘的数据)数据写入数据文件

1.8     杀掉全部LOCAL=NO进程

避免当前连接服务器进程繁多,而导致关闭数据库服务时挂起,需要在关闭数据库之前,在操作系统上杀掉所有LOCAL=NO进程(用户连接oracle实例时在服务器端创建)
ps –ef | grep LOCAL=NO | grep –v grep | cut –c 9-15 | xargs kill -9
cut –c 9-15意思是截取输入行的第9个到15个字符,即PID
xargs命令是用来把前面命令的输出结果(PID)作为kill -9命令的参数