AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 55384
Accepted
kupa
kupa
Asked: 2013-12-21 08:06:49 +0800 CST2013-12-21 08:06:49 +0800 CST 2013-12-21 08:06:49 +0800 CST

删除没有依赖关系的表并解决块损坏

  • 772

我在警报日志中发现了有关损坏块的警报。损坏的块属于名为 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.

现在我想删除表,但留下它的依赖项,然后用它的约束、触发器、索引重新创建表。

我怎样才能做到这一点?

- - - - - - - - - - - - 编辑

这似乎很简单。

  1. 保存该表的数据

    创建表 new_table 作为 select * from my_table;

  2. 为表及其注释保存 DDL
  3. 此表上的索引的 DDL
  4. 此表上的约束的 DDL
  5. 在此表上引用的外键的 DDL
  6. 在此表上保存赠款
  7. 删除表清除
  8. 重新创建引用此表的表、注释、约束、索引、外键
  9. 给予补助
  10. 插入数据

    插入 my_table 作为 select * from new_table

此解决方案适用于重新创建表(这是重新创建表的正确方法)。但是损坏并没有解决,在 Alert.log 中插入表的过程中引发了有关块损坏的相同错误。

在评论中@Mindaugas Riauba 写了一个解决方案并且它有效。我只想知道为什么我关于重新创建表的解决方案不起作用而@Mindaugas Riauba 的解决方案起作用?

再次感谢@Mindaugas Riauba!

oracle oracle-10g
  • 1 1 个回答
  • 1771 Views

1 个回答

  • Voted
  1. Best Answer
    Mindaugas Riauba
    2013-12-22T07:34:13+08:002013-12-22T07:34:13+08:00

    显然你已经放弃了这个对象。现在让你冷静下来——损坏的块现在很可能在自由空间中并且没有伤害。他们只是在备份期间惹恼了你。要检查:

    SELECT null owner, null segment_type, null segment_name, null partition_name, c.file#
      , greatest(f.block_id, c.block#) corr_start_block#
      , least(f.block_id+f.blocks-1, c.block#+c.blocks-1) corr_end_block#
      , least(f.block_id+f.blocks-1, c.block#+c.blocks-1)
      - greatest(f.block_id, c.block#) + 1 blocks_corrupted
      , 'Free Block' description
    from dba_free_space f, v$database_block_corruption c
    WHERE f.file_id = c.file# AND f.block_id <= c.block# + c.blocks - 1
      and f.block_id + f.blocks - 1 >= c.block#
    order by file#, corr_start_block#;
    

    如果它真的在这里显示,你有两个选择。你可以简单地忽略它。一旦将块分配给某个对象,它将被重新格式化并且腐败将消失。如果要修复损坏的块,则必须创建占用损坏块的对象。

    假设您损坏的块存在于 tablespaceUSERS和 datafile/ora/users01.dbf中。首先,您必须使表空间的数据文件不可自动扩展。那不是为了夸大数据文件的大小。然后您将创建填充表。

    create table filler (
      padding varchar2(1000)
    ) tablespace users nologging pctfree 90 pctused 10;
    

    然后你必须扩展表的段,以便它包含损坏的块:

    alter table filler allocate extent
      (datafile '/ora/users01.dbf' size 100m);
    

    通过这种方式,您可以添加多个范围来调整它们的大小。在您检查损坏的块现在不再属于可用空间后,您可以填写表格:

    insert /*+append */ into filler  select rpad('x',1000) from
    dba_objects
    --  filler
    where rownum <= 50000;
    

    首先插入/选择来自 dba_objects,然后从填充表本身插入/选择更快。

    现在您只需要使用 RMAN 检查数据文件:

    RMAN> BACKUP VALIDATE CHECK LOGICAL DATAFILE 333;
    

    并删除填充表:

    DROP TABLE filler PURGE;
    

    简单的。:)

    • 3

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve