[转]Fixed Size和variable_size等SGA区组成的含义

本文详细解析Oracle系统的SGA(系统全局区域),包括Total System Global Area、Fixed Size、Variable Size、Database Buffers及Redo Buffers等内容。介绍了这些组成部分的具体含义及其在不同版本中的变化,并深入探讨了Redo Buffers的配置与实际分配之间的差异。

SQL> show sga

Total System Global Area 105978600 bytes
Fixed Size 453352 bytes
Variable Size 50331648 bytes
Database Buffers 54525952 bytes
Redo Buffers 667648 bytes
SQL>

 

Fixed Size:
oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息,可以看作引导建立SGA的区域。

 

Variable Size:
包含了shared_pool_size、java_pool_size、large_pool_size 等内存设置

 

Database Buffers:
指数据缓冲区,在8i 中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三部分内存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、 db_nk_cache_size。

 

Redo Buffers:
指日志缓冲区,log_buffer。在这里要额外说明一点的是,对于v$parameter、v$sgastat、v$sga查询值可能不一样。v$parameter 里面的值,是指用户在初始化参数文件里面设置的值,v$sgastat是oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block 为最小单位进行分配的),v$sga 里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小是8k(不同环境可能不一样) .

=========================================================

 

关于show sga结果的描述

Total System Global Area AAAAA bytes

Fixed Size BBBBB bytes

Variable Size CCCCC bytes

Database Buffers DDDDD bytes

Redo Buffers EEEEE bytes

 

fixes size : oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分 组件 的信息,可以看作 引导 建立 SGA 的区域

Variable Size : 包括 shared pool ,java pool ,large pool, 管理DB_BLOCK_BUFFERS 的内存,管理控制文件信息的内存,等等其他管理和控制 oracle 内部结构的内存

redo buffer

1: 设置参数

SQL> show parameters log_buffer

NAME TYPE VALUE

------------------------------------ ------- ------------------------------

log_buffer integer 524288

 

2:日志内存大小

SQL> select * from v$sgastat where name like '%log%';

POOL NAME BYTES

----------- -------------------------- ----------

log_buffer 656384

 

 

3 : 为了保护日志内存,而增加了辅助的内存,也就是保护页

SQL> show sga

Total System Global Area 496049552 bytes

Fixed Size 454032 bytes

Variable Size 109051904 bytes

Database Buffers 385875968 bytes

Redo Buffers 667648 bytes

SQL>

对于数据库来说,在不同 的平台下

log_buffer 是离散的 一组值,假设是集合 R,并且不是按照 os blockck 或者 db block 为步长增加的,(比如可能是 65k,128k,512k ,641k....这样的值) 当设置参数为某个值的时候,数据库选择的实际大小是 大于等于 该值 的 min(R) ,根据这组值,比如你设置了 log_buffer = 600k ,则实际选择的是641 k

然后,在实际分配内存的时候,为了 给 log buffer 做一些保护,还另外分配了一小部分空间,通常是 11 k 大小。

则有641+11 = 652 k

这才是 最后真正的 内存大小 ,也就是 show SGA 时候显示大小。

 

转自:http://tolywang.itpub.net/post/48/381366

