在“鼠标手”老弟关于“SAP生产系统出故障之后的一些困惑”帖子中,我给他提出了一些问题让
他研究,他研究得非常努力,我很感动。这里我把我对这些问题的心得另建一帖,希望对大家做
BASIS工作有帮助:
下面是引用鼠标手于2009-10-16 14:39发表的sap 生产系统出故障之后的一些困 惑: 问题1:在UNIX下,为什么启动SAP必须要用adm用户?什么东西是该用户独有的?
| |
直接回答是,startsap脚本中有
adm用户检测,非adm用户不能启动SAP。其原因是SAP
的启动需要一些特殊的环境变量来支持,adm用户在登录过程中通过登录文件建立这些环境
变量。
SAP建议adm用户使用csh,如“鼠标手”老弟的研究,.cshrc在登录过程中会被调用,
在.cshrc被执行过程中,以下在SAP安装时时被建立的环境文件会被调用:
a. .sapenv_.csh – 其主要目的是建立PATH, library path环境变量和cdpro等
alias.
b. .dbenv_.csh – 其主要目的是建立于数据库相关的环境变量。
c. .j2eeenv_.csh – 建立JAVA_HOME,CLASSPATH等与J2ee相关的环境变量。
此外还有一些特定产品的环境文件,比如.apoenv, .lcenv等。至于这些关键的环境变量是什么,
起什么作用,则需要你在工作中一点点的研究。环境变量的错误设定将直接导致系统启动过程的
问题,比如在基于Oracle的SAP系统中,TNS_ADMIN环境变量指定了读取tnsnames.ora的路径,在
adm用户下,指向/usr/sap/SID/SYS/profile/oracle,但在DB服务器的ora用户下,是
指向/oracle/SID/xxx_64/network/admin的。如果数据库管理员改变了在/oracle下的
tnsnames.ora,而Basis管理员没有把profile/oracle下的tnsnames.ora同步,那你的SAP连接数
据库就可能有问题,而解决问题的关键线索就是TNS_ADMIN的设定。
除此以外,hostname在SAP的启动过程中到底被如何使用,这是关系到SAP系统高可靠性(HA)运
作的关键问题。环境变量的建立就是其中关键一环。通过对.profile或.cshrc的研究,我们发
现,用户登录时系统是先找.sapenv_.csh(或.sh,如果你的adm使用ksh的
话),如果找不到,则会调用.sapenv.csh。如果你的系统在.sapenv_.csh中做了一些
设定,当系统failover到备份机时,由于hostname的改变,adm用户登录过程会调
用.sapenv.csh文件,那么你的特殊设定就不会被建立,系统运行就会出问题。
环境变量在SAP启动的过程中起非常重要的作用,根据我的经验,20%的SAP正常启动问题,40%在
HA环境下的启动问题是与环境变量有关的。
下面是引用鼠标手于2009-10-16 14:39发表的sap 生产系统出故障之后的一些困 惑: 问题2:读startsap脚本,看看启动SAP到底要什么条件?
| |
记不太清是从哪个版本开始,SAP启动的脚本从adm根目录下的多个startsap_Name>_变成了EXE路径下的startsap脚本。我当年逐行地比较了新旧版本的区别,发现其
中最大的区别是新版的startsap会到profile路径下,根据和去查找所有可以启
动的实例参数文件,然后根据startsap所用参数,启动其中的某一instance(实例,我总觉得这
翻译别扭)或所有instance。而老版本里,特定的实例在安装过程中会有新的
startsap__文件被建立在/home/adm下。新版的特殊性在于它是在EXE路
径下,当更新SAP内核时这一脚本文件也会被更新,但如果你对其有手工改动的话,你的改动在跟
新内核时会被覆盖。
仔细研读这脚本文件,可以发现SAP的启动是靠start_instance_do()函数来实现的(以ECC 6.0为
例),而启动的命令是:
$SAPSTART_INSTANCE pf=$PROFILE_DIR/$START_PROFILE >> $LOGFILE 2>&1
在同一函数定义中可见
SAPSTART_INSTANCE="/usr/sap/$SAPSYSTEMNAME/${1}/exe/sapstart"
START_PROFILE=START_${1}_${HOSTNAME}
所以SAP是通过将sapstart程序在后台运行实现的。在调用过程中使用了START参数文件。这和
“鼠标手”的调查结果是一致的。
至于其他在启动前需要检测的内容,如数据库是否可以连接(通过R3trans –d –w命令),我在
这里不能一一列举。如果你能研读下来,那么阻止sapstart启动的几种原因,例如数据库不能连
接,START参数文件不存在等就都可以了然在胸了。而有些过程,比如saposcol的启动是否影响
SAP启动也可以明了了。
同时,从startsap脚本文件中可以看到,准备启动SAP过程的日志是写在
LOGFILE="${R3S_LOGDIR}/`basename ${0}`_${1}.log"中,也就是/home/adm下的
startsap_.log文件中。很多人把这个日志贴上来问为什么SAP不能启动,我说这文件
是垃圾,希望你现在可以明白为什么了:这日志只记录SAP启动的准备情况,一旦sapstart程序在
后台运行后,它的信息是不能反馈到此日志文件的,这就是为什么你要到work目录下查找相应的
日志文件和跟踪文件。
下面是引用鼠标手于2009-10-16 14:39发表的sap 生产系统出故障之后的一些困 惑: 问题3:'ps -ef'里面,每一个进程都有父进程ID,那么在一个运行的SAP系统中,从AIX OS层面 看,谁是最原始的祖先?(进程1是操作系统根,我不要这个,要由1启动的,带出所有该SAP实例 的那个进程)这进程在运行什么程序?谁启动了这程序,然后交给后台进程1的?
| |
“鼠标手”已经找到了答案:这原始祖先是sapstart,我在上一个问题的解答中已经说明了为什
么会是它。
下面是引用鼠标手于2009-10-16 14:39发表的sap 生产系统出故障之后的一些困 惑: 问题4. 这原始祖先启动了那些儿子?在哪里定义了这些儿子程序是什么?这原始祖先的日志文件 是什么,在哪里?
| |
在启动sapstart时,START参数文件是个启动参数,这就解释了START参数文件是怎么被使用的。
以CI的START参数文件为例,通常情况首先是“Copy SAP Executables”小节,调用的程序是
sapcpe。日志文件是sapcpe.log。去看看这个文件,你就可以明白该程序的目的是
将/sapmnt/SID/exe下的全局内核与/usr/sap/SID/D*/exe下的本地内核同步,从START参数文件的
后面几节可以看到,后续启动的程序都是从本地内核调用的。我前几天有个帖子和老颜一起与
james_lx探讨了为什么应该将/sapmnt/SID/exe放在共享盘上,这sapcpe过程就是SAP在本地运行
而不依赖共享盘的关键步骤。
再往下,是sapmscsa过程,至于它的作用和重要性比较容易理解,自己去查吧。可以告诉你个结
论,如果SAP停止后不使用cleanipc remove 来清理共享内存,则在有些操作系统下
SAP的启动会停在这一步。
再往下,则是启动ms.sap, dw.sap,co.sap,se.sap和ig.sap的小节,在HA的环境下还可能有
en.sap的小节,在Gateway实例的START文件中还有gw.sap小节,在Web Dispatcher实例的START文
件中还有wd.sap的小节。所有这些小节都有跟踪文件和错误文件,在work路径下分别是stdout*和
stderr*。如果你的SAP系统无法启动,在确认sapstart启动的情况下,应该首先查看stderr文
件,看里面有没有致命错误。当然莫些文件里有很多警告信息,可以忽略。当有很多致命错误信
息时,要把注意力放在第一个致命错误上。
通过“鼠标手”列出的’ps –T ’的输出可以看到,由sapstart直接启动的
dw.sap是其他dw.sap的父进程,这个就是SAP BASIS里所说的dispatcher,它的跟踪文件是
dev_disp,是分析SAP启动问题的另一个重要跟踪文件,我个人把它列为第一重要文件。对于它的
讲解,我下一篇文章会解释。
今天已经花了好几个小时,还有四个问题我过两天有时间再解答。如有疑问,欢迎探讨,但如果
你对此贴不知所云,还是补习功课的先。SAP BASIS是门很深的学问,我说的这些都是比认证考试
要深很多的东西,但如果你的工作是SAP BASIS,且你有兴趣,我相信我的解释是会有帮助的。
阅读(2823) | 评论(0) | 转发(0) |