暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Oracle多实例异常重启失败定位

579

Part1问题定位

数据库因为异常关闭,无法启动,报错ora-01102。

Part2问题解决

1清理问题锁文件

查找锁文件:
find $ORACLE_HOME/dbs -name "lk*"
find $ORACLE_HOME/dbs -name ".dblink*"

删除锁文件:
rm -f $ORACLE_HOME/dbs/lk<SID>
rm -f $ORACLE_HOME/dbs/.dblink<SID>

根据业务人员的沟通,他们说已经清理了相关文件,但是还是无法启动,再还需要处理数据库实例涉及的共享内存和信号量时,因为是多实例,不敢确定实例对应的使用信息,所以卡在这,其他实例使用的业务用户也不让重启数据库和服务器,卡在这无法操作。

2清理共享内存和信号量

因为当时处理比较着急,这个是后续在自己实验环境搭建和复现的。

检查数据库的实例,分别是orcl和test

[oracle ]$ ps -ef| grep smon | grep -v grep

oracle    4113     1  0 12:21 ?        00:00:00 ora_smon_orcl
oracle   23664     1  0 Jul23 ?        00:00:05 ora_smon_test

查看多实例分配的信息

[oracle ]$ ipcs -a

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 9          oracle     640        33554432   17                      
0x00000000 10         oracle     640        4966055936 17                      
0x4568630c 11         oracle     640        2097152    17                      
0x00000000 17         oracle     640        33554432   25                      
0x00000000 18         oracle     640        4966055936 25                      
0xd5cbea68 19         oracle     640        2097152    25                      
#以上是共享内存段

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x662f7600 14         oracle     640        154       
0x860e1920 34         oracle     640        154   
#以上是信号量

确定数据库实例对应的共享内存段和信号量

[oracle ]$ sysresv -l orcl test

IPC Resources for ORACLE_SID "orcl" : ————数据库实例orcl
Shared Memory:                        ————数据库实例orcl占用的共享内存
ID  KEY
17       0x00000000
18       0x00000000
19       0xd5cbea68
Semaphores:        ————数据库实例orcl占用的信号量
ID  KEY
34       0x860e1920
Oracle Instance alive for sid "orcl"


IPC Resources for ORACLE_SID "test" :————数据库实例test
Shared Memory:                       ————数据库实例test占用的共享内存
ID  KEY
9        0x00000000
10       0x00000000
11       0x4568630c
Semaphores:
ID  KEY
14       0x662f7600              ————数据库实例test占用的信号量
Oracle Instance alive for sid "test"

sysresv是oracle处理异常数据库的一种清理方式

但是不会删除正常实例的共享内存和信号量

[oracle ]$ sysresv -f orcl

IPC Resources for ORACLE_SID "orcl" :
Shared Memory:
ID  KEY
17       0x00000000
18       0x00000000
19       0xd5cbea68
Semaphores:
ID  KEY
34       0x860e1920
Oracle Instance alive for sid "orcl"
SYSRESV-005: Warning
 Instance maybe alive - aborting remove for sid "orcl"

系统错误 - 005:警告
该实例可能仍在运行 - 正在停止删除操作,针对的 SID 为“orcl”

清理数据库实例的办法

ipcrm -m  ID  (移除共享内存进程)
ipcrm -s  ID  (移除信号量)

干掉orcl实例的方法和顺序

##干掉共享内存
ipcrm -m  17
ipcrm -m  18
ipcrm -m  19

##干掉信号量
ipcrm -s 24

再启动数据库就没问题了

Part3相关命令

ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。

##显示具体参数
ipcs -h

##显示所有的ipcs信息
ipcs -a

##显示所有的信号量
ipcs -s

##显示所有的信号量共享内存
ipcs -m

##显示所有的资源限制
ipcs -m -l

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 16265871
max total shared memory (kbytes) = 16265872
min seg size (bytes) = 1

key
shmid:表示共享内存段ID
owner:表示共享内存段属于哪个用户,默认值是640,这表示除了root和oracle用户以外不允许其他用户修改或者查看
perms:
bytes:表示共享内存段的大小
nattch:表示连接到共享内存段的进程数
status:表示共享内存段的状态,dest表示该内存段被标记为destroyed状态

验证共享内存和sga之间的关系,但是做的数值比对好像不一致

SQL> show parameter sga 

NAME         TYPE           VALUE
-------------  ----------- -----------
sga_max_size   big integer    4768M
sga_target    big integer    4768M
################################################
[oracle ]$ sysresv -l orcl

IPC Resources for ORACLE_SID "orcl" :
Shared Memory:
ID  KEY
17       0x00000000
18       0x00000000
19       0xd5cbea68
Semaphores:
ID  KEY
34       0x860e1920
Oracle Instance alive for sid "orcl"

################################################
[oracle]$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 17         oracle     640        33554432   23                      
0x00000000 18         oracle     640        4966055936 23                      
0xd5cbea68 19         oracle     640        2097152    23  

33554432 / 1024 /1024 = 32M
4966055936 / 1024 /1024 = 4,736M
2097152 / 1024 /1024 = 2M

好像不一样? 数据库sga参数和 ipcs的加起来不一样 共享内存到了峰值才会创建新的,为什么我的这三个共享内存段看起来不是这样

答案: SGA和PGA都是用懒算法 不是上来直接划分内存 而是不够了才去借用 但是最大只能用到你给他的的最大共享内存。 段会有超分的情况

Part4原理解析

验证了一句话:数据库实例是内存和后台进程的组合。

最后修改时间:2025-07-29 18:07:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论