我在警报日志中发现了有关损坏块的警报。损坏的块属于名为 DOCS 的表。因为我没有这个数据库的任何备份,决定重新创建 DOCS 表来解决损坏问题。这是一个问题。
生成所有脚本:
1. DDL for table.
2. DDL for constraints,triggers,indexes on the table.
3. DDL for the constraints that references this table.
4. Saved grants on this table.
现在我想删除表,但留下它的依赖项,然后用它的约束、触发器、索引重新创建表。
我怎样才能做到这一点?
- - - - - - - - - - - - 编辑
这似乎很简单。
- 保存该表的数据
创建表 new_table 作为 select * from my_table;
- 为表及其注释保存 DDL
- 此表上的索引的 DDL
- 此表上的约束的 DDL
- 在此表上引用的外键的 DDL
- 在此表上保存赠款
- 删除表清除
- 重新创建引用此表的表、注释、约束、索引、外键
- 给予补助
插入数据
插入 my_table 作为 select * from new_table
此解决方案适用于重新创建表(这是重新创建表的正确方法)。但是损坏并没有解决,在 Alert.log 中插入表的过程中引发了有关块损坏的相同错误。
在评论中@Mindaugas Riauba 写了一个解决方案并且它有效。我只想知道为什么我关于重新创建表的解决方案不起作用而@Mindaugas Riauba 的解决方案起作用?
再次感谢@Mindaugas Riauba!
显然你已经放弃了这个对象。现在让你冷静下来——损坏的块现在很可能在自由空间中并且没有伤害。他们只是在备份期间惹恼了你。要检查:
如果它真的在这里显示,你有两个选择。你可以简单地忽略它。一旦将块分配给某个对象,它将被重新格式化并且腐败将消失。如果要修复损坏的块,则必须创建占用损坏块的对象。
假设您损坏的块存在于 tablespace
USERS
和 datafile/ora/users01.dbf
中。首先,您必须使表空间的数据文件不可自动扩展。那不是为了夸大数据文件的大小。然后您将创建填充表。然后你必须扩展表的段,以便它包含损坏的块:
通过这种方式,您可以添加多个范围来调整它们的大小。在您检查损坏的块现在不再属于可用空间后,您可以填写表格:
首先插入/选择来自 dba_objects,然后从填充表本身插入/选择更快。
现在您只需要使用 RMAN 检查数据文件:
并删除填充表:
简单的。:)