oracle lock_sga ORA-00847

本文介绍了Oracle数据库中lock_sga参数的作用与配置方法。lock_sga可以将SGA锁定在物理内存中,避免使用虚拟内存导致性能下降。文章通过实例展示了如何设置此参数,并讨论了与MEMORY_TARGET等参数的兼容性问题。

oracle lock_sga

LOCK_SGA locks the entire SGA into physical memory. It is usually advisable to lock the SGA into real (physical) memory, especially if the use of virtual memory would include storing some of the SGA using disk space. This parameter is ignored on platforms that do not support it.

 

eg:

oracle:~ # su - oracle
oracle@oracle:~> sqlplus "/as sysdba"

SQL*Plus: Release 11.1.0.6.0 - Production on 星期四 6月 27 21:39:14 2013

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


连接到: 
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@orcl#show parameter sga_target

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
sga_target                           big integer
512M
SYS@orcl#set linesize
SP2-0267: linesize 选项 0 超出范围 (自 1 至 32767)
SYS@orcl#
SYS@orcl#
SYS@orcl#
SYS@orcl#set linesize 200
SYS@orcl#show parameter sga_target

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
sga_target                           big integer            512M
SYS@orcl#show parameter sga_max_target
SYS@orcl#show parameter sga_max

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
sga_max_size                         big integer            772M
SYS@orcl#show parameter lock_sga

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
lock_sga                             boolean                FALSE
SYS@orcl#create pfile='./pfile.ora' from spfile;

文件已创建。

SYS@orcl#!free -m                 
             total       used       free     shared    buffers     cached
Mem:          1004        973         31          0         35        683
-/+ buffers/cache:        254        750
Swap:         2055        108       1946

SYS@orcl#alter system set lock_sga=true scope=spfile;

系统已更改。

SYS@orcl#start force
SP2-0310: 无法打开文件 "force.sql"
SYS@orcl#startup force
ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
SYS@orcl#
解决办法:见  ID 577898.1
参考文章: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1176205889966
        http://www.askmaclean.com/archives/know-more-about-lock_sga-parameter.html
        http://managingoracle.blogspot.com/2010/06/locksga-and-asmm.html
