没有合适的资源?快使用搜索试试~ 我知道了~
试谈ORACLE的工作机制(82页)(正式版).pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 120 浏览量
2021-12-19
16:04:58
上传
评论
收藏 266KB PDF 举报
温馨提示
试读
50页
试谈ORACLE的工作机制(82页)(正式版).pdf
资源详情
资源评论
ORACLE 的工作机制
体系结构
实例
Oracle 运行的时候, 在内存中会要开辟一个区间, 这个区间主要是用于从磁盘 (数据文
件)中读出数据后的一个在内存的缓存和处理。而处理这些数据的操作,需要有一些系统的
后台进程, 这些进行在 Oracle 数据库启动的时候, 就开始运行, 一直在响应前台的操作。 实
际上,这一个区间( SGA)和这些后台进程合在一起,就称为 实例。实例是包括 SGA区和后
台进程两个部分的。
数据库启动执行若干动作,经历三个阶段,分别是未加载、加载和打开。
1、未加载( nomount) 可以把数据库启动的这一阶段看作是 Oracle 实例的启动。
这种方式启动下可执行: 重建控制文件、重建数据库 。这一启动命令:
? 读取数据库参数文件。
? 启动所需的后台进程并按参数文件中的定义分配内存。
? 将进展情况写入告警日志文件中。
2、加载( mount) 在实例启动加载阶段,数据库参数文件中指定的控制文件被读
取。记住控制文件将数据库各部分联系在一起。实例从控制文件中找到下列信息,然
后将进展写入告警日志文件。 这种方式启动下可执行: 数据库日志归档、 数据库恢复、
重新命名一些数据库文件 :
? 所有数据文件和重做日志文件的名称和位置。
? 数据库名。
? 最新系统更改号( S C N)。
3、打开( open) 包含在数据库中的每个联机数据文件在数据库打开前必须被同
步。在数据库打开阶段:
? 所有联机数据文件的头与控制文件信息相比较。
? 所有文件同步后,数据库打开。
当数据库关闭时,取决于它的关闭方式执行不同的任务:
?正常( normal )在所有的用户离线后发生的正常关闭。
?事务( transactional )事务关闭就是当所有的用户执行完当前的事务后,将用
户从数据库上清除。
?立即( immediate )立即关闭就是从数据库清除所有当前用户之后,回退所有未
完成的操作。
?异常( abort )异常关闭没有给数据库任何整理的机会。这种方式关闭后需要实
行崩溃恢复。
实例是数据管理的核心—它做所有的工作,而数据库存储所有的数据。
其他启动方式:
?startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR: ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
?startup force
强制启动方式
当不能关闭数据库时,可以用 startup force 来完成数据库的关闭
先关闭数据库,再执行正常启动数据库命令
?startup pfile= 参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
?startup EXCLUSIVE
***************
一个 Delete 操作的流程:
1、 检查语法、 语义( V$ROWCACHE :data dictionary cache),计算 HASH VALUE,
在session 的UGA中进行匹配 (session_cached_cursors ),如果 UGA中没有,
在library chache 中匹配( library chache lock latch 保护 library
chache lock 对地址堆的访问,而后 library chache pin latch 保护
library cache pin 对library cache 中sql 相关信息的访问)
2、 根据执行计划读取数据: cache buffer chain latch 保护能定位到 buffer
header 并 pin 住该块(如果没有 buffer header ,就 pin 住某个空块 (没
有空块就产生 free buffer waits ),并到数据文件中读取) 。如果此时有
某个进程想访问该块,将产生 buffer busy waits 。
3、 在redo log buffer 中记录 delete 操作的细节。 (包括 回滚段 前后镜像、 数
据块 前后镜像)。
4、 在相应 回滚段 段头的事务表中创建一个 undo条目,把将要删除的记录创建
前镜像 , 存放到 Undo Block 中。
5、 在Buffer Cache 中的相应数据块上删除记录,并且标记相应的数据块为
Dirty 。
提交 (COMMIT)
1.Oracle 产生一个 SCN
2. 在回滚段事务表中标记该事务状态为 commited
3.LGWR Flush Log Buffer 到日志文件
3. 如果此时数据块仍然在 Buffer Cache 中,那么 SCN将被记录到 Block Header 上,
这被称为快速提交 (fast commit)
4. 如果 dirty block 已经被写回到磁盘,那么下一个访问这个 block 的进程将会自
回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交 SCN并写
回到 Block Header 上。这被称为延迟块清除 (delayed block cleanout) 。
内存
SGA(系统全局区、共享全局区) 、PGA(进程全局区、私有全局区)
内存分配原则:
10%冗余内存, OS SYS进程(约 1.6G),OS BUFFER(约 0.8G),数据库连接消耗内存(每
个连接约 5~8M),PGA(每个连接约 2M,V$PGA_TARGET_ADVICE),SGA
SGA
v$sgastat
注意 show parameter sga_max_size
Oracle 的内存:
软件代码区
系统全局区
进程全局区:包含单个进程的数据和控制信息
排序区
SGA 中的 The fixed area 包含了数千个原子变量 ,以及如 指向 SGA 中其它区域的
pointers(指针 )等小的数据结构 .通过对 fixed table 内表 X$KSMFSV 查询 (如下 )可以获得这些变
量的名字 ,变量类型 ,大小和在内存中的地址 .
the variable area 是由 large pool 和 shared pool 组成
Shared pool 中永久性的内存包含各种 数据结构 如 :the buffer headers, processes, sessions,
transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays
for recording statistics. 其中大部分的 SIZE 是依靠初始参数的设置来确定的 .这些初始参数只能
在实例被关闭的状态下才能够进行修改 .所以这里说的永久性是针对实例打开状态下的生存
期而言 .
The variable area 的 在 SGA 中 的 SIZES 就 等 于
LARGE_POOL_SIZE,SHARED_POOL_SIZE 和永久性的内存 arrays 的 SIZE 三者相加 .
永 久 性 内 存 arrays 的 SIZE=the variable area -
(LARGE_POOL_SIZE+SHARED_POOL_SIZE).
数据缓冲区命中率
v$sysstat
这里命中率的计算应该是
令 x = physical reads direct + physical reads direct (lob)
命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100
通常如果发现命中率低于 90%,则应该调整应用可可以考虑是否增大数据缓冲区
共享池的命中率
SQL> select sum(pinhits-reloads)/sum(pins)*100 "hit radio" from v$librarycache;
hit radio
----------
99.809291
假如共享池的命中率低于 95%,就要考虑调整应用(通常是没使用 bind var )或者增加
内存
关于排序部分
SQL> select name,value from v$sysstat where name like '%sort%';
NAME VALUE
---------------------------------------------------------------- ----------
sorts (memory) 67935
Database Buffers
Redo buffers
cache
User Global Area
db_cache_size
db_keep_cache_siz
e
db_recycle_cache_s
ize
db_nk_cache_size
永久性内存结构
sorts (disk) 1
sorts (rows) 7070
假如我们发现 sorts (disk)/ (sorts (memory)+ sorts (disk)) 的比例过高,则通常意
味着 sort_area_size 部分内存较小,可考虑调整相应的参数。
关于 log_buffer
SQL> select name,value from v$sysstat
2 where name in('redo entries','redo buffer allocation retries');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 2325719
redo buffer allocation retries 10
假如 redo buffer allocation retries/ redo entries 的比例超过 1%我们就可以考虑
增大 log_buffer
如何在 Linux 上扩展 SGA 超过 1.7G
共享池( SHARED_POOL_SIZE)
v$shared_pool_advice
ALTER SYSTEM FLUSH SHARED_POOL
How to Keep Objects -- 重点
使用 DBMS_SHARED_POOL.KEEP过程来 keep objects, UNKEEP过程从 shared pool 中移走
pinned objects
execute dbms_shared_pool.keep('address,hash_value'); -- keep 该匿名块
共享池包括 库高速缓存 ( library cache ) 、数据字典高速缓存和服务器控制结构 (例如
数据库字符集) 。 Oracle 服务器用库高速缓存来提高执行 SQL语句的性能;库高速缓存包括
共享和专用 SQL区。共享 SQL区包括 SQL语句语法分析树和执行路径,而专用 SQL区存储特
定的会话信息,例如捆绑变量、环境和会话参数、运行堆栈和缓冲区等。
Soft parse 使用的资源包括 CPU 和 library cache latch gets
Hard parse 是指要解析的 SQL没有在 library cache 中,或者执行的时候发现解析过的
SQL已经 aged out ,就是离开了 library cache ,称为 Library cache misses .使用的资源
包括额外的 CPU, library cache latch gets, 以及 shared pool latch gets.
专用 SQL区在每个事务初始化时创建,在与专用 SQL区相关的游标关闭时被释放。一个
用户会话能够一次打开的专用 SQL区的数量由 init.ora 参数 OPEN_CURSORS决定。使用这两
个结构, Oracle 服务器能够重用一条 SQL语句的所有执行的共同信息。与此同时,可以从专
用 SQL区中查询执行的特定会话信息。
注意游标使用过程中并不关闭游标的应用会继续为应用分配越来越多的内存,部分原因
是为每个打开的游标分配了专用 SQL区。
库高速缓存中的专用 SQL区可更进一步分为永久区和运行区。
共享池的大小取决于 init.ora 文件参数 SHARED_POOL_SIZE,它是以字节为单位的。你
必须将这个值设得足够大, 以确保有足够的可用空间来装载和存储 PL/SQL 块和 SQL语句。共
享区经过长期装卸和卸载数据对象会产生许多碎片,如果在共享池中没有足够的连续空间用
来装载目标数据,会产生错误。解决这个问题的捷径是运行 SQL命令 ALTER SYSTEM FLUSH
SHARED_POOL。但是如果在数据库操作时,经常遇到共享池错误,你必须增大共享池
Library cache 包含 shared SQL and PL/SQL areas(PL/SQL 包括 Procedures,
Functions, Packages, Trigger, 匿名 PL/SQL 块)
Sizing the Library Cache
定义 stored object(packages,views 等等 ) 的内存需求; 定义经常使用的 sql statement
的所需内存
1. 初始时将 SHARED_POOL_SIZE设得很大 , 运行应用程序
2. 计算 stored object 所占的内存
SELECT SUM(sharable_mem) FROM v$db_object_cache WHERE type =
'PACKAGE' or type = 'PACKAGE BODY' or type = 'FUNCTION' or type = 'PROCEDURE';
3. 应用程序运行一段时间后 , 估计常用 sql 语句所占的内存 ( 不包括动态 SQL)
SELECT SUM(sharable_mem) FROM v$sqlarea WHERE executions > 5;
4. 对每个 user 每个打开的 cursor, 需要 250bytes, 可在运行高峰期间使用查询 :
SELECT SUM(250 * users_opening) FROM v$sqlarea;
5. 在测试环境中 , 可让一个用户打开一定数量的 cursor, 运行下列语句测试共享内存 ,
然后乘上 user 数
SELECT 250 * value bytes_per_user FROM v$sesstat s, v$statname
n WHERE s.statistic# = n.statistic# AND n.name = 'opened cursors current' AND
s.sid = 15;
以上内存的和 , 再加上一点内存 ( 留给动态 SQL使用 ), 作为你的应用的理想内存设置;预
留一部分空间作为大的内存需要 , 避免 miss 和碎片;一些大的内存需要 : PL/SQL 块的编
译,trigger 的编译;小的 object 不会使预留空间碎片化 , 反而保证 reserved list 有大的连
续块 , 一旦从 reserved list 中分配的内存释放它就返回 reserved list 。
影响的参数: SHARED_POOL_RESERVED_SIZE 初始值 =SHARED_POOL_SIZE*10%, 超过
50%,oracle server 报错
OPEN_CURSORS 缺省 =50
定义了涉及分配给用户进程的私有 SQL区域的 cursors 数量 , 一个 private SQL area
一直存在直至 cursor 关闭 ; 为了利用更多的内存给共享 SQL区域 , 需要提高 session 每个
session 允许多 cursor 数量 , 开发人员应关闭不需要的 cursor 节省内存
CURSOR_SPACE_FOR_TIME缺省 =FALSE 布尔值
设置 TRUE,表示以空间换取时间 , 共享 SQL区不会被 aged out 直至相关的 cursor 被关闭 ,
因此确信有足够的内存 , 没有 cache miss; 除非 RELOADS in V$LIBRARYCACHE一直为 0, 否则不
要改变此参数值
若应用为 FORM或使用动态 SQL,设此值为 FALSE -- 因为动态 sql 总是不一致 , 将占用过
多内存
SESSION_CACHED_CURSORS缺省 =0 表示没有 cache
当一个 session 打算关闭一个 cursor 时, 如果这个 cursor 的 parse count 超过 3 次, 那
么这个 cursor 将会被加到 session cursor cache list 的 MRU端. 当一个 session 打算 parse
一个 sql 时, 它会先去 session 的 pga 内搜索 session cursor cache list, 如果找到那么会
把这个 cursor 脱离 list, 然后当关闭的时候再把这个 cursor 加到 MRU端.
session_cached_cursor 提供了快速软分析的功能 , 提供了比 soft parse 更高的性能 .
检查系统是否需要此参数的方法 :
对某个典型用户 session
select a.sid,b.name,a.value from v$sesstat a,v$statname b where
剩余49页未读,继续阅读
pfsmdsj
- 粉丝: 1
- 资源: 4万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0
最新资源