EBS DBA指南笔记(三)
第五章 patching
patch的作用:解决应用代码的问题;安装新的特征;更新technology stack组件。打patch不是一个简单的过程,但我们也没必要深究里面每个细节。
EBS的patch分为两类:
Oracle Applications patching:改变应用的代码程序
Technology stack components patching:更新或修复oracle相关的软件,比如JDK,FORMS,REPORT,iAS。
这一章我们主要讲第一类patch,第二类patch对OS的依赖性很大。
1.Applications Patching
打patch的几个重要步骤:
a.Preparing to patch:注意看readme。
b.Applying patches:包括unbundling the patch,enabling maintenance mode, applying the patch with adpatch, and implementing manual steps。
c.Monitoring and resolving patching issues:use log files and AD control utility监控patch worker processes。
d.Post-patching steps and cleaning up:验证补丁和清理打完补丁后不在需要的文件。
应用patch还可以继续分类:
One-off patch:针对特定的bug。
Minipack patch:one-off patch的集合,有时针对特定的模块。字母代号可以看出版本号,比如AD的版本,minipack patch会叫AD.I
Family Pack patch:minipack的集合,针对一组应用模块。同样字母代号也能看出版本号,比如HR套件J版本的patch:HR_PF.J
Maintenance Pack patch:family pack的集合,针对应用的一个更新版本。比如EBS 11.5.10就是一个maintenance pack。
这些patch的大小逐渐递增,复杂度也越来越高。
此外还有一些特定类型的patch:
Consolidated patch:合并的patch,由一系列one-off patch组成。
Interoperability patch:相互性patch,比如DB升级到10g,那么应用就需要这种类型的patch。
NLS patch:安装了多语言环境后,需要对特定的语言更新一些信息。
Rollup patch:一组one-off patch的集合,用来更新特定产品的代码级别。
Legislative patch:针对HR 顾客薪水册的一个patch。它包含多个国家不同格式的数据(翻译的不好,呵呵)。
Preparing to patch: 一定要仔细阅读readme,它包含了所有的步骤和你需要注意的地方。特别是一些先决条件是否满足了,如果不满足需要按说明一步一步实施,直到条件满足。
注意:如果补丁已经打上了,现在想回退回去,这是不可行的。所以打补丁之前最好有个全系统备份。
建议用电子表格记录打patch的过程。
补丁报告:判断某个补丁是否已经布置上了,查询minipack,family pack的版本。我们可以通过以下几种方法查询:
• Using the adphrept.sql script
• Executing the patchsets.sh utility
• Querying the database
• Using Oracle Application Manager (OAM)
Using the adphrept.sql script:$AD_TOP//patch/115/sql/adphrept.sql 这个SQL可以产生一个补丁报告。关于这个SQL的使用方法和参数可参见MetaLink Note 162498.1。也可以查看书的155页。这个脚本产生一个txt or html格式的报告。运行这个SQL需要用apps的账号。As of Application Utility Minipack version I (AD.I), adphrept.sql no longer generates a text report, but rather an XML report is generated.
patchsets.sh utility:这个工具可以对patch版本进行比较。输出文件有三个字段分别为:Baseline Version: Running Version: Latest Available, Status:
Querying the database:查询ad_bugs表。里面有个bu_number字段。
use OAM: applied patches;patch wizard
打patch:打patch的几个步骤:
1. Download and unbundle the patch.
2. Identify patch drivers required for the patch.
3. Place the instance in maintenance mode.
4. Use the AD Patch utility to apply patch driver files.
5. Perform any manual steps that may be required.
adpatch必须是应用的属主才能运行。
Download and unbundle the patch:注意文件系统的空间。
Identifying Patch Drivers:c-copy driver,用来更新文件。d-database driver,用来更新数据库代码级别和对象。g-generate driver。 u-unified driver,是对前三种driver的整合。
Enabling Maintenance Mode:有两种方法:adadmin选择菜单;运行$AD_TOP/patch/115/sql/adsetmmd.sql with the ENABLE parameter $AD_TOP/patch/115/sql/adsetmmd.sql with the DISABLE parameter
建议停应用在设置维护模式,如果在线设置维护模式,即使你禁止维护模式,还是要重启应用才能解除维护模式。我们可以用adpatch的hotpatch选项来打patch这样不用将instance置于维护模式。但oracle还是建议置于维护模式后打patche这样可以提高打patche过程中的性能。
use adpatch:在执行adpatch之前需要去掉应用或数据库的密码约束,以免在建新用户的时候出错。adpatch有一些有用的选项可以通过adpatch help=y来查看。通用语法为:adpatch options=[option1, option2..]
常用的一些选项可以看书的162页。如果你打patch的数量较多,可以选择nocompilejsp,nocompiledb, noprereq, and novalidate选项,这样可以加速打patch的速度。在打patch结束的时候会编译JSP和DB对象,这时候将DB置为noarchive模式也可以是打patch的过程获得好的性能。切换到存放patch driver的路径然后运行adpatch。之后会问你一些问题。如果遇到不是u driver那么按c,d,g driver的顺序打。打patch的时候也可以不是交互式的,defaultsfile选项指定一个文件位于:$APPL_TOP/admin/$CONTEXT_NAME,这个选项通常用interactive=no的模式
Performing Manual Steps:当打patch的过程中需要手工运行一些命令的时候,我们可以编写一些脚本,这样不但会减少错误而且加快打patch的过程。
特殊的考虑:
Applying Legislative Patches:For Oracle Payroll customers, there is another category of patch required by the system. The hrglobal patch supports the legislative requirements of multiple countries.
hrglobal patch的打法跟普通patch有所不同,请参考书的165页。
Using AD Merge:当要布置一组大patch的时候,比如maintenance pack,累积更新。我们可以将多个patch合并成一个patch。这会使性能得到提高。把这些patch放到一个目录,然后用admrgpch进行合并。例如:
admrgpch /source_dir /target_dir 运行完成后在目标目录有个名为u_merged.drv的文件,这就是合并后的patch driver。详细的使用过程可以参考MetaLink Note 228779.1。关于admrgpch的一些常用选项请参考书的167页。
Applying NLS Patches:额外的语言环境需要NLS patch。多种语言的patch应该先打英文的patch。可以利用admrgpch来将英文的patch合并成一个patch,将非英文的合并成另一个patch。
Performing Multi-Node Patching:如果是共享应用层的文件系统,patch将应用到所有节点。如果不是共享的应用层文件系统,那么每个相关的文件系统都要布置补丁。详情参见MetaLink Note 233428.1 --describes sharing the application-tier filesystem.
监控和解决补丁的问题:
adpatch session有时会显示错误或者某个任务运行很长时间。这种情况我们需要查看adpatch日志或者是相关联的work log file。我们必须找到work失败的原因,然后用adctrl继续patching的过程。
查看日志文件:日志文件的目录在$APPL_TOP/admin/$CONTEXT_NAME/log 日志文件名可以在打patch的过程中指定。关于works 的日志命名一般为:adwork[xxx].log。xxx为patch worker process的编号。
使用AD Control:这是管理patch works的管理工具。当works出问题的时候,需要DBA用adctrl介入。adctrl在admin node上执行。“Skip Worker”这个选项在adctrl中是隐藏的。他的选项代号是8。使用这个选项最好在oracle support的支持下运行。AD.I这个版本,adctrl可以以非交互式的方式运行。这样可以加快补丁问题的解决。
解决worker失败的问题:If a worker has failed, the adpatch session will normally display a failedworker message。通过adctrl可以看到worker的状态。如果worker失败可以查看它的日志,如果worker的问题解决了,可以用adctrl重新运行worker。以下是在打patch的过程中经常遇到的问题:
Error message: ORA-01013: user requested cancel of current operation
Resolution to error: If this error occurs, simply use adctrl to restart the
worker on the current machine.
Error message: Patch not applied successfully, adpatch did not cleanup
its restart files (*rf9).
Resolution to error: If this error occurs, execute the following as the
instance owner:
$cd $APPL_TOP/admin/$CONTEXT_NAME
$mv restart restart_old
$mkdir restart
After cleaning up the restart files, you may then restart the adpatch
session using adpatch.
Error message: ERROR: Javakey subcommand exited with status 1
Resolution to error: If this error occurs, the identity.obj file needs to
be re-created. See Chapter 2 for steps to recreate the identity.obj file.
Then, use adctrl to restart the failed worker.
Error message: No error message is displayed; rather the worker log file
states that the worker is complete, yet adctrl indicates that the worker is
still running.
Resolution to error: This patching problem occurs when the worker is
complete, but did not update patching tables correctly to notify the
adpatch session that it has finished. In this scenario, the adpatch session
is still waiting for the finish return code from the worker. When this
occurs, use adctrl to fail the worker, then restart the worker.
■Tip Any form, library, or report that fails to generate during the patch process can be
regenerated manually after all patching and post-patching steps have completed. If the
object still fails to compile, open an SR.
打patch过程遇到问题需要注意的地方:a.打patch的时候hung住了,或者worker失败,但又找不到原因。这时可以查看数据库的无效对象,如果无效对象较多,可以进行编译后在进行adpatch。
b.如果adpatch session hung了,其它的一些解决方法也执行过了。这时可以尝试重启DB。有时这种方法是必须的,比如打较大的patch(maintenance patch)
c.打补丁遇到错误的时候,可能需要打另一个补丁来解决这个错误。
Post-Patching Steps:很多补丁到最后都会有这一步,这一步主要的动作如下:Typical post-patching steps include generating message files, regenerating JAR files, regenerating menu options, relinking
executables, recompiling invalids, and recompiling flexfields. 这个动作也可以用adadmin来完成。 打完patch后,需要检查dba_jobs看看有没有新的job,这个job是不是必须的。
Patching Cleanup:可以删除的文件:$FND_TOP/bin directory are files such as FNDSCH.sav and FNDSCH.xxxxx, where xxxx is a number. These files are copies of the FNDSCH file created by the patch utility.
$APPL_TOP下运行find命令找出这些文件:$find . -name "*.sav" 这些都可以安全的删除。 当有些文件你无法确定是能删除时,最好做备份。删除后看应用是否正常。最后patch的原文件也可以删除。
2.Database Patching
注意添加opatch路径:export PATH=$PATH:$ORACLE_HOME/OPatch
打内部补丁:切换到补丁所在目录,$opatch apply 查看DB打过的内部补丁:$opatch lsinventory
如果opatch失败,在$ORACLE_HOME/.patch_storage目录下有个patch_locked的文件,这个文件需要删除。
3. Patching Best Practices
oracle每季度发布一次关键patch。Technology stack components and product groups such as AD and FND are often prerequisites for future patches, such as Maintenance Packs and mandatory Family Packs.
第六章 Toolkit
1.EBS的一些工具和命令
应用各组件的启动关闭脚本:参见P178.因为存放启动关闭脚本的目录经常用到,所以我们可以自定义一个环境变量,如:export SCRIPT_TOP=$APPLCOMN/admin/scripts/$CONTEXT_NAME
adstpall.sh and adstrtal.sh 这两个脚本可以定制。
2.修改应用,oracle,applsys,apps的密码
修改应用用户的密码可以进系统界面改:安全-》用户-》定义。也可以用FNDCPASS工具改。比如修改用户test的密码为hello:
$FNDCPASS APPS/APPS 0 Y system/manager USER test hello --apps,system均需要正确的密码。
修改oracle用户的密码也可以用这个工具。比如修改AP这个用户的密码为passwd#1:
$FNDCPASS APPS/APPS 0 Y system/manager ORACLE AP passwd#1
修改applsys,apps的密码也是用这个工具。applsys,apps这两个用户的密码是同步的。举个修改apps密码为oracle#1的例子:
$FNDCPASS APPS/APPS 0 Y system/manager SYSTEM APPLSYS oracle#1
用FNDCPASS修改apps的密码后还需要做一些工作:运行autoconfig或者修改以下这些文件的apps密码:
• $ORACLE_HOME/listener/cfg/wdbsvr.app
• adcmctl.sh
• $OA_HTML/bin/appsweb.cfg
• $AD_TOP/admin/template/CGIcmd.dat (if in use)
注意:FNDCPASS的修改不同类型用户密码的参数:USER,ORACLE,SYSTEM.
如果你想加密wdbsvr.app文件中apps的密码可以按以下步骤进行:
1. Set the following in the wdbsvr.app file: administrators = all
2. Comment out the following in the wdbsvr.app file: custom_auth
3. Restart the HTTP Server.
4. Go to the following URL:
http://[hostname.domain.com]:[port]/pls/admin/gateway.html
5. Edit the Applications DAD by entering the new APPS password.
6. Save the configuration. The password in the wdbsvr.app file is now
encrypted.
7. Set the following in the wdbsvr.app file: administrators=system
8. Set the following in the wdbsvr.app file: custom_auth=CUSTOM
3.重新链接应用执行文件。
有时,重新链接执行文件是必须的。比如:打patch的最后提交阶段;解决应用的执行问题。重新链接执行文件有两种工具可以完成:AD ADMIN; AD RELINK
AD RELINK: adrelink.sh force={y|n} [<optional args>] "<targets>" or adrelink.sh force={y|n} [<optional args>] filelist=<file>
--"<targets>" is "<product> <module name>", and <file> is the name of a file that contains a list of files to relink.
举个例子:$adrelink.sh force=y "ad adadmin"
$adrelink.sh force=y "ad adadmin""ad adpatch"
$adrelink.sh force=y "ad all"
AD ADMIN:需要回答一些问题。
4.重新生成Forms, Libraries, and Menus
可以用f60gen或AD ADMIN来完成。
f60gen:可重新生成forms, libraries, and menus。详细语法如下:
f60gen [filename.[fmb|mmb|pll]] module_type=[form|menu|library] output_file=[path/file_name].[fmx|mmx|plx] userid=[apps]/[apps_password]
举例:$cd $AU_TOP/forms/US
$f60gen module=GLXJIRUN.fmb module_type=form output_file=$GL_TOP/forms/US/GLXJIRUN.fmx userid=APPS/APPS
AD ADMIN:有很多选项可以选择。
5.重新编译JSP页面。
JSP页面会自动编译,但有时手工编译会提高性能。编译的工具是:JSP precompiler. JSP预编译程序会调用ojspCompile.pl Perl script. 使用这个工具的前提在metalink Note 215268.1上有介绍。这个工具的具体语法如下:
ojspCompile.pl [COMMAND] [ARGS]
举例:$ojspCompile.pl --compile --flush -p 10 --force compiling all JSP pages with parallel execution of 10
$ojspCompile.pl --compile -s 'jtf%' --compiling all JSPs that start with the string jtf:
$ojspCompile.pl --compile -log /oracle/admin/vis/log/compile_jsps.log --compiling all delta JSP pages:
6.确定各组件的版本。
查看应用文件的版本:ident,adident,string都可以查看。ident在SUN,AIX上用不起来。
[ident|adident] [pattern] [file1 |, file2, file3, . . .]
举例:$ident Header OA.jsp
OA.jsp:
$Header OA.jsp 115.56 2004/07/16 04:02:21 atgops1 noship $
$strings -a [filename] | grep [pattern]
举例:$strings -a OA.jsp | grep Header
<%! public static final String RCS_ID = "$Header: OA.jsp 115.56
JInitiator Version:分应用端和客户端的版本。
应用端:查看$OA_HTML/bin/appsweb_${CONTEXT_NAME}.cfg file
客户端:到控制面板查看。
应用端和客户端的JInitiator Version一定要相同,否则会出问题。
Apache Version and Rollup Patch:$cd $APACHE_TOP/Apache/bin/
$httpd -version
EBS11.5.10.2的版本是这样的:$ cd $IAS_ORACLE_HOME/Apache/Apache/bin
$httpd -version
Forms and PL/SQL Version: $f60gen help=y或者可以到客户端打开form session然后click on the Help ➤About menu
获得了forms的version我们可以知道forms的patches。具体信息我们可以参考MetaLink Note 266541.1
Forms Patchset Forms Version
17 6.0.8.26
16 6.0.8.25
15 6.0.8.24
14 6.0.8.23
Oracle Applications Framework Version:using the ident, adident, or strings command to retrieve header information from the OA.jsp file in the $OA_HTML and $FND_TOP/html directories.
Header information is then used to look up the corresponding OA Framework version。具体信息请参考:MetaLink Note 275874.1
OA Framework Version OA.jsp Version
5.10 115.56
5.7 115.36
5.6 115.27
举例:$ident Header $FND_TOP/html/OA.jsp
还有一种方法可获得OA Framework version。http://[hostname.domain.com]:[port]/OA_HTML/OAInfo.jsp
OJSP Version:http://[hostname.domain.com]:[port]/OA_HTML/test.jsp --11.10.5.2好像没有这个文件。
JDK Version:$java -version
Java Class File Versions:
unzip -l apps.zip | grep [class file] --Review the zip file to obtain the full path of the zipped Java class:
unzip -j apps.zip [path/class file] --Extract the Java class from the zipped file:
strings -a [class file] | grep Header --Retrieve the header information from the Java class with the strings command:
如果不在压缩包里,可以用以下命令:
$strings -a $JAVA_TOP/oracle/apps/inv/mo/server/MOLine.class | grep '$Header'
数据库的版本:SQL> select comp_name, version, status from dba_registry; --可获得DB各组件的版本。
7.其它的一些命令和用法
unix的一些基本命令(略)
找到并删除进程的内存段和信号量:当停止或kill一个进程后,然后重启这个进程会发现它的内存段和信号量并没有释放。有两个命令用来查看和删除这些内存段和信号量:ipcs;ipcrm
$ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch
status
0x00000000 6946816 oracle 600 1056768 12 dest
0x00000000 6979585 oracle 600 1056768 12 dest
0x00000000 7012354 vis 600 8589316 10 dest
0x00000000 7045123 oracle 600 1056768 11 dest
0x00000000 7077892 vis 600 1056768 10 dest
0x00000000 7110661 oracle 600 8589316 9 dest
------ Semaphore Arrays --------
key semid owner perms nsems status
0x00000000 1081344 oracle 600 1
0x00000000 32769 vis 600
$ipcs -a | grep vis
0x00000000 7012354 vis 600 8589316 10 dest
0x00000000 7077892 vis 600 1056768 10 dest
0x00000000 32769 vis 600
$ipcs -help --查看一些参数信息。
ipcrm -m [segment number] --语法,删除内存段
$ipcrm -m 7012354 --7012354是memory segment
$ipcrm -s [segment number] --语法,删除信号量
$ipcrm -s 32769
查找并删除打印任务:lpstat -p[print queue]
$lpstat -p --列出所有的的打印任务。
lprm -P[print queue] [job number]
$lprm -P lp1 785 --删除指定的打印任务。
结束DB sessions:alter system kill session '&sid,&serial#';
8.调度脚本
可以用crontab和EM 10g Grid Control来完成调度。EM 10g Grid Control还可以用来管理和监控EBS,详细信息请参考MetaLink Note 308320.1
注意:EM Management Packs需要额外的lisence。
9.常规的一些维护
这些维护包括:收集统计信息;重新编译无效对象;清理日志文件;重建索引;重启apache server;清除并发请求日志;清除工作流历史数据;清除归档数据。
收集统计信息:根据业务繁忙情况,但至少一周统计一次。使用fnd_stats来进行统计信息的收集,它是基于dbms_stats package的。在EBS中不能使用dbms_stats package来收集信息,只能用fnd_stats。以下是一些范例:
• fnd_stats.gather_schema_statistics: Used to gather statistics for schemas
• fnd_stats.gather_tables_stats: Used to gather table-level statistics
• fnd_stats.gather_column_stats: Used to gather column-level statistics
• fnd_stats.gather_index_stats: Used to gather index statistics
SQL> exec fnd_stats.gather_schema_statistics('ALL')
SQL> exec fnd_stats.gather_schema_statistics('GL')
SQL>exec fnd_stats.gather_schema_statistics('HR',estimate_percent=>30);
Oracle provides a script named coe_stats.sql to assist with automating the gathering of statistics.
我们也可以通过提交并发请求来定期的收集统计信息。我们可以查询上次进行统计数据的时间。举例:
SQL> select table_name, last_analyzed from dba_objects where owner='GL' and table_name='GL_BALANCES';
fnd_stats.verify_stats ('[schema]', '[schema.table_name1, schema.table_name2, . . . ,schema.table_namen]')
SQL> exec fnd_stats.verify_stats('GL', 'GL.GL_BALANCES');
重新编译无效对象:
SQL> exec utl_recomp.recomp_parallel(8); 用adadmin也可以编译。最好定期执行这个操作。
清理日志文件:清理日志可以节省文件系统空间。举个清除过期日志的脚本:
#Script used to rotate and remove log files > 30 days old
#Script name is rotate_logs.sh
LOGFILES=$1
NUM_DAYS_RETAIN=30
DATE=`date +%m%d%y`
#read in list of logfiles
awk '{print $0}' $LOGFILES | while read FILENAME
do
# check that file exists.
if [ -f $FILENAME ]
then
# Make sure the entry does not refer to multiple files
RESULTS=`ls -l $FILENAME | wc -l`
if [ $RESULTS -gt 1 ]
then
exit 1
fi
# backup file and remove old copies
cp $FILENAME $FILENAME.$DATE
cp /dev/null $FILENAME
find . -name "$FILENAME.*" -a -mtime +NUM_DAYS_RETAIN -exec rm {}
\;
fi
done
$cat logfiles.txt --这个文件作为脚本的参数,列出了需要清除的日志文件。
/u01/oratop/iAS/Apache/Apache/logs/error_log
/u01/oratop/iAS/Apache/Jserv/logs/jserv.log
/u01/oratop/8.0.6/network/log/sqlnet.log
$sh rotate_logs.sh logfiles.txt --执行这个脚本。我们也可以将它写入crontab定期执行。
一些常见log的路径可以参考书的214页。
重建索引:bde_rebuild.sql这个脚本是oracle提供的,用来重建索引。最新的版本可以参考MetaLink Note 182699.1。rebuild index可以在线进行,但最好在DB不忙的时候。另外这个过程会记录大量的redolog,所以你的archive所在的目录要足够大。
重启apache server:原因:彻底的断开JDBC thin client端跟数据库的连接;让应用的配置生效。手工清除apache缓存。
清除并发请求日志:可以提交标准请求:Purge Concurrent Request and/or Manager Data来清除并发请求和(或)管理器数据,主要是清理表的一些历史数据,和一些log,out文件。FNDCPPUR也可以干这个事情,具体没用过。
清除工作流历史数据:提交标准请求:Purge Obsolete Workflow Runtime Data。 FNDWFPR也可以干这个事情。主要是清除表的一些历史记录。建议每天定期执行。
清除归档数据:根据各公司的情况定。对数据的保留时间各公司的要求是不一样的。
10.克隆
快速克隆:有两篇文档可以参考:MetaLink Notes 230672.1 and 216664.1
在OAM里有克隆向导:Site Map ➤Maintenance ➤Cloning menu options. Two wizards, Simple Clone and Advanced Clone。建议现在测试环境测试。
注意:如果应用层没用打PATCH,也就是说APPL_TOP没有改动。我们可以只clone数据库。
克隆后要处理的工作:快速clone没有清理工作流相关的表和配置文件,site-level profiles除外。另外如果打印机的需求不一样,还需要在clone instance重新定义打印机。具体详细的工作可以参考MetaLink Note 230672.1
其它一些处理工作可能要看你的环境需求。比如修改APPS密码;从APPLCSF删除一些文件;限制一些用户访问系统。
注意:Do not end-date the GUEST or SYSADMIN account in the application, as it will render the application unusable until the accounts are un-end-dated.
第七章 资源
EBS DBA可以利用的一些资源:Oracle Support;用户社区和会议;在线资源;相关的书籍和期刊
http://www.oaug.org
http://www.ioug.org