Oracle数据库启动报错ORA-07445

一套Oracle11.2.0.4数据库之前都可以正常的重启,今天查看发现宕机,之后重启时数据库连nomount的都不行,alert日志中报错了ORA-07445: exception encountered: core dump [sskgm_filedel()+192] [SIGFPE] [ADDR:0x2D971FA] [PC:0x2D971FA] [Integer divide by zero] []

分析过程

先了解Oracle 启动的三个阶段

alt

nomount阶段

1、读取参数文件 Oracle数据库在启动过程中会经历几个阶段,其中第一个阶段就是nomount阶段。以下是nomount阶段的主要过程:

  1. 读取参数文件: 在nomount阶段,Oracle数据库首先需要参数文件来启动实例。参数文件可以是文本参数文件(如init<SID>.ora),也可以是服务器参数文件(如spfile.oraspfile<SID>.ora)。Oracle会按照一定的顺序查找这些文件,通常是先查找spfile<SID>.ora,然后是spfile.ora,最后是init<SID>.ora。这些文件中包含了数据库启动所需的配置参数。

  2. 启动实例: 有了参数文件后,Oracle会启动一个数据库实例。实例是Oracle数据库中的一个重要概念,它由内存结构(SGA)和后台进程组成。在这个阶段,实例会被创建,但数据库本身还没有被加载。

  3. 分配SGA(系统全局区域): SGA是Oracle数据库实例中一个共享的内存区域,用于存储数据库运行时需要的共享数据和控制信息。在nomount阶段,Oracle会根据参数文件中的设置分配SGA的大小,并初始化SGA。

  4. 启动后台进程: 在SGA分配完成后,Oracle会启动一些后台进程,这些进程对数据库的运行至关重要,如DBWR(数据库写入进程)、LGWR(日志写入进程)和SMON(系统监控进程)等。这些进程会在数据库启动和运行过程中执行特定的任务。

  5. 不加载数据库: nomount阶段不会加载数据库,也就是说,这个阶段数据库文件(如数据文件和控制文件)不会被读取或打开。因此,数据库处于不可访问状态,无法进行数据查询或其他操作。

  6. 审计文件和警报日志的准备: 在nomount阶段,Oracle还会准备审计文件和警报日志文件,这些文件用于记录数据库的运行情况和潜在的问题。

  7. 检查参数文件的完整性: 如果参数文件被破坏或丢失,数据库只能启动到nomount状态,无法继续后续的mount和open阶段。

总结来说,nomount阶段是Oracle数据库启动的初始阶段,主要涉及参数文件的读取、实例的启动、SGA的分配和后台进程的启动。这个阶段是数据库启动过程中的基础,为后续的mount和open阶段做准备。

mount阶段

Oracle数据库的mount阶段是数据库启动过程中的第二个阶段,紧随nomount阶段之后。在这个阶段,数据库实例已经被启动,SGA已经分配,后台进程也已经运行,接下来需要将数据库文件加载到SGA中,使得数据库可以被访问。以下是mount阶段的主要过程:

  1. 加载控制文件: 在mount阶段的开始,Oracle会加载控制文件。控制文件包含了数据库的物理结构信息,如数据文件的位置、日志文件的位置以及其他关键的数据库配置信息。Oracle需要这些信息来定位和访问数据库的其他文件。

  2. 打开数据文件: 根据控制文件中提供的信息,Oracle会打开所有的数据文件。数据文件是数据库存储数据的地方,每个数据文件都对应一个Oracle文件。在这个阶段,Oracle会确保所有的数据文件都是可访问的,并且没有损坏。

  3. 初始化重做日志文件: 重做日志文件(redo log files)记录了所有更改数据库数据的操作,这对于数据恢复和保持数据一致性至关重要。在mount阶段,Oracle会初始化重做日志文件,准备它们以记录未来的事务。

  4. 启动日志写入进程(LGWR): LGWR进程负责将重做信息从SGA写入到重做日志文件中。在mount阶段,LGWR进程会被启动,以确保所有的事务更改都能被正确记录。

  5. 检查一致性: Oracle会检查数据库的一致性,包括数据文件和控制文件的一致性。如果发现任何不一致,Oracle会尝试修复这些问题,或者在严重的情况下,可能会拒绝启动数据库。

  6. 启动检查点进程(CKPT): CKPT进程负责将脏块(即被修改的缓冲区)从SGA的数据库缓冲区写入到数据文件中。在mount阶段,CKPT进程会被启动,以确保数据的持久性。

  7. 准备数据库以供访问: 一旦数据文件被打开并且控制文件被加载,数据库就处于mount状态,这意味着数据库已经准备好被用户访问,但是用户还不能执行查询或其他数据库操作,因为数据库还没有被打开(open)。

  8. 生成数据库装载日志(load database log): 在mount阶段,Oracle还会生成一个数据库装载日志,记录数据库装载过程中的所有操作和潜在的问题。

总结来说,mount阶段是数据库启动过程中的关键阶段,它涉及到加载控制文件、打开数据文件、初始化重做日志文件、启动必要的后台进程以及检查数据库的一致性。完成这些步骤后,数据库就处于mount状态,为最终的open阶段做准备,届时用户将能够执行查询和其他数据库操作。

open阶段

