[原创]Oracle RAC故障诊断_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3511 | 回复: 0   主题: [原创]Oracle RAC故障诊断        下一篇 
yang.liu
注册用户
等级:少校
经验:1182
发帖:77
精华:1
注册:2014-1-3
状态:离线
发送短消息息给yang.liu 加好友    发送短消息息给yang.liu 发消息
发表于: IP:您无权察看 2014-3-25 17:01:26 | [全部帖] [楼主帖] 楼主

第一部分 问题描述

[问题症状一]

当运行asmcmd命令行无法运行,输入完毕后终端挂起,只能强行结束。对asmcmdstrace诊断内容如下:

[oracle@dbserver2 ~]$ strace asmcmd | less
execve("/opt/app/oracle/oracle/product/10.2.0/crs/bin/asmcmd", ["asmcmd"], []) = 0
uname({sys="Linux", node="dbserver2", ...}) = 0
brk(0) = 0x6bc000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95556000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/opt/app/oracle/oracle/product/10.2.0/crs/lib/tls/x86_64/libtermcap.so.2", O_RDONLY) = -1
ENOENT (No such fistat("/opt/app/oracle/oracle/product/10.2.0/crs/lib/tls/x86_64", 0x7fbfffec90) = -1
ENOENT (No such file or directopen("/opt/app/oracle/oracle/product/10.2.0/crs/lib/tls/libtermcap.so.2", O_RDONLY) = -1
ENOENT (No such file or dstat("/opt/app/oracle/oracle/product/10.2.0/crs/lib/tls", 0x7fbfffec90) = -1 ENOENT (No such file or directory)
open("/opt/app/oracle/oracle/product/10.2.0/crs/lib/x86_64/libtermcap.so.2", O_RDONLY) = -1 ENOENT (No such file ostat("/opt/app/oracle/oracle/product/10.2.0/crs/lib/x86_64", 0x7fbfffec90) = -1 ENOENT (No such file or directory)open("/opt/app/oracle/oracle/product/10.2.0/crs/lib/libtermcap.so.2", O_RDONLY) = -1 ENOENT (No such file or direcstat("/opt/app/oracle/oracle/product/10.2.0/crs/lib", {st_mode=S_IFDIR|0750, st_size=12288, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=151775, ...}) = 0
mmap(NULL, 151775, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2a95557000
close(3) = 0
open("/lib64/libtermcap.so.2", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\20\200"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=15728, ...}) = 0
mmap(0x3adf800000, 1060400, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3adf800000
mprotect(0x3adf803000, 1048112, PROT_NONE) = 0
mmap(0x3adf902000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x3adf902000
close(3) = 0
open("/opt/app/oracle/oracle/product/10.2.0/crs/lib/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libdl.so.2", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\17\340"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=18039, ...}) = 0
mmap(0x3adee00000, 1056968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3adee00000
mprotect(0x3adee02000, 1048776, PROT_NONE) = 0
mmap(0x3adef01000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x3adef01000
close(3) = 0
open("/opt/app/oracle/oracle/product/10.2.0/crs/lib/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\304"..., 832) = 832
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a9
fstat(3, {st_mode=S_IFREG|0755, st_size=1499873, ...}) = 0
mmap(0x3ade900000, 2310088, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0
mprotect(0x3adea2b000, 1085384, PROT_NONE) = 0
mmap(0x3adeb2b000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWR
mmap(0x3adeb30000, 16328, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYM
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a9
mprotect(0x3adeb2b000, 8192, PROT_READ) = 0
arch_prctl(ARCH_SET_FS, 0x2a9557e400) = 0
munmap(0x2a95557000, 151775) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3) = 0
brk(0) = 0x6bc000
brk(0x6dd000) = 0x6dd000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=49303120, ...}) = 0
mmap(NULL, 49303120, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2a9557f000
close(3) = 0
getuid() = 700
getgid() = 701
geteuid() = 700
getegid(
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531
times(NULL) = -2068032531


以上为节选,省略掉的部分为times()函数调用死循环。

[问题症状二]

RACons服务无法启动。

使用srvctl或者onsctl启动时,命令行挂起。Strace的内容与上一种情况类似提示缺少文件。不过没有调用times()函数, 其他日志也未发现任何异常信息。

第二部分 问题分析

1. 因为提示缺少某些库文件,所以首先找到库文件在的路径,检查oracle用户的环境变量,看LD_LIBRARY_PATH环境变量是否设置正确,经检查包括了安装时必须包括的类库的路径,经检查正确无误,故LD_LIBRARY_PATH不正确的可能性排除。

2. 检查操作系统的版本及内核版本为为Asianux 2.0 AP2 X86_64 kernel 2.6.9-42.7,使用的是2.6的内核。试着使用老的2.4的内核的库使用命令export LD_ASSUME_KERNEL=2.4.19重试问题依旧。

3. 检查c编译器的版本看是否符合要求。

#gcc -v
gcc version 3.4.6 20060404 (Asianux 2.0 3.4.6-3.1)


gcc编译器的版本在3.4.5以上所以gcc编译器应该不存在问题,此种可能可以排除。

4. 可能是asm存在僵尸进程影响新的asmcmd的产生。

杀掉系统中与asm有关的进程在试着重启asmcmd,问题依旧。这种可能也可以排除。

5. 检查所有的日志文件,看是否有可用的信息。

经检查asm、 alertlog 操作系统log等均无报错的提示。

6. 检查oracle用户的权限是否正确。

经检查oracle用户的目录部分权限不正常。但是修改完成之后问题依旧,所以权限问题也可以排除。

7. 检查操作系统的补丁是否安装完全。

经检查,所有的操作系统补丁均已齐全且在规定的版本之上,这种可能性也可以排除。

8. 可能是oracle特定版本的一个bug

经分析排查,此情况与oracle 10.2.0.1的一个bug 4612267情况十分类似。

Oracle Metalink

Doc ID: 338461.1 SQL*Plus 10.2.0.1 Hangs, When System Uptime Is Long Period of Time
Doc ID: 4612267.8 Bug 4612267 - OCI client spins when machine uptime >= 249 days


症状:

当主机运行时间达198天或248天,cpu占用率就突然达到100%。此时操作系统命令可以执行,但Oracle的部分命令会被hang住,不能执行。

经操作系统uptime命令及客户数据库工程师确认,问题刚好发生在主机运行198天引起。虽然实际情况跟metalink中描述的情况并非完全一样,但是基本可以确定是一个关于时间函数的bug

第三部分 解决方案

这个问题解决有两种:

第一种方式就是针对单个问题打相应的Opatch。优点是相对操作简单,停业务系统的时间短。不过以后若发生其它的问题处理起来不是太方便。

第二种方式是把数据库从当前的10.2.0.1升级到稳定版10.2.0.4版本,优点是数据库的稳定性得到提高,方面以后管理,不过停业务时间稍微长一点,另外比第一种波及面稍广(绝大多数情况下无需担心)。

另外就是可能直接重启机器,重启后一段时间可能是好的,过了一段时间可能又会出现同样的问题。治标不治本,不推荐此方法。

经客户确认决定采用第一种方案,把数据库升级到10.2.0.4版本。

具体的操作过程如下:

一. 备份原有数据库:

因为数据库升级还是存在一定的风险性的,所以在升级前建议对数据库做一次全备。这个工作需要有客户的dba工程师来完成,我方只做相应的指导工作。经客户确认,已在升级之前进行了rman全备。

二. 准备升级介质:

Oracle 10.2.0.4补丁升级包。

X86_64版本下载地址为:

ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86-64.zip


升级之前客户已经把相关的升级包准备完毕。

三.   停止业务系统

在进行数据库升级之前,需要停用业务系统,如相应的web服务器或者中间件。防止对数据库进行干扰。经客户确认升级时可以有相应的停机窗口。

四. 升级数据库

1. 把升级的补丁包使用ftp二进制方式或者scp等方式上传到oracle用户的家目录。完成后使用系统自带的MD5工具进行MD5码校验,以防止升级包有损坏的现象。

2. 升级需要用到图形界面,如果是终端的模式,则需要先切换到图形模式。如果服务端有开XDMCP协议,则也可使用远程工具把服务端的图形界面转发到客户端进行。

3. 登录节点1,停止所有的oracle用户进程。

停止数据库

[oracle@dbserver1 bin]$./srvctl  stop database –d racdb


停止节点1应用

[oracle@dbserver1 bin]$./srvctl stop nodeapps –n dbserver1


停止节点2应用

[oracle@dbserver1 bin]$./srvctl stop nodeapps –n dbserver2


   也可以用crs_stop一次性停掉所有服务

[oracle@dbserver1 bin]$./crs_stop –all


确认所有的服务都已经离线

[oracle@dbserver1 bin]#crs_stat –t


4. 解压补丁升级包

[oracle@dbserver1 ~]# su –  oracle
[oracle@dbserver1 ~]unzip  p6810189_10204_Linux-x86-64.zip


完成之后可以看到当前目录下有一个Disk1的目录

5. 升级Clusterware

[oracle@dbserver1 Disk1] $./runInstaller


注意第二个图形界面选择CRS_HOME的路径

完成后,根据提示使用root用户在两个节点上执行以下命令

#crsctl stop crs
#/opt/app/oracle/crs/10.2.0/install/root102.sh


CRS升级完成。

6. 升级数据库软件

在节点1上执行

[oracle@dbserver1 Disk1] $./runInstaller


注意在第二个图形界面选择ORACLE_HOME的路径

完成后分别在两个节点执行

#/opt/app/oracle/product/10.2.0/db_1/./root.sh


注意在两个节点执行覆盖文件时,最好先把两个/usr/local/bin文件做一下备份。

7. 升级数据库 

在节点1启动crs服务

[root@dbserver1 ~]# su – oracle
[oracle@dbserver1 ~]$ crs_start –all
[oracle@dbserver1 ~]$ crs_stat –t


启动过程中数据库实例是无法启动的,只是启动集群服务。

把数据库设置为非集群模式

SQL>CONN SYS AS SYSDBA
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP NOMOUNT
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=spfile;
SQL> SHUTDOWN


运行数据字典升级脚本

SQL> STARTUP UPGRADE
SQL> SPOOL patch.log
SQL> @?/rdbms/admin/catupgrd.sql   #注意这个过程比较耗时
SQL> SHUTDOWN IMMEDIATE
SQL> SPOOL OFF


编译无效对象并把数据库改回到集群模式

SQL> STARTUP
SQL> @?/rdbms/admin/utlrp.sql
SQL>ALTER SYSTEM SET CLUSTER_DATABASE=TRUE scope=spfile;
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP


8. 升级后组建的检查

SQL> SELECT COMP_NAME, VERSION, STATUS FROM SYS.DBA_REGISTRY;


完成后进行登录测试以及集群状态检查看是否都在线。

所有的组件都已经升级完毕,并且已经升级到相应的版本。

重启然后再测试,出现问题

重启节点2之后,发现节点2无法与集群通信。在节点1节点2上启动节点2均无法正常启动。但是节点1是正常的。错误如下:

在节点1启动节点2服务的时候,提示无法启动节点2的资源。节点2启动节点2的服务时,提示节点无法与crs进程通信。

crs进行健康检查,发现节点2crs的三个进程cssdcrsd、 evmd均为异常。

经检查所有的日志文件及对ocr进行一致性检查初步确认为ocr中节点2的注册信息已经损坏。导致节点2无法与集群通信。

一. 决定使用ocr的备份恢复。

1. 查看ocr的备份

$ ocrconfig –showbackup


现实ocr的备份是今天中午12点自动备份的,现在时间为下午两点。

2. 查看其内容

# ocrdump -backupfile backup00.ocr


3. 在所有节点停止crs

# crsctl stop crs


4. OCR检查

#cat /etc/oracle/ocr.loc


5. 用一个物理的OCR备份进行还原

# ocrconfig -restore $ORA_CRS_HOME/cdata/crs/day.ocr


6. 在所有节点上启动CRS

# crsctl start crs


发现节点2crs依旧无法正常启动,报错与之前一致。配置可能没生效,决定重启两个节点看能否正常启动。

重新用不同ocr不同备份集恢复,发现故障依旧。

重启两个节点后,crs_stat显示包括节点1、节点2所有的服务均无法正常启动。

手工启动发现节点1与节点2均无法与集群通信。使用ssh也无法连接到节点了,但是可以ping通。应该是重启以后ssh的某些配置还原或者权限改变了。

经检查节点1ssh均没有启动,手工启动ssh报错,提示/var/empty权限不正确,此目录属性不能为写。看来是ssh的某些目录权限在重启后发生了变化。吧/var/empty/目录的写属性去掉以后可以正常ssh了。

二. 第一种方法无效,决定采用第二种方法:卸载原有的clusterware,然后重建clusterware()

1. 首先检查看是否有相应的oracle进程启动,如有则kill掉。

$ps –ef | grep ora


2. 使用OUI卸载原有的clusterware

3. 删除并卸载节点

删除节点(每个节点都要执行)

$CRS_HOME/install/rootdelete.sh


卸载节点(任意一个节点执行)

$CRS_HOME/install/rootdeinstall.sh


4. 备份原有clusterware目录(每个节点都要执行)

#mv /opt/app/crs /opt/app/crsbak


5. 删除原有的clusterware配置信息(每个节点都要执行)

修改 /etc/inittab, 删除以下三行.

h1:2:respawn:/etc/init.evmd run >/dev/null 2>&1 </dev/null
h2:2:respawn:/etc/init.cssd fatal >/dev/null 2>&1 </dev/null
h3:2:respawn:/etc/init.crsd run >/dev/null 2>&1 </dev/null


执行以下命令删除启动信息

rm /etc/oracle/*
rm -f /etc/init.d/init.cssd
rm -f /etc/init.d/init.crs
rm -f /etc/init.d/init.crsd
rm -f /etc/init.d/init.evmd
rm -f /etc/rc2.d/K96init.crs
rm -f /etc/rc2.d/S96init.crs
rm -f /etc/rc3.d/K96init.crs
rm -f /etc/rc3.d/S96init.crs
rm -f /etc/rc5.d/K96init.crs
rm -f /etc/rc5.d/S96init.crs
rm -Rf /etc/oracle/scls_scr
rm -f /etc/inittab.crs
cp /etc/inittab.orig /etc/inittab


清除旧的配置信息

rm -rf /etc/oracle/* (删除ocr.loc


rm -rf /var/tmp/.oracle/tmp/.oracle

6. 清除vote diskocr(任意一个节点执行)

客户使用了三个裸设备,一个ocr、一个是vote disk, 另外一个是asm存放数据文件。现在无法区分这三个裸设备。之前的安装实施手册并没有提到其对应的裸设备是哪个。为了不破坏原有数据决定首先使用dd对三个裸设备进行备份。

#dd if=/dev/raw/raw1 /home/oracle/backup/raw1
#dd if=/dev/raw/raw1 /home/oracle/backup/raw2
#dd if=/dev/raw/raw1 /home/oracle/backup/raw3


Raw1raw2很快完毕,大小在200Mraw3达到几个G, 所以判定raw3asm存放数据文件。后客户工程师与之前实施工程师确认也证实了这一说法。

使用以下命令清空ocrvote disk

dd if=/dev/zero f=/dev/votedisk_device bs=8192 count=2560
dd if=/dev/zero f=/dev/ocr_device bs=8192 count=12800


7. 安装clusterware 10.2.0.1

安装过程中出现无法找到集群,经判断为两个节点因为重启ssh互信丢失,故重建之。Asianux与其它常见的Linuxssh互信机制有有一些差异, 步骤如下。(以下操作每个节点都要执行)

1) 在xinetd.d文件中激活rloginrexecrsh

使用root登录,进入目录/etc/xinetd.d,修改rexecrloginrsh把其中的disable=yes修改为disable=no

重启xinetd,使用/etc/rc.d/xinetd restart

xinetd启动加入到/etc/rc.d/rc.local使其可以开始自动加载

rexecrloginrsh加入到/etc/securetty中,使其可以在终端执行。

2)  修改.rhosts或者/etc/hosts.equiv加入主机名及用户,具体内容如下:

int-dbserver1 oracle
int-dbserver2 oracle
dbserver1 oracle
dbserver2 oracle


3) 重启xinetd,验证用户等效性。

等效性正确以后,便可以找到集群了。

8. 升级clusterware10.2.0.4

按照之前的步骤把clusterware升级到10.2.0.4版本。注意需要重新配置一下vip因为rac无法确认用哪个网络作为 private interconnect了。

完成之后发现listnerONS、 GSDVIP已经注册到OCR中了,还需要把asm与数据库实例注册到OCR

9. 向ocr中注册ASM

$srvctl add asm -n dbserver1 -i +ASM1 -o $ORACLE_HOME
$srvctl add asm -n dbserver2 -i +ASM2 -o $ORACLE_HOME


10. 启动ASM

$srvctl start asm -n dbserver1
$srvctl start asm -n dbserver2


11. 注册数据库对象

$srvctl add database -d testdb -o $ORACLE_HOME


12.  注册数据库实例

$srvctl add instance -d testdb -i testdb1 -n dbserver1
$srvctl add instance -d testdb -i testdb2 -n dbserver2


13. 建立ASM实例与数据库实例的对应关系

$srvctl modify instance -d testdb -i testdb1 -s +ASM1
$srvctl modify instance -d testdb -i testdb2 -s +ASM2


14. 启动数据库

$srvctl start database -d testdb


15. 重新注册taf

$srvctl add service -d testdb -s taftestdb -r testdb -r "testdb1,testdb2" -p basic


16. 启动taf服务

17. 查看是否所有节点的所有服务是否为online

18. 其它一些小问题的处理。

五. 启动业务系统

升级后启动业务系统,测试是否有异常情况。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论