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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




