第一部分 问题描述
[问题症状一]:
当运行asmcmd命令行无法运行,输入完毕后终端挂起,只能强行结束。对asmcmd做strace诊断内容如下:
[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()函数调用死循环。
[问题症状二]:
RAC的ons服务无法启动。
使用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的三个进程cssd、crsd、 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
发现节点2的crs依旧无法正常启动,报错与之前一致。配置可能没生效,决定重启两个节点看能否正常启动。
重新用不同ocr不同备份集恢复,发现故障依旧。
重启两个节点后,crs_stat显示包括节点1、节点2所有的服务均无法正常启动。
手工启动发现节点1与节点2均无法与集群通信。使用ssh也无法连接到节点了,但是可以ping通。应该是重启以后ssh的某些配置还原或者权限改变了。
经检查节点1的ssh均没有启动,手工启动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 disk与ocr(任意一个节点执行)
客户使用了三个裸设备,一个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
Raw1与raw2很快完毕,大小在200多M,raw3达到几个G, 所以判定raw3为asm存放数据文件。后客户工程师与之前实施工程师确认也证实了这一说法。
使用以下命令清空ocr与vote 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与其它常见的Linux的ssh互信机制有有一些差异, 步骤如下。(以下操作每个节点都要执行)
1) 在xinetd.d文件中激活rlogin、rexec、rsh
使用root登录,进入目录/etc/xinetd.d,修改rexec、rlogin、rsh把其中的disable=yes修改为disable=no
重启xinetd,使用/etc/rc.d/xinetd restart
把xinetd启动加入到/etc/rc.d/rc.local使其可以开始自动加载
把rexec、rlogin、rsh加入到/etc/securetty中,使其可以在终端执行。
2) 修改.rhosts或者/etc/hosts.equiv加入主机名及用户,具体内容如下:
int-dbserver1 oracle
int-dbserver2 oracle
dbserver1 oracle
dbserver2 oracle
3) 重启xinetd,验证用户等效性。
等效性正确以后,便可以找到集群了。
8. 升级clusterware到10.2.0.4
按照之前的步骤把clusterware升级到10.2.0.4版本。注意需要重新配置一下vip,因为rac无法确认用哪个网络作为 private interconnect了。
完成之后发现listner、ONS、 GSD、VIP已经注册到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. 其它一些小问题的处理。
五. 启动业务系统
升级后启动业务系统,测试是否有异常情况。