oracle体系结构-实例篇
用户访问
oracle
数据库路径
用户进程
-
监听
-
服务器进程
-PGA-SGA-DBWn-
数据文件
1.1 oracle数据服务器
-oracle
实例:
SGA
内存区域与后台进程
Ø
用户必须通过
oracle
实例才能访问到
oracle
数据库
Ø
一个
oracle
实例只能对应一个
oracle
数据库
Ø
oracle
实例由内存结构与后台进程结构组成
Ø
查看
SGA
与后台进程
SQL> show parameter sga
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_SIZE
与
SGA_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_SIZE
和
SGA_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
Ø
关闭监听
Ø
sqlplus
中
SQL> alter system checkpoint;
运行几次此命名(将数据缓冲区内容写入到数据文件)
Ø
tail �Cf
查看
alertSID.log
日志文件
Ø
shutdown immediate
(关闭数据库)
Ø
查看
alertSID.log
输出信息,如果输出
dismount
信息,而且
shutdown immediate
卡住,则执行
shutdown abort
1.3 shared pool
用于存储最近执行的
sql
语句与数据对象定义信息
关键组件:
library cache
(
sql
)和
data dictionary cache
(数据定义)
利用
SGA
自动分配能够更好的利用内存,为了避免自动分配造成
shared_pool
或数据缓存区分配过小造成性能低下,通过人工设置
share pool
下限值,避免此消彼长过于严重,以保证数据库性能。
首先估算
shared_pool
与
buffer_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_pool
与
buffer_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 SGA与PGA大小的设置
当
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 �Cef | grep LOCAL=NO | grep �Cv grep | cut �Cc 9-15 | xargs kill -9
cut �Cc 9-15
意思是截取输入行的第
9
个到
15
个字符,即
PID
xargs
命令是用来把前面命令的输出结果(
PID
)作为
kill -9
命令的参数