温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-08-15 14:09:24 来源:ITPUB博客 阅读:379 作者:strivechao 栏目:关系型数据库

一服务公司来单位生产库巡检,检查结果为数据库软件安装了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表中就有记录了,也不会引起困惑了。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI