[转自Oracle官方博客]一次服务器时间调整引发的实例宕机

本文介绍了一次因系统时间被手动调整200秒而导致数据库实例崩溃的案例。ASMB进程检测到长时间未响应并触发故障,通过分析OSW、OSlog及CTSSD trace等日志定位问题原因,并提出确保NTP正常运行及调整时间时关闭RAC数据库的建议。

https://blogs.oracle.com/database4cn/%E4%B8%80%E6%AC%A1%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%97%B6%E9%97%B4%E8%B0%83%E6%95%B4%E5%BC%95%E5%8F%91%E7%9A%84%E5%AE%9E%E4%BE%8B%E5%AE%95%E6%9C%BA%E3%80%82

By:  Sam Zhao

问题描述:

1. 数据库实例突然crash,原因是ASMB有200多秒没有响应:

Mon Sep 04 15:07:47 2017
WARNING: ASMB has not responded for 200 seconds <<<<<<<<<<<< ASMB has not responsed for 200 seconds.
NOTE: ASM umbilicus running slower than expected, ASMB diagnostic requested after 200 seconds 
NOTE: ASMB process state dumped to trace file /u01/app/oracle/diag/rdbms/iadw/iadw3/trace/iadw3_gen0_19179.trc
Mon Sep 04 15:07:49 2017
NOTE: ASMB terminating
Mon Sep 04 15:07:49 2017
Errors in file /u01/app/oracle/diag/rdbms/iadw/iadw3/trace/iadw3_asmb_19501.trc:
ORA-15064: communication failure with ASM instance
ORA-03113: end-of-file on communication channel
Process ID:
Session ID: 170 Serial number: 65161
Mon Sep 04 15:07:49 2017
Errors in file /u01/app/oracle/diag/rdbms/iadw/iadw3/trace/iadw3_asmb_19501.trc:
ORA-15064: communication failure with ASM instance
ORA-03113: end-of-file on communication channel
Process ID:
Session ID: 170 Serial number: 65161
USER (ospid: 19501): terminating the instance due to error 15064

2. 从system state dump上看,ASMB看起来没有什么问题:

Current Wait Stack:
Not in wait; last wait ended 3.321392 sec ago  <<<<<<<<<<<<<<< Not in wait.
Wait State:
fixed_waits=0 flags=0x21 boundary=(nil)/-1
Session Wait History:
elapsed time of 3.321404 sec since last wait
0: waited for 'ASM background timer'
=0x0, =0x0, =0x0
wait_id=37936676 seq_num=57511 snap_id=1
wait times: snap=2.682436 sec, exc=2.682436 sec, total=2.682436 sec
wait times: max=infinite
wait counts: calls=0 os=0
occurred after 0.000022 sec of elapsed time
1: waited for 'ASM file metadata operation'
msgop=0xc, locn=0x3, =0x0
wait_id=37936675 seq_num=57510 snap_id=1
wait times: snap=0.000454 sec, exc=0.000454 sec, total=0.000454 sec
wait times: max=infinite
wait counts: calls=0 os=0
occurred after 0.000017 sec of elapsed time

3. 但是从OSW上看,没有发现明显的资源匮乏情况,但是中间却缺了三分多钟的断档:

zzz ***Mon Sep 4 15:04:13 CST 2017
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 529160192 19412 31514216 0 0 82 48 0 0 1 0 99 0 0
0 0 0 529124032 19412 31514784 0 0 1545 23119 36620 37705 1 1 99 0 0
2 0 0 529126784 19412 31514712 0 0 1601 9056 28083 30263 1 0 99 0 0
zzz ***Mon Sep 4 15:04:23 CST 2017
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 0 529095360 19412 31514996 0 0 82 48 0 0 1 0 99 0 0
3 0 0 529118368 19412 31515228 0 0 1517 4540 20402 27856 1 1 98 0 0
52 0 0 529107936 19412 31515400 0 0 1206 3961 21105 31254 1 0 98 0 0
zzz ***Mon Sep 4 15:07:51 CST 2017 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  15:04:23 到15:07:51之间没有任何记录
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
41 0 0 570421952 19412 31556616 0 0 82 48 0 0 1 0 99 0 0
16 0 0 578182976 19412 31575888 0 0 2129 35 25702 15760 1 8 91 0 0
5 0 0 582348800 19412 31607740 0 0 5209 40002 22122 19062 1 4 96 0 0
zzz ***Mon Sep 4 15:08:02 CST 2017
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 617279552 19412 31615300 0 0 82 48 0 0 1 0 99 0 0
2 0 0 624415168 19412 31617816 0 0 922 2 25322 20023 1 2 98 0 0
2 0 0 631768448 19412 31615728 0 0 1497 3 25405 22582 1 1 98 0 0

看到这里,一般的思考是OSW中间断档了3分多钟,是不是系统性能太差导致OSW没法生成?但是一般来讲,在断档之前一般都能看到一些先兆,比如block queue 剧增。但是这个案例里面没有此现象。 继续看OS log:

4. 在OSlog中看到关键性的一句话:

Sep 4 15:04:01 hnpb05nc crond: /usr/sbin/postdrop: /lib64/libssl.so.10: no version information available (required by /usr/lib64/mysql/libmysqlclient.so.18)
Sep 4 15:04:21 hnpb05nc init.tfa: Checking/Starting TFA..
Sep 4 15:07:47 hnpb05nc systemd: Time has been changed <<<<<<<<<<<<<<<<<<< 系统时间修改了。

5. 继续看看CTSSD 的trace:

2017-09-04 15:04:25.799241 : CTSS:3933169408: ctssslave_swm19: The offset is [2311562070 usec] and sync interval set to [4]<<< 偏移量为2311秒
2017-09-04 15:04:25.799251 : CTSS:3933169408: ctsselect_msm: Sync interval returned in [4]
2017-09-04 15:04:25.799260 : CTSS:3937371904: ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler

2017-09-04 15:04:26.800845 : CTSS:3933169408: ctssslave_swm19: The offset is [2311562609 usec] and sync interval set to [4]<<< 偏移量为2311秒
2017-09-04 15:04:26.800856 : CTSS:3933169408: ctsselect_msm: Sync interval returned in [4]
2017-09-04 15:04:26.800864 : CTSS:3937371904: ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler

2017-09-04 15:04:27.802328 : CTSS:3933169408: ctssslave_swm19: The offset is [2311563057 usec] and sync interval set to [4]<<< 偏移量为2311秒
2017-09-04 15:04:27.802337 : CTSS:3933169408: ctsselect_msm: Sync interval returned in [4]
2017-09-04 15:04:27.802346 : CTSS:3937371904: ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler

2017-09-04 15:07:47.065051 : CTSS:3933169408: ctssslave_swm19: The offset is [2509824742 usec] and sync interval set to [4]<<< 偏移量剧增到2509秒
2017-09-04 15:07:47.065068 : CTSS:3933169408: ctsselect_msm: Sync interval returned in [4]
2017-09-04 15:07:47.065077 : CTSS:3937371904: ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting

很明显,偏移量在问题期间发生了200秒左右的增长,而在之前,我们可以看到偏移量是相对稳定的!这个也间接说明了系统时间的调整。

这个故事:

事情是这样的,系统配置了ntp,由于一些问题ntp没有启动,但是由于已经配置了ntp,ctssd发现了ntp的配置文件所以ctssd只运行在观察者的角色。造成的结果就是系统时间不断出现偏差,直到系统管理员发现了这个问题并手工把系统时间往前调了200秒。。。 然后ASMB通过系统时间判断有200秒没有响应(当然情况不是这样了),然后就。。。

建议:

当然我们应该尽可能monitor系统并确保NTP的正常运行。如果我们确实需要手工大幅度调整系统时间,那么我们也应该先把RAC数据库关闭以后在做调整。