<think>嗯,我现在遇到了ORA-01102错误,Oracle数据库无法以独占模式挂载。这个问题该怎么解决呢?让我仔细想想。根据用户提供的引用,首先可能的原因是什么。引用[1]提到,可能是有其他实例已经以独占方式挂载了数据库,或者锁文件lk<SID>存在。比如,如果之前数据库没有正常关闭,锁文件可能残留,导致新实例无法挂载。 那解决方法的第一步应该是检查锁文件是否存在,路径在$ORACLE_HOME/dbs/lk<SID>,用户需要确认是否真的有这个文件。如果有的话,可能需要删除它,但得先确保没有其他进程正在使用数据库。引用[4]提到使用fuser命令来查看占用进程,比如sbin/fuser -u /path/to/lkHSDB,然后杀掉相关进程。不过要注意权限问题,可能需要用root用户操作。 接下来,如果是RAC环境,问题可能不同。引用[3]指出,在RAC集群中,参数cluster_database的设置是否正确。如果误设为TRUE,而实际是单实例,就会出问题。这时候需要用alter system命令修改参数,并重启实例。例如,将cluster_database设置为FALSE,或者在节点上调整参数。 另外,调整内存参数后出现这个问题,比如修改了MEMORY_TARGET、SGA_TARGET或PGA_AGGREGATE_TARGET,可能会导致共享内存段未正确释放。这时候需要检查共享内存信号量,使用ipcs -maipcrm命令清理残留的Oracle进程占用的资源。不过操作这些命令需要小心,避免影响其他运行中的实例。 还有可能,数据库在之前的关闭过程中没有正常完成,导致资源未被释放。这时候可能需要强制卸载并重新启动。例如,先执行shutdown abort,然后startup,但需要注意数据的一致性可能会受影响,可能需要恢复。 总结一下,解决步骤应该是: 1. 检查锁文件lk<SID>,删除并处理残留进程。 2. 检查是否是RAC配置错误,调整cluster_database参数。 3. 清理共享内存信号量。 4. 强制关闭并重启实例。 5. 验证内存参数调整后的设置是否合适,避免资源不足或冲突。 同时,用户需要根据不同的Oracle版本(11g或12c)注意参数的兼容性,以及操作时的权限问题。比如,在Linux下使用fuser可能需要root权限,而清理共享内存可能需要oracle用户权限。此外,修改参数后需要重新启动实例才能使设置生效。 需要注意的是,如果调整了内存参数,比如增加了MEMORY_TARGET,但系统可用内存不足,可能会导致实例启动失败,进而引发ORA-01102。因此,在调整参数后,需要确认系统资源是否足够,必要时调整参数值或增加系统内存。 可能还有其他原因,比如操作系统级别的资源限制,或者存储权限问题,导致数据库无法挂载。这时候需要检查告警日志,获取更详细的错误信息,帮助定位问题根源。</think>### ORA-01102: 无法以独占模式挂载数据库的解决步骤 #### 1. **检查锁文件(lk\<SID\>)** - **路径**:`$ORACLE_HOME/dbs/lk<SID>`(例如:`/u01/app/oracle/product/11.2.0/db_1/dbs/lkHSDB`)[^4]。 - **操作**: - 若文件存在,删除前需确认无其他进程占用: ```bash # 查看占用进程 fuser -u /path/to/lk<SID> # 终止相关进程(需root权限) kill -9 <PID> ``` - 删除锁文件: ```bash rm $ORACLE_HOME/dbs/lk<SID> ``` #### 2. **检查RAC集群配置** - **问题**:若误将单实例配置为集群模式(`cluster_database=true`),会导致冲突[^3]。 - **解决**: ```sql -- 修改参数 alter system set cluster_database=false scope=spfile; -- 重启实例 shutdown immediate; startup; ``` #### 3. **清理共享内存与信号量** - **步骤**: ```bash # 查看共享内存段 ipcs -ma # 清理Oracle残留资源(根据查询结果) ipcrm -m <shmid> ipcrm -s <semid> ``` #### 4. **强制重启实例** - **操作**: ```sql -- 强制关闭 shutdown abort; -- 重新挂载 startup; ``` #### 5. **验证内存参数调整** - **关键参数**:`MEMORY_TARGET`、`SGA_TARGET`、`PGA_AGGREGATE_TARGET`需适配系统可用资源。 - **检查与修改**: ```sql -- 查看当前值 show parameter memory_target; show parameter sga_target; -- 若需调整(示例) alter system set memory_target=2G scope=spfile; ``` #### 6. **检查告警日志定位根源** - **路径**:`$ORACLE_BASE/diag/rdbms/<DB_NAME>/<SID>/trace/alert_<SID>.log` - **作用**:日志中可能包含文件权限错误、资源竞争等详细信息。 ### 附加注意事项 - **权限问题**:操作锁文件或清理共享内存时,需确保使用`oracle`用户或`root`权限。 - **版本差异**:Oracle 12c引入多租户特性,需确认是否涉及PDB/CDB配置影响挂载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值