<think>好的,用户遇到了ORA-01034和ORA-27101错误,这两个错误通常和Oracle实例未启动或共享内存问题有关。根据用户提供的引用内容,之前管理员尝试关闭实例时可能遇到了问题,导致实例没有正确启动。现在需要一步步排查。 首先,用户提到在关闭时出现错误,可能实例根本没有启动,所以需要先确认实例的状态。比如通过ps命令检查pmon进程是否存在,如果不存在说明实例没启动。然后检查ORACLE_SID是否正确设置,因为错误的SID会导致找不到实例。如果SID正确,接下来需要查看共享内存段是否存在,使用ipcs命令查看是否有oracle相关的共享内存,如果没有,可能需要手动启动实例。 另外,引用中提到了共享内存领域不存在,这可能是因为实例未启动或者共享内存被错误释放。需要检查/etc/oratab文件中的条目是否正确,确保自动启动配置没问题。同时,查看alert日志可以找到更详细的错误信息,比如参数文件是否正确,权限是否足够。 权限问题也是一个常见原因,比如$ORACLE_HOME/dbs目录下的参数文件权限是否正确,oracle用户是否有权访问这些文件。还有/tmp目录的权限,如果不够可能导致锁文件无法生成,进而引发错误。 如果手动启动实例失败,可能需要清理残留的锁文件和共享内存,然后重新启动。另外,检查是否配置了ASM或者RAC环境,如果配置不当也可能导致这些问题。最后,如果所有方法都无效,可能需要从备份恢复或者重建控制文件,但这是最后的手段。 用户可能已经尝试过一些基本步骤,但问题依旧存在,需要更深入的排查,比如检查系统资源是否足够,或者操作系统版本与Oracle的兼容性。需要一步步引导用户检查每个可能的环节,确保没有遗漏。</think>### **Oracle ORA-01034 & ORA-27101 错误深度修复指南** 以下解决方案整合了共享内存管理、实例启动流程和权限修复,适用于 Linux 环境(CentOS/RHEL/Oracle Linux)的 Oracle 11g/19c/21c。 --- ### **1. 核心问题定位** ORA-01034(实例未启动)和 ORA-27101(共享内存领域不存在)通常由以下原因触发[^1][^2]: - **实例未启动**:未执行 `STARTUP` 或启动失败 - **共享内存未分配**:共享内存段被意外释放或未初始化 - **权限错误**:参数文件、锁文件或共享内存权限不足 - **ORACLE_SID 未设置**:环境变量配置错误 - **残留锁文件**:`lk<SID>` 文件阻止实例启动 --- ### **2. 分步修复流程** #### **步骤 1:验证 ORACLE_SID 和环境变量** ```bash # 确认当前 ORACLE_SID 是否匹配实际实例名 echo $ORACLE_SID # 输出应为 <SID>(如 ORCL) # 检查环境变量是否加载 source /home/oracle/.bash_profile # 重新加载配置 sqlplus / as sysdba # 测试是否能正常连接 ``` **注意**:若 `sqlplus` 仍报错,需手动设置: ```bash export ORACLE_SID=<SID> export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1 ``` --- #### **步骤 2:检查实例进程状态** ```bash # 查看 PMON 进程是否存在(实例是否运行) ps -ef | grep ora_pmon_$ORACLE_SID # 若无输出,说明实例未启动,需手动启动 sqlplus / as sysdba <<EOF STARTUP; EOF ``` **典型启动失败场景**: - **参数文件缺失**:检查 `$ORACLE_HOME/dbs/spfile<SID>.ora` 是否存在 - **权限问题**:确保参数文件权限为 `-rw-r--r--` ```bash chmod 644 $ORACLE_HOME/dbs/spfile<SID>.ora ``` --- #### **步骤 3:修复共享内存分配** 若 `STARTUP` 失败并报 ORA-27101: ```bash # 查看当前共享内存分配 ipcs -m | grep oracle # 若无输出,说明共享内存未分配,需强制清理后重建 sudo ipcrm -m <shared_memory_id> # 删除残留共享内存(如有) # 手动调整内核参数(临时生效) sudo sysctl -w kernel.shmmax=4294967296 # 设置为 4GB(根据实际内存调整) ``` --- #### **步骤 4:清理锁文件和残留资源** ```bash # 删除锁文件 rm -f $ORACLE_HOME/dbs/lk$ORACLE_SID rm -f /tmp/.oracle/lk$ORACLE_SID # 清理信号量 ipcs -s | grep oracle | awk '{print $2}' | xargs -n1 sudo ipcrm -s ``` --- #### **步骤 5:通过 nomount 模式诊断启动过程** ```sql sqlplus / as sysdba SQL> STARTUP NOMOUNT; -- 测试是否能初始化 SGA 和后台进程 ``` - **成功**:说明参数文件有效,继续执行 `ALTER DATABASE MOUNT;` - **失败**:检查 `alert_<SID>.log` 中的具体错误 ```bash tail -100 $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log ``` --- #### **步骤 6:修复控制文件和数据文件路径** 若日志提示文件找不到(Error 2: No such file or directory): ```bash # 检查控制文件路径(spfile 中定义) strings $ORACLE_HOME/dbs/spfile<SID>.ora | grep control_files # 验证路径是否存在,并修复权限 chown oracle:oinstall /u01/app/oracle/oradata/<SID>/control01.ctl chmod 640 /u01/app/oracle/oradata/<SID>/control01.ctl ``` --- ### **3. 高级修复场景** #### **场景 1:ASM 存储配置错误** 若使用 ASM 存储: ```sql SQL> STARTUP MOUNT; SQL> ALTER DATABASE OPEN; -- 若报错 "ORA-01157: cannot identify/lock data file" ASMCMD> ls +DATA/<SID>/DATAFILE # 检查 ASM 磁盘组状态 ``` --- #### **场景 2:/dev/shm 空间不足** ```bash # 检查 /dev/shm 挂载点大小(需大于 MEMORY_TARGET) df -h /dev/shm # 临时扩容(示例:扩展到 2GB) sudo mount -o remount,size=2G /dev/shm ``` --- ### **4. 验证修复结果** ```sql sqlplus / as sysdba <<EOF STARTUP; SELECT STATUS FROM V$INSTANCE; -- 应返回 "OPEN" EOF ``` --- ### **错误修复速查表** | 错误现象 | 关键操作 | 验证命令 | |---------------------------|-----------------------------------|-----------------------------------| | ORA-01034 | `STARTUP NOMOUNT` | `ps -ef \| grep pmon` | | ORA-27101 | `ipcrm` + `sysctl` | `ipcs -m` | | 文件权限错误 | `chmod 640 <数据文件>` | `ls -l $ORACLE_BASE/oradata/...` | --- ### **相关问题** 1. **如何通过 `oradebug` 工具分析共享内存泄漏问题?** 2. **Oracle 实例启动时 `alert.log` 中 "System parameters with non-default values" 的解析方法?** 3. **在 Kubernetes 环境中运行 Oracle 时如何规避 ORA-27101 错误?** [^1]: ORA-27101 表示共享内存未分配,需检查 `ipcs` 和 `sysctl` 配置 [^2]: `/dev/shm` 空间不足会导致 SGA 初始化失败,需调整挂载参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值