阿里巴巴数据库操作手册 14-发布存储过程、触发器、视图

V1.0

 

Revision

Author/Modifier Comments

No.

Date

1.0 2012-02-13 叶正盛 初稿
       

一、 目的

明确发布存储过程、触发器、视图操作的风险及标准流程,最大限度避免发布存储过程、触发器、视图操作带来的故障。

二、 适用范围

l 创建存储过程、触发器、视图

l 删除存储过程、触发器、视图

l 修改存储过程、触发器、视图

三、 风险评估

l 登录到错误的schema下,导致代码建到错误的schema里,而应用无法访问。

l 漏发代码,导致应用无法访问。

l 提取了错误代码,导致业务逻辑错误。

l 代码编译不通过,导致脚本无法调用。

l 代码逻辑错误,导致数据不正确。

l 代码中有SQL性能差,引起数据库压力高。

l 没有备份旧的代码,导致无法及时回滚。

l 变更的对象有大量并发访问,变更时出现大量library cache pin/lock,导致数据库无法提供服务。

四、 操作流程

1. 准备工作

a) 熟悉要变更对象的代码逻辑,与应用人员沟通新发布脚本的具体功能,发布到哪个数据库环境,及变更对业务的影响。

b) 整理要发布的对象脚本,保存为一个文件,如果代码较多则保存为多个文件。

c) 如果是修改或删除存储过程或视图,到线上检查是否有依赖的对象,变更后依赖对象是否能编译通过,如果有依赖对象需要在变更方案中增加依赖对象的编译脚本,如果有依赖对象不能编译通过,应与应用人员反馈,并修改代码,线下调试通过。

d) 备份本次变更线上运行的对象代码,放在变更方案的回滚脚本中,如果备份脚本较多则单独保存到文件。线上可以用@source显示对象的定义脚本。

e) 如果是删除视图或存储过程,需与应用人员确认对象可以删除,并且从v$sql中检查对象是否还有调用,如果对象还有调用则不能删除。

f) 修改或删除对象需要分析对象的调用逻辑及时间点,如果对象运行的时间很长,则需要选择一个对象没有运行的时间点操作,以免编译锁等待。

g) 如果有其它数据库核心代码(并发访问量非常大)引用变更的对象,变更方案里需增加启停ddl_trigger (ddl_trigger_for_database)的过程。

2. 执行过程

a) 使用ssh工具连接到线上库,在admin环境下,用应用账户登录数据库,SHOW USER检查是否连接到正确的schema。严禁使用sys、system做变更。

b) 如果有其它数据库核心代码(并发访问量非常大)引用变更的对象,先打开ddl_trigger。

c) set define off

d) 执行对象变更脚本。

e) 如果是新建存储过程或视图对象脚本编译出错,检查出错原因,修改确认再执行,如果不能找到出错原因,或者是代码本身有逻辑错误,则联系应用人员进行修改,线下验证后再重新发布。

f) 如果是变更存储过程或视图对象脚本编译出错,先回滚代码,然后检查出错原因,修改确认再执行,如果不能找到出错原因,或者是代码本身有逻辑错误,则联系应用人员进行修改,线下验证后再重新发布。

g) 11g

h) 如果是在已有表上新增或修改触发器脚本编译出错,先回滚代码,然后检查出错原因,修改确认再执行,如果不能找到出错原因,或者是代码本身有逻辑错误,则联系应用人员进行修改,线下验证后再重新发布。

i) 对象编译通过后再编译变更依赖的对象。

j) 如果打开了ddl_trigger,变更验证完成后关闭ddl_trigger。

k) 所有对象发布完毕后,退出业务账户到admin环境。

3. 验证方案

a) 在admin下用@dbcheck脚本验证发布是否引起依赖对象失效,如果有对象失效,检查失效原因,重新编译失效对象,如果有依赖对象编译不能通过,则先回滚当前变更,再查找原因,重新制定变更方案。

b) 在admin下用pkg_check.CompareObject对比线上与线下库是否一致。

Execute pkg_check.CompareObject(‘schema_name’,’object_name’,’object_type’);

如果有线上与线下不一致,通知应用人员,检查不一致原因,直至线上与线下脚本一致。

c) 立即联系开发接口人进行应用测试,如果应用验证有问题,则与应用沟通是否需要回滚,变更是否成功以应用测试结果为准。对于定时执行的对象,应与应用跟踪定时执行的结果,确实变更是否成功。

五、 核心对象风险

变更的对象有大量访问,变更时出现大量library cache pin,导致数据库无法提供服务。

六、 回退方案

使用变更前备份的对象定义脚本回滚,对象定义的回滚脚本要放在数据库本机上,回滚时直接在sqlplus中用@文件名方法运行,最后检查失效对象。

七、 历史故障及教训

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