Oracle数据库的open阶段是数据库启动过程的最后一个阶段,这个阶段紧接着mount阶段之后。在open阶段,数据库从mount状态转变为open状态,使得用户可以开始执行查询和其他数据库操作。以下是open阶段的主要过程:

  1. 打开数据库: 在mount阶段,数据库文件已经被加载到SGA中,但数据库本身还没有对用户开放。在open阶段,数据库管理员(DBA)会执行ALTER DATABASE OPEN;命令,这个命令会通知Oracle打开数据库,使其对用户可用。

  2. 启动数据库缓冲区高速缓存共享(DB Cache Fusion): 如果Oracle RAC(Real Application Clusters)环境,Oracle会启动数据库缓冲区高速缓存共享,这是一个进程,它允许多个实例共享缓存中的数据,以提高性能。

  3. 初始化共享池: 在open阶段,Oracle会初始化共享池,这是SGA的一部分,用于存储SQL语句、游标和执行计划等信息。共享池的初始化确保了用户可以执行SQL查询。

  4. 启动归档进程(ARCH): 如果数据库处于归档模式,Oracle会启动归档进程(ARCH),这个进程负责将重做日志文件中的信息归档到磁盘上,以便于数据恢复和备份。

  5. 启动并行服务器: 如果配置了并行服务器,Oracle会在open阶段启动这些服务器,以便处理并行查询和事务。

  6. 启动Java池和流池: 如果数据库配置了Java池和流池,这些池也会在open阶段被初始化,以支持Java应用程序和流媒体处理。

  7. 启动其他用户进程: 用户进程(如SQL*Net进程)会在open阶段启动,以便处理来自客户端的连接请求。

  8. 检查数据块的一致性: 在数据库打开之前,Oracle会检查数据块的一致性,确保没有损坏的数据块。如果有损坏的数据块,Oracle会尝试使用备份或重做日志文件来恢复数据。

  9. 启动自动扩展: 如果数据库配置了自动扩展,Oracle会在open阶段启动自动扩展,以便根据需要自动调整数据文件的大小。

  10. 启动自动备份和恢复: 如果配置了自动备份和恢复,Oracle会在open阶段启动这些进程,以确保数据库的高可用性和数据保护。

  11. 生成数据库打开日志: 在数据库打开后,Oracle会生成数据库打开日志,记录打开过程中的所有操作和潜在的问题。

总结来说,open阶段是数据库启动过程的最终阶段,它涉及到打开数据库、启动必要的进程和服务、初始化SGA组件以及确保数据库的一致性和完整性。完成这些步骤后,数据库就处于open状态,用户可以开始执行查询和其他数据库操作。

[sskgm_filedel()+192]说明

sskgm是Oracle内部用于处理与操作系统内存管理相关功能的组件,全称为“operating system dependent system kernel generic memory”。这个组件主要负责Oracle数据库与操作系统内核之间的内存交互,包括内存的分配、释放和管理。以下是对sskgm组件的详细说明:

  1. 内存管理接口sskgm提供了一个通用的内存管理接口,用于管理虚拟内存,独立于底层硬件架构(例如分页与分段内存)以及集成该接口的操作系统内核。

  2. 独立于硬件架构: 该组件能够独立于硬件架构工作,这意味着无论是在分页内存系统还是分段内存系统中,sskgm都能提供统一的内存管理功能。

  3. 控制数据缓存sskgm还负责控制实际内存中的数据缓存策略,这些策略可以委托给外部管理器来实现。

  4. 高效的内存管理sskgm使用了一些高效的技术,比如历史对象技术(history object technique),用于延迟复制,从而提高内存管理的效率。

  5. 集成到操作系统内核sskgm可以集成到操作系统内核中,为操作系统提供通用的内存管理功能,这包括对映射对象和显式I/O的单一一致缓存的支持。

  6. Oracle内部函数: 在Oracle的内部函数中,sskgm相关的函数如skgmstack用于调用指定函数并提供额外的堆栈空间,而skgpwwait则用于操作系统依赖的内核通用post/wait等待。

  7. 错误处理: 当Oracle数据库遇到与操作系统内存相关的错误时,如ORA-27300、ORA-27301和ORA-27302,这些错误通常与sskgm组件有关,表明操作系统依赖的操作失败,例如信号量操作、内存分配等。

  8. 性能影响sskgm组件的性能直接影响到Oracle数据库的性能,因为它涉及到数据库与操作系统之间的内存交互,任何延迟或错误都可能导致数据库性能下降或崩溃。

综上所述,sskgm是Oracle数据库中一个关键的操作系统依赖组件,它负责处理操作系统内核级别的通用内存请求,确保Oracle数据库能够有效地管理内存资源。

结论

sskgm是Oracle内部的一个组件,代表“operating system dependent system kernel generic memory”,即操作系统依赖的系统内核通用内存。这个组件主要负责Oracle数据库与操作系统内存管理之间的交互。当Oracle数据库在启动过程中遇到与内存相关的问题时,sskgm组件可能会涉及到错误处理。

在Oracle数据库的启动过程中,在nomount阶段,Oracle实例启动但还未加载数据库文件时,需要操作系统分配内存以供后续使用。如果在这个阶段遇到内存分配问题,sskgm组件可能会触发错误,如ORA-07445,这通常表明操作系统层面的内存问题,如共享内存段未能正确释放等。也就是就说明之前的共享内存段信息还在。

解决:

1.执行ipcs -a 查看Oracle共享内存使用

ipcs -a | grep oracle
  1. ipcrm -m shmid移除用shmid标识的共享内存段
ipcs -a | grep oracle | awk -F ' ' '{print "ipcrm -m " $2}'

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值