修改sga及共享池等造成out of memory 启动不起来数据库修复方法

本文介绍在Oracle10g环境下调整SGA参数的方法,包括如何解决因参数设置不当导致的数据库启动失败问题,提供了多种恢复及调整参数的方案。

本文章只针对oracle 10g。


笔者今天为了修改shared_pool_size 、large_pool_size等参数,首先需要加大sga_max_size与sga_target。

由于windows下的oracle,虽然内存有8g,但是oracle os内存没有那么大。

利用如下语句:

ALTER SYSTEM SET sga_max_size = 3000M COMMENT='internally adjusted' SCOPE=SPFILE

然后

shutdown immediate

startup

结果悲剧了。报了out of memory的错误,经过网上查找,才知道只能设置到1.7G。由于没有备份,参数又改错了,数据库启动不起来。网上说,找到$oracle_home\db_1\database\initSID.ora(如:如果sid为orcl对应为initorcl.ora),只要有这个文件,就可以将参数修正回来。但我发现我没有。发现在$oracle_home\db_1\dbs目录下的SPECIAL.ORA里面有我刚才修改的参数值,也就是说,将该文件破坏掉了。

后来经过探索,找到了比较简单的方式。步骤如下:

1. 找到initSID.ora文件

方式一:从自己的数据$oracle_home\admin\SID(如:orcl)\pfile下会得到init.ora.XXXX(一串数字),将其命名为initSID.ora(以下为了表述方便均以orcl为例)

方式二:如果方式一文件损坏,可以从同样10g数据库中$oracle_home\db_1\database\initorcl.ora和$oracle_home\admin\orcl\pfile下寻找,并命名为init.ora

方式三:如果以上都没有发现该文件,可以在另一台同样的oracle数据库服务器cmd下执行以下命令:

sqlplus /nolog

connect / as sysdba

create pfile='d:\initorcl.ora' from spfile;

去d盘拷贝该文件

2.在启动不起来的服务器执行一下命令

sqlplus /nolog

connect / as sysdba

startup pfile='xx路径\initorcl.ora

3.这时已经执行成功了,但是此时是pfile运行起来的,如果想改sga等参数,需要切回spfie启动,所以执行以下命令

create spfile from pfile

shutdown immediate

startup

此时,即可继续修改sga等参数。

4.此时数据库已经正常,但是我的修改sga还没有完成。此时学了乖,再修改参数前,将新增加的initorcl.ora备份

在sga只能配到1.7g的情况下,本人相关修改配置参考如下:

ALTER SYSTEM SET sga_max_size = 1700M COMMENT='internally adjusted' SCOPE=SPFILE
ALTER SYSTEM SET sga_target = 1700M SCOPE=BOTH

ALTER SYSTEM SET large_pool_size      = 1000M Scope=spfile;     -- 设置 大型池 大小(1G
)

ALTER SYSTEM SET shared_pool_size     = 268435456 Scope=spfile;     -- 设置 共享池 大小(256*1024*1024)
ALTER SYSTEM SET db_cache_size        = 268435456 Scope=spfile;     -- 设置 高速缓存 大小(256*1024*1024)
ALTER SYSTEM SET java_pool_size       = 33554432  Scope=spfile;     -- 设置 java池 大小( 32*1024*1024)
ALTER SYSTEM SET pga_aggregate_target = 268435456 Scope=spfile;     -- 设置 PGA总容量  (256*1024*1024)

5.经过反复实验,终于将sga、共享池、大池等参数配置完,为了保存自己这份参数成果,又执行了如下命令:

create pfile='d:\initorcl.ora' from spfile;

将该文件存盘,想给另一台数据库直接使用。

### Oracle 数据库内存足错误解决方案 当遇到 `System.Data.OracleClient.OracleConnection.Open()` 报错并提示内存足时,通常表明数据库实例或客户端应用程序的配置存在问题。以下是可能的原因及其对应的解决方法: #### 1. **检查数据库参数设置** 需要确认数据库的关键内存管理参数是否合理配置。例如: - 参数 `SGA_TARGET` 和 `PGA_AGGREGATE_TARGET` 定义了共享全局区 (SGA) 和程序全局区 (PGA) 的大小。如果这些值过低,则可能导致内存分配失败[^1]。 ```sql SHOW PARAMETER SGA_TARGET; SHOW PARAMETER PGA_AGGREGATE_TARGET; ``` 如果发现上述参数值较低,可以尝试调整它们以适应工作负载需求。 #### 2. **分析会话资源消耗** 使用视图 `V$SESSION` 和 `V$PROCESS` 来监控当前活动会话以及其占用的内存情况。通过以下查询定位高内存使用的进程: ```sql SELECT s.sid, p.spid, s.username, s.status, ROUND(p.pga_used_mem / 1024 / 1024, 2) AS pga_mb FROM v$session s JOIN v$process p ON s.paddr = p.addr WHERE p.pga_used_mem > 10 * 1024 * 1024; -- 查找超过10MB的会话 ``` #### 3. **优化SQL语句性能** 良设计的 SQL 查询可能会导致临时表空间膨胀或者过多的内存请求。建议启用自动跟踪工具来捕获执行计划中的瓶颈: ```sql ALTER SESSION SET TRACEFILE_IDENTIFIER='HighMemoryUsage'; ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; EXECUTE Your_Procedure_or_Query_Here(); ALTER SESSION SET EVENTS '10046 trace name context off'; ``` #### 4. **验证操作系统级别的限制** 操作系统的文件描述符数量、线程数或其他资源配额也可能影响到 Oracle 实例的表现。可以通过命令行查看 Linux/Unix 平台上的软硬限制: ```bash ulimit -a cat /proc/sys/kernel/pid_max sysctl vm.max_map_count ``` 若必要的话,增加相应的系统级阈值。 #### 5. **处理连接池泄漏** 对于 .NET 应用调用 `OracleConnection.Open()` 方法频繁抛异常的情况,需排查是否存在未关闭的 ADO.NET 连接对象。引入合适的连接字符串属性可以帮助缓解此现象: ```csharp string connectionString = "User Id=scott;Password=tiger;Data Source=orclpdb;" + "Pooling=true;Min Pool Size=5;Max Pool Size=20;"; using (var conn = new Oracle.ManagedDataAccess.Client.OracleConnection(connectionString)) { try { conn.Open(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } ``` --- ### 总结 以上措施涵盖了从数据库内部结构调整至外部环境适配等多个层面的内容。具体实施哪项取决于实际场景下的根本原因诊断结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值