安装PSU后一定要运行catbundle.sql psu apply脚本吗

来源:这里教程网 时间:2026-03-03 13:27:04 作者:

一服务公司来单位生产库巡检,检查结果为数据库软件安装了PSU补丁,但是数据库中没有运行相关的升级脚本,并且提交了相关的书面报告给单位建议在数据库中运行catbundle.sql psu apply脚本。 真的像服务公司说的那样吗,看了看报告,原来服务公司是根据查询registry$history表中的记录来检查的,自己查询了一下,确实一条记录都没有,然后又回去仔细看了一遍PSU的readme,如果采用custome方式建库的话是不需要运行catbundle.sql的呀,当然都是纸上谈兵,还是动手分析一下catbundle.sql psu apply做了哪些动作吧。 首先分析一下catbundle.sql脚本,其中有段这样的话: catbundle.sql will look in $ORACLE_HOME/rdbms/admin for an input XML file named bundledata_ .xml (i.e. bundledata_CPU.xml) for information about which patches in the bundle contain which SQL files. 即根据$ORACLE_HOME/rdbms/admin/bundledata_PSU.xml文件中的内容来决定该PSU中需要执行哪些SQL文件,bundledata_PSU.xml文件中的部分内容: ?/rdbms/admin/prvtjob.plb ?/rdbms/admin/dbmsaqds.plb ?/rdbms/admin/prvtaqds.plb ?/rdbms/admin/prvtlmd.plb ?/rdbms/admin/prvtlmc.plb ?/rdbms/admin/prvtbpp.plb ?/rdbms/admin/prvtlsby.plb ?/rdbms/admin/dbmssum.sql ?/rdbms/admin/prvtsum.plb ?/rdbms/admin/prvtsms.plb ?/rdbms/admin/prvtdefr.plb ?/rdbms/admin/prvtbstr.plb ?/rdbms/admin/prvtbcap.plb ?/rdbms/admin/initqsma.sql 应该是根据数据库安装不同的组件需要执行不同的SQL,继续分析catbundle.sql脚本,文件的最后有如下几行: COLUMN script_file NEW_VALUE sf NOPRINT; SELECT :scriptFile AS script_file FROM dual; @&sf 即script_file为需要执行的脚本,将catbundle.sql拷贝一份,最后几行内容修改为: BEGIN DBMS_OUTPUT.PUT_LINE('script. file: ' || :scriptFile); END; 看看打出来需要执行的脚本叫什么。 SQL>@catbundle_test.sql psu applay 输出script. file: /u01/app/oracle/product/10.2.0/db_1/rdbms/admin/catbundle_PSU_OTEST_APPLY.sql 原来执行的SQL文件是catbundle_PSU_OTEST_APPLY.sql,查看该文件内容,如下内容和bundledata_PSU.xml文件中的内容相符合: PROMPT Processing Oracle Database Packages and Types... ALTER SESSION SET current_schema = sys; @?/rdbms/admin/prvtjob.plb @?/rdbms/admin/dbmsaqds.plb @?/rdbms/admin/prvtaqds.plb @?/rdbms/admin/prvtlmd.plb @?/rdbms/admin/prvtlmc.plb @?/rdbms/admin/prvtbpp.plb @?/rdbms/admin/prvtlsby.plb @?/rdbms/admin/dbmssum.sql @?/rdbms/admin/prvtsum.plb @?/rdbms/admin/prvtsms.plb @?/rdbms/admin/prvtdefr.plb @?/rdbms/admin/prvtbstr.plb @?/rdbms/admin/prvtbcap.plb @?/rdbms/admin/prvtaqiu.plb PROMPT Processing Oracle Java Supplied Packages... ALTER SESSION SET current_schema = sys; @?/rdbms/admin/initqsma.sql @?/rdbms/admin/initcdc.sql 即根据数据库安装的组件,需要执行上述SQL脚本,这里只有CATPROC和CATJAVA组件,之后执行完后往registry$history表中插入记录: PROMPT Updating registry... INSERT INTO registry$history (action_time, action, namespace, version, id, bundle_series, comments) VALUES (SYSTIMESTAMP, 'APPLY', SYS_CONTEXT('REGISTRY$CTX','NAMESPACE'), '10.2.0.2', 2, 'PSU', 'PSU 10.2.0.4.2'); COMMIT; 这里就重点分析那些plb文件在使用custome方式建库的时候是否调用了,为此写了一个SHELL脚本: mygrep()  { fn=$1 #保存传入的文件名 shift msg=$* #保存传入的消息 fnt=`echo $fn | cut -d . -f 1` #由于SQL文件中有的是写成@@dbmssum模式,有的是写成@@prvtjob.plb模式, ff=`grep "@@$fn" *.sql || grep "@@$fnt" *.sql` #即带扩展名和不带扩展名,因此可能需要截断一下 if [ "$ff" != "" ]; then #对于catjava.sql中的调用是不带@@的,所以可以进入到下面循环的是catproc.sql的 fn1=`echo $ff | awk -F:@@ '{print $1}'`  if [ "$fn1" = "catproc.sql" ]; then if [ "$msg" = "" ]; then echo "$fn found in $fn1" else echo "$msg$fn found in $fn1" fi else msg="$msg$fn found in $fn1 \t" mygrep $fn1 $msg fi else grep -q $fn catjava.sql if [ "$?" = "0" ]; then echo "$fn found in catjava.sql" else echo "$fn not found" fi fi } for f in `cat << EOF #需要查询的SQL文件名 prvtjob.plb dbmsaqds.plb prvtaqds.plb prvtlmd.plb prvtlmc.plb prvtbpp.plb prvtlsby.plb prvtsum.plb prvtsms.plb dbmssum.sql prvtdefr.plb prvtbstr.plb prvtbcap.plb prvtaqiu.plb initqsma.sql initcdc.sql EOF` do msg="" mygrep $f $msg done 执行输出如下: prvtjob.plb found in catproc.sql dbmsaqds.plb found in catqueue.sql      catqueue.sql found in catproc.sql prvtaqds.plb found in catqueue.sql      catqueue.sql found in catproc.sql prvtlmd.plb found in catproc.sql prvtlmc.plb found in catproc.sql prvtbpp.plb found in catdpb.sql         catdpb.sql found in catproc.sql prvtlsby.plb found in catproc.sql prvtsum.plb found in catproc.sql prvtsms.plb found in catproc.sql dbmssum.sql found in catproc.sql prvtdefr.plb found in catreps.sql       catreps.sql found in catrep.sql         catrep.sql found in catproc.sql prvtbstr.plb found in catpstr.sql       catpstr.sql found in catproc.sql prvtbcap.plb found in catpstr.sql       catpstr.sql found in catproc.sql prvtaqiu.plb found in catqueue.sql      catqueue.sql found in catproc.sql initqsma.sql found in catjava.sql initcdc.sql found in catjava.sql 虽然存在递归调用,但最终都是在catproc.sql和catjava.sql脚本里调用了,熟悉custome方式建库的应该都知道这两个脚本在建库阶段必须调用的, 因此不需要运行catbundle.sql psu apply啦,神马都是浮云啦。 另外对于readme里的view_recompile_jan2008cpu.sql也是不需要执行的,脚本中的一小段: CURSOR alter1(objectno number) IS SELECT o.obj#, 'ALTER VIEW' || ' "' || u.name || '"."' || o.name || '" ' || 'COMPILE ' FROM obj$ o, user$ u WHERE o.type#=4 AND u.user# = o.owner# AND o.obj# in (select unique d_obj# from access$ where types=9) AND o.obj# > objectno order by obj#; 该脚本只是把所有符合条件的视图COMPILE了一遍,这个在建库的过程中都执行了 其实在readme里也说了,需要run脚本的只有以下几种情况: ?Using DBCA (Database Configuration Assistant) to select a sample database (General, Data Warehouse, Transaction Processing) ?Using a script. that was created by DBCA that creates a database from a sample database ?Cloning a database that was created by either of the two preceding methods, and if Section 2.3.3.1, "Loading Modified .sql Files into the Database" and Section 2.3.3.2, "Recompiling Views in the Database" were not executed after PSU 10.2.0.4.2 was applied 对于view_recompile_jan2008cpu.sql则是: Upgraded databases require that you perform. the steps in Section 2.3.3.2, "Recompiling Views in the Database" if these steps have not previously been performed; otherwise, no post-installation steps need to be performed. 即如果升级数据库前没有run过则需要跑一遍,如果以前曾经run过就不需要了,仅需一次而已。 当然如果你的库是在安装好PSU前就已经建立的了,则catbundle.sql psu apply必须run,view_recompile_jan2008cpu.sql则曾经run过就不需要了 另外有metalink账户的可以看下Introduction To Oracle Database catbundle.sql [ID 605795.1]这篇文章,其中有段: Starting with Database 11.2.0.2.0, a dummy catbundle.sql is run at database upgrade and creation time, which creates a dba_registry_history entry with bundle series "PSU" and ID = "0". Reports that query on this view for the PSU series returns a row for every upgraded and newly created database. 即从11.2.0.2.0开始,建立一个新库或者升级时会运行一个dummy catbundle.sql,这样registry$history表中就有记录了,也不会引起困惑了。

相关推荐