<think>好的,我现在需要帮用户解决在Linux服务器安装Oracle数据库后频繁宕机的问题。首先,我得分析可能的原因,然后逐一排查。 用户提到安装后出现宕机,可能涉及多个方面。首先,硬件资源不足是常见问题。Oracle对内存和CPU的要求比较高,尤其是当配置不当的时候。比如SGA和PGA设置过大,导致内存耗尽,系统可能触发OOM Killer,杀死关键进程,导致宕机。我需要检查内存配置,建议用户调整相关参数。 然后是内核参数设置。Oracle在Linux上需要特定的内核参数,比如shmmax、shmall、sem等。如果这些参数没有正确配置,可能会导致数据库无法正常运行,甚至系统崩溃。需要查看/etc/sysctl.conf中的设置是否符合Oracle的推荐值。 另外,存储和文件系统的问题也可能导致宕机。比如ASM或者文件系统权限配置错误,或者磁盘空间不足,导致数据库无法写入,引发故障。需要检查磁盘空间、I/O负载,以及文件系统的挂载选项是否正确。 系统日志和Oracle日志是排查问题的关键。查看/var/log/messages和Oracle的alert.log,寻找错误信息或警告,比如ORA-错误代码,或者内核panic的记录。这能帮助定位具体的问题点。 还有可能是兼容性问题,比如Oracle版本和Linux内核版本不匹配。需要确认用户安装的Oracle版本是否支持当前的操作系统版本,可能需要安装特定的补丁或更新。 另外,SELinux和防火墙有时候也会干扰Oracle的正常运行,特别是如果它们阻止了必要的端口或进程。临时关闭这些安全工具进行测试,看是否解决问题,再调整策略。 最后,过热或硬件故障也不能排除。虽然用户是在安装后出现问题,但新安装的软件可能加重了硬件负担,导致过热或其他硬件问题。建议检查服务器硬件状态,比如CPU温度、硬盘SMART状态等。 总结下来,需要分步骤检查资源分配、内核参数、存储配置、日志分析、兼容性、安全设置和硬件状态。可能需要用户提供更多日志细节来进一步缩小范围。</think>### Linux服务器安装Oracle后频繁宕机的解决方案 #### 一、检查硬件资源分配 1. **内存不足** - Oracle数据库对内存需求较高,需检查`SGA`和`PGA`配置是否超出物理内存限制。 - **解决方法**: - 修改`$ORACLE_HOME/dbs/init<SID>.ora`中的内存参数: ```bash sga_max_size = 4G # 根据物理内存调整 pga_aggregate_limit = 2G ``` - 使用`ALTER SYSTEM`动态调整内存[^2]: ```sql ALTER SYSTEM SET sga_max_size=4G SCOPE=spfile; ``` 2. **CPU资源争用** - 检查`top`或`htop`命令观察CPU使用率,确认Oracle进程是否长期占用过高。 - **解决方法**: - 限制Oracle实例的CPU亲和性(使用`taskset`命令) - 优化SQL语句减少全表扫描等资源密集型操作。 --- #### 二、内核参数调优 Oracle对Linux内核参数有特定要求,不当配置可能导致系统崩溃[^2]: 1. 修改`/etc/sysctl.conf`: ```bash kernel.shmall = 4294967296 # 共享内存总页数 kernel.shmmax = 68719476736 # 单个共享内存段最大值 kernel.sem = 250 32000 100 128 fs.file-max = 6815744 ``` 执行`sysctl -p`生效。 2. **用户资源限制** 修改`/etc/security/limits.conf`: ```bash oracle soft nofile 65536 oracle hard nofile 65536 oracle soft nproc 16384 ``` --- #### 三、存储与文件系统排查 1. **ASM或文件系统错误** - 检查`dmesg`和`/var/log/messages`中是否有I/O错误或磁盘超时记录。 - **解决方法**: - 使用`fsck`修复文件系统 - 检查ASM磁盘组状态: ```sql SELECT GROUP_NUMBER, STATE FROM V$ASM_DISKGROUP; ``` 2. **空间不足** - 检查表空间使用率: ```sql SELECT TABLESPACE_NAME, USED_PERCENT FROM DBA_TABLESPACE_USAGE_METRICS; ``` - 清理日志文件(如`$ORACLE_BASE/diag/rdbms/<DB_NAME>/trace`)。 --- #### 四、日志分析与故障定位 1. **系统日志** - 查看`/var/log/messages`中是否有`Out of memory`或`kernel panic`记录。 - 检查Oracle Alert日志(`$ORACLE_BASE/diag/rdbms/<DB_NAME>/<SID>/trace/alert_<SID>.log`),关注`ORA-00600`或`ORA-07445`错误。 2. **核心储分析** - 若生成`core`文件,使用`gdb`分析: ```bash gdb $ORACLE_HOME/bin/oracle core.<PID> ``` --- #### 五、其他常见原因 1. **版本兼容性** - 确认Oracle版本与Linux内核版本兼容(如Oracle 19c需支持RHEL 7.6+)。 - 安装所需的`glibc`和`libaio`依赖包。 2. **SELinux/防火墙干扰** - 临时禁用SELinux: ```bash setenforce 0 ``` - 检查防火墙是否开放Oracle监听端口(默认1521)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值