【问题标题】:Oracle - Zombie Table甲骨文 - 僵尸表
【发布时间】:2012-03-22 18:50:20
【问题描述】:

从昨天开始我就遇到了这个奇怪的问题。我尝试了几个选项,实际上我重新安装了 ORACLE 和数据库本身。

问题是:我的这张桌子有点像僵尸。以下是症状:

SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME='MYTABLE'

返回一条记录,表示该表存在。

SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'MYTABLE'

返回 MYTABLE 的所有列。到目前为止一切顺利,该表存在。

SELECT * FROM MYTABLE

返回ORA-00942:表或视图不存在。 在这一点上,我很困惑:该表似乎存在于 USERTABLES 但我不能选择它?

CREATE TABLE MYTABLE (Foo NUMBER) TABLESPACE MYTABLESPACE

返回: ORA-00604: 递归 SQL 级别 1 发生错误 ORA-00001: 违反了唯一约束 (SYS.I_OBJ2)

我不明白这个错误。但最好的还在后面。

SELECT * FROM MYTABLE

令人惊讶的是,上面的查询(第三个查询的精确副本)现在返回了几条记录! 此外,我注意到 Foo 列不存在:我现在看到的表是我的初始表,其中包含其他列。

DROP TABLE MYTABLE

我现在尝试删除表,但出现以下错误:

ORA-00604:递归 SQL 级别 1 发生错误 ORA-00942: 表或视图不存在 ORA-06512: 在第 19 行

SELECT * FROM MYTABLE

比以往任何时候都更加困惑,我尝试了上面的查询,令人惊讶的是,该表不再存在。

我不明白这一点:该表位于 USERTABLES 上,但我无法对其进行 SELECT,但是,如果我创建一个具有相同名称的新表,我会收到错误消息,但现在我可以选择该表的先前版本包含多条记录的表。

有什么想法吗?我真的需要你的帮助:(

编辑 - 我现在检查了:我无法删除任何表。这可能只是一种新症状。

解决方案

问题是 MDSYS.SDO_GEOR_SYSDATA_TABLE 表丢失,并且 drop 事件触发器试图访问它,从而产生错误。解决方案是恢复该表。

【问题讨论】:

  • 听起来你需要看看真实的表——避免可能的同义词问题等。所以当你运行查询来查看表是否存在时,你连接的是谁?它是普通用户,还是系统,还是什么?在第一个查询中选择 OWNER、TABLE_NAME。并尝试指定全名,如 OWNER.TABLE_NAME 以查看您认为正在发生的事情是否真的发生了。
  • 你是否 100% 确定它完全正确 'MYTABLE' 而不是 'MyTable' 或类似的东西。
  • @MJB 好点,但我已经尝试过了。 USER_TABLES 没有 OWNER 列,但 ALL_TABLE 有。我检查了 ALL_TABLE 上的 OWNER 并使用该用户进行了连接。我也试过指定全名,但没有运气。
  • @Ben 是的,很遗憾我是 :( 我正在使用 Toad,我编写了 SELECT * 查询,运行它并捕获错误。接下来,我 Ctrl+左键单击鼠标表名,我可以看到列、脚本、授权等...我想说的是,我通过 Toad 使用完全相同的名称来选择 * 表并选择 USER_TAB_COLUMNS 表。
  • 另外,“实际上重新安装了 ORACLE 和 DB 本身”这是什么意思:重新安装并恢复或重新安装并从脚本或导入重新构建?如果恢复数据库中的任何损坏也将恢复

标签: sql oracle database-administration


【解决方案1】:

如果有权限,试试这个查询:

SELECT *
  FROM dba_objects
 WHERE object_name = 'MYTABLE';

并查看具有该名称的对象。它可能会为您指明正确的方向。

【讨论】:

  • 该查询的结果返回两条记录。对于两个不同的所有者,有两个具有该名称的不同表(其中一个是我连接的那个,但我也不能删除另一个表)。我期待着(不同所有者的两个同名表),这并不奇怪。还有更多想法
【解决方案2】:

您在尝试选择和删除时没有限定架构名称。您的会话的 CURRENT_SCHEMA 可能与登录用户不同。通过尝试检查

select SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') from dual;

您可以为我们复制/粘贴完整的输出,而不是描述输出是什么?

最后,你能排除有人弄乱了字典吗?你知道,SYSDBA 可以做任何事情......

【讨论】:

  • 感谢您的帮助,我发现了问题。 MDSYS.SDO_GEOR_SYSDATA_TABLE 表丢失,删除事件触发器正在尝试访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多