日归档:2015 年 5 月 3 日

数据库升级和DDL trigger

升级数据库时,比如从9i或者10g升级到11.2,官方文档强调需要禁用DDL trigger。 这里尤其要说的是OGG的DDL TRIGGER,如果升级前不禁用,很坑爹,具体参见《OGG DDL trigger造成升级数据库后大量SYS对象失效和数据库DDL失效》 那么什么是DDL trigger呢? 我们来做个测试: 这里我们看到了,TRIGGER_TYPE为BEFORE EVENT,这个显然是DDL trigger。 那么还有哪些类似的呢,我们来查看一下: 上面trigger type,从名字也很容易看出,至少两种: BEFORE EVENT和AFTER EVENT。 如果查询trigger event,你会看到有明显的DDL字样的类型的trigger: 上述具体含义可以查询Oracle官方文档,大概解释如下: 那么文档中所说的禁用DDL trigger到底是哪一种呢?下面我们测试一下,如果不禁用DDL trigger会是什么情况。 首先我们查询当前数据库中的trigger_type in (‘BEFORE EVENT’,’AFTER EVENT’)的DDL: 下面我们只把TRIGGERING_EVENT为DDL的trigger进行disable,然后执行数据库升级操作,之后来看看效果: 升级过程后续会单独写一个BLOG,这里不赘述。 升级过程没有任何报错,完美升级结束后,我们来检查一下数据库无效对象,发现确实有4个无效对象。 不过,数据库所有组件正如我们看到的升级过程一样,都是有效的,且已经升级成功: 上面看到有3个是OGG的,不用想,这个坑爹的OGG DDL功能造成的,另外一个SYS的DDLCTXINFO,这个比较眼生,检查它是什么来路: 可见,还是OGG DDL的东西,于是清理上述4个无效对象: 再次检查,已经没有无效对象,且数据库组件全部有效: 总结: 1,数据库升级前,一定要检查OGG用户的DDL功能是否已经被禁用,如果没有,麻利儿禁用它 … 继续阅读

发表在 Database | 标签为 | 留下评论