修复oracle系统包,oracle数据库备份恢复系列-使用DBMS_REPAIR包修复oracle数据库坏块...

首先说明几个事情:

0.select count(*)from t,如果表上没有索引的话,会走全表扫描

1.oracle数据库有坏块,通常会报ora-01578错误,错误会告诉你损坏的文件,损坏的数据库块

2.使用dbv工具可以校验坏块

3.如果有好的可用的备份的话,可以考虑使用RMAN工具的BMR(block media recovery)技术修复

4.如果数据库没有备份的话,可以考虑使用dbms_repair包来补救,但是会丢数据库

下面是一个测试的过程,并不是讲解dbms_repair包,只是使用这个包完成一个坏块的修复的过程。

SQL> create tablespace userdata datafile

'E:\ORACLE\ORADATA\DB01\userdata01.dbf' size 1m;

表空间已创建。

SQL> create user buffer identified by

oracle default tablespace userdata;

用户已创建。

SQL> grant dba to buffer;

授权成功。

SQL> conn buffer/oracle

已连接。

SQL> create table t as select * from

dba_users;

表已创建。

SQL> insert into t select * from t;

已创建28行。

SQL> /

已创建56行。

SQL> /

已创建112行。

SQL> /

已创建224行。

SQL> /

已创建448行。

SQL> /

已创建896行。

SQL> /

已创建1792行。

SQL> /

已创建3584行。

SQL> /

insert into t select * from t

*

第 1 行出现错误:

ORA-01653: 表 BUFFER.T 无法通过 8 (在表空间 USERDATA 中) 扩展

SQL> commit;

提交完成。

SQL> alter system checkpoint;

系统已更改。

SQL> select count(*) from t;

COUNT(*)

----------

7168

SQL> conn / as sysdba

已连接。

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

使用ultra edit 破坏数据文件

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 612368384 bytes

Fixed

Size 1250428 bytes

Variable

Size 213912452 bytes

Database

Buffers 390070272 bytes

Redo

Buffers 7135232 bytes

数据库装载完毕。

数据库已经打开。

SQL> conn buffer/oracle

已连接。

SQL> select count(*) from t;

select count(*) from t

*

第 1 行出现错误:

ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 43)

ORA-01110: 数据文件 6:

'E:\ORACLE\ORADATA\DB01\USERDATA01.DBF'

在sqlplus下调用windows操作系统命令,使用host,如果是unix系统或者linux系统使用“!”

SQL> host dbv

file=E:\ORACLE\ORADATA\DB01\userdata01.dbf

DBVERIFY: Release 10.2.0.1.0 - Production on 星期日 3月 23 12:17:35

2008

Copyright (c) 1982, 2005, Oracle. All rights

reserved.

DBVERIFY - 开始验证: FILE = E:\ORACLE\ORADATA\DB01\userdata01.dbf

页 43 标记为损坏

Corrupt block relative dba: 0x0180002b (file 6, block 43)

Bad check value found during dbv:

Data in bad block:

type: 6 format: 2 rdba: 0x0180002b

last change scn: 0x0000.000a70b3 seq: 0x1 flg:

0x06

spare1: 0x0 spare2: 0x0 spare3: 0x0

consistency value in tail: 0x70b30601

check value in block header: 0x835c

computed block checksum: 0xfe1b

DBVERIFY - 验证完成

检查的页总数: 128

处理的页总数 (数据): 109

失败的页总数 (数据): 0

处理的页总数 (索引): 0

失败的页总数 (索引): 0

处理的页总数 (其它): 18

处理的总页数 (段) : 0

失败的总页数 (段) : 0

空的页总数: 0

标记为损坏的总页数: 1

流入的页总数: 0

最高块

SCN : 684222 (0.684222)

SQL> conn / as sysdba

已连接。

SQL> exec

DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');

PL/SQL 过程已成功完成。

SQL> set serveroutput on

SQL> declare

2 cc number;

3 begin

4 dbms_repair.check_object(schema_name =>

'BUFFER',object_name => 'T',corrupt_count

=> cc);

5 dbms_output.put_line(to_char(cc));

6* end;

SQL> /

1

PL/SQL 过程已成功完成。

SQL> SELECT object_name,

2 relative_file_id,

3 block_id,

4 marked_corrupt,

5 corrupt_description,

6 repair_description,

7 CHECK_TIMESTAMP

8 from repair_table;

SQL> select count(*) from buffer.t;

select count(*) from buffer.t

*

第 1 行出现错误:

ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 43)

ORA-01110: 数据文件 6: 'E:\ORACLE\ORADATA\DB01\USERDATA01.DBF'

SQL> EXEC

DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(SCHEMA_NAME=>'BUFFER',OBJECT_NAME=>'T')

PL/SQL 过程已成功完成。

SQL> select count(*) from buffer.t;

COUNT(*)

----------

7101

虽然oracle可以查询到t表当中的数据,但是我们发现少了一些(7168-7101)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值