对于访问频繁的生产库进行线上变更操作是比较危险的,因为倘若变更失败将导致对象失效不可用,严重影响应用。
下面介绍一下进行线上库变更的流程。
<b>1 对package 中所有sql语句进行review,查看它们的执行计划,确认是否合理。</b>
<b>2 检查包的依赖关系</b>
im@im1>select owner,name,type,dependency_type
2 from dba_dependencies
3 where referenced_owner like upper('%&referenced_owner_like%')
4 and referenced_name like upper('%&referenced_name_like%')
5 and referenced_type like upper('%&referenced_type_like%')
6 and type!='package body';
<b>3 查看发布前对象的有效个数和无效个数以便前后对比</b>
im@im1>select object_type,status,count(*) from user_objects group by object_type,status;
object_type status count(*)
------------------ ------- ----------
type valid 11
view invalid 3
index valid 399
table valid 234
package valid 49
synonym valid 10
function valid 1
sequence valid 173
procedure valid 22
package body valid 49
database link valid 6
index partition valid 79
table partition valid 79
13 rows selected.
<b>4 准备回滚方案</b>
为防止新的包发布不成功,必须将旧的包放在服务器上,当发布失败时,立即执行旧的包,进行操作回滚。
<b>5 发布包。</b>
@/tmp/im_sms_20110727.pkg
<b>6 再次检查对象的有效个数和无效个数,检测是否变更成!</b>
<b>7 如果有无效对象在使用utlrp.sql 进行修复</b><b>以sysdba登录数据库执行:</b>
<b>@?/rdbms/admin/utlrp.sql</b>
<b>8 如果该包被频繁执行,还有监控系统未来30分钟内是否正常!</b>