DUAL表认识与破坏后的恢复

认识DUAL

DUAL是由Oracle数据库和数据字典自动创建的表,位于用户SYS的模式中,但可以通过名称DUAL访问所有用户。 它有一列DUMMY,定义为VARCHAR2(1)。存在一行数据,其值为X。

从DUAL表中选择对于使用SELECT语句计算常量表达式非常有用。 因为DUAL只有一行,所以该常量只返回一次。 或者,我们可以从任何表中选择常量,伪列或表达式,但该值将返回与表中的行相同的次数。

有关DUAL表,我们可以掌握以下几点:

① DUAL是系统提供的一个虚表,也常称为DUMMY表,临时显示结果的表,里边的内容没有特定的意义,就是为了存在而存在

② DUAL是属于SYS SCHEMA的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用,如下:


③ ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录,我们可测试,往DUAL表中插入多条记录,但始终显示的是一条记录。

④ DUAL表出现问题,所有相关的基础操作都会受到影响;若是DUAL表被删除的话,数据库将不能启动,报ORA-01775的错误。

⑤ DUAL表在数据库启动的不同阶段,里边的字段还是会有一些不同。在数据库OPEN状态下是一行一列的表,在mount和nomount状态下是一行四列的表,如下:

DUAL表破坏后的恢复

  • 首先测试删除SYS用户下的DUAL表:


  • 可以看到删除DUAL表的时候并没有报错,但是查询的时候报错了,并且系统中大约有1000多个对象变为了无效的状态


  • 那时因为业务系统中的PL/SQL代码中含有大量的DUAL查询,若是该表被删除,对系统的影响是非常大的。

查看告警日志,也有一些错误报出如下:

恢复过程

DUAL的恢复分为2种情况,一种是数据库在没有重启的情况下,第二种是数据库在重启的情况下,但是总的恢复原则都是在数据库OPEN状态下重建DUAL表。

  • 不重启数据库

a、不重启数据库的情况下我们可以采用重建DUAL表,插入DUMMY 的数据。


b、可以看到DUAL表已经重建成功了,但是还有很多的无效对象,下边我们利用脚本@?/rdbms/admin/utlrp.sql 来重新编译这些对象。编译后,无效对象消失,数据库正常。


  • 重启数据库

若在删除了DUAL 表后我们重启了数据库,就会发现数据库不能正常启动。


后台告警日志报错信息如下:


这个错误和数据库参数replication_dependency_tracking有关,该参数默认为TRUE,我们需要暂时设置为FALSE来绕过这个检查,把数据库启动起来,然后才可以重建DUAL表,在修复数据库后,重启数据库设置replication_dependency_tracking为TRUE.



接下来就是重建DUAL表和编译失效的对象,过程和前边的方法一样。最后我们需要做的事就是设置replication_dependency_tracking回 true并重启实例。

replication_dependency_tracking参数介绍

REPLICATION_DEPENDENCY_TRACKING启用或禁用对数据库的读/写操作的依赖关系跟踪。 依赖性跟踪对于在并行的复制环境中传播更改至关重要。

参数取值如下:

TRUE:启用依赖关系跟踪。

FALSE:允许对数据库进行读/写操作以加快运行速度,但不会为Oracle执行并行传播的相关性信息。

PS:

强烈指定参数值为true,除非确定应用程序不会对复制表执行任何读/写操作。


未经允许不得转载:Oracle一体机用户组 » DUAL表认识与破坏后的恢复

相关推荐