问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle数据库恢复方法

发布网友 发布时间:2022-04-21 01:47

我来回答

6个回答

懂视网 时间:2022-04-30 00:13

--修复单个坏块 blockrecover corruption list;--修复全部坏块 SQL> select * from livan.test; select * from livan.test * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 6, block # 12) ORA-01110: data file 6: ‘/u02/app/oradata/PSDB/livan_tbs01.dbf‘
[oracle@std u02]$ rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Thu Feb 5 17:02:23 2015

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: PSDB (DBID=1410134833)

RMAN> blockrecover datafile 6 block 12;

Starting blockrecover at 05-FEB-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00006
channel ORA_DISK_1: reading from backup piece /u02/PSDB_BACKUP/full_PSDB_870868610
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/u02/PSDB_BACKUP/full_PSDB_870868610 tag=TAG20150205T115650
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished blockrecover at 05-FEB-15
[oracle@std u02]$ sqlplus ‘/as sysdba‘

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Feb 5 17:04:15 2015

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from livan.test;

 ID NAME
---------- ------------------------------
  1 beijing
  2 shanghai
  3 shandong

如果坏块上的表最近都没有更新,还可以利用bbed的copy命令来从一个最近的备份中copy过来一个数据块恢复,具体不演示。

 

2.有可能存在数据丢失的恢复(在没有备份没有归档的情况下)

---用户表数据损坏

<1>正常情况下数据条目数

SQL> select count(*) from test;

 COUNT(*)
----------
 50604

 

<2>制作一个坏块

select rowid,
dbms_rowid.rowid_relative_fno(rowid) rel_fno,
dbms_rowid.rowid_block_number(rowid) blockno,
dbms_rowid.rowid_row_number(rowid) rowno
from livan.test; 




 
BBED> set dba 6,76
 DBA  0x0180004c (25165900 6,76)

BBED> d /v dba 6,76 offset 0
 File: /u02/app/oradata/PSDB/livan_tbs01.dbf (6)
 Block: 76 Offsets: 0 to 127 Dba:0x0180004c
-------------------------------------------------------
 06a20000 4c008001 d3220800 00000104 l .?.L...?......
 b8510000 01000000 ddce0000 b4220800 l 窺......菸..?..
 00000000 03003201 41008001 ffff0000 l ......2.A.......
 00000000 00000000 00000000 00800000 l ................
 b4220800 00000000 00000000 00000000 l ?..............
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00019200 l ................

 <16 bytes per line>

BBED> modify /x 12345 dba 6,76 offset 0
 File: /u02/app/oradata/PSDB/livan_tbs01.dbf (6)
 Block: 76  Offsets: 0 to 127  Dba:0x0180004c
------------------------------------------------------------------------
 01234500 4c008001 d3220800 00000104 b8510000 01000000 ddce0000 b4220800 
 00000000 03003201 41008001 ffff0000 00000000 00000000 00000000 00800000 
 b4220800 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00019200 

 <32 bytes per line>

BBED> sum play
BBED-00202: invalid parameter (play)


BBED> sum apply 
Check value for File 6, Block 76:
current = 0xd0fa, required = 0xd0fa
 



SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from test;
select count(*) from test
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 76)
ORA-01110: data file 6: ‘/u02/app/oradata/PSDB/livan_tbs01.dbf‘

发现我们第6个文件第76号数据块损坏,报ORA-0178错误,我们知掉只要数据库报ORA-01578错误,
说明该数据块已经被标识为:"software corrupt"

 

<3>确认坏块的类型

SQL> select segment_name,partition_name,segment_type,owner,tablespace_name
 2 from sys.dba_extents
 3 where file_id=&AFN
 4 and &bad_block_id between block_id and block_id + blocks-1;
Enter value for afn: 6
old 3: where file_id=&AFN
new 3: where file_id=6
Enter value for bad_block_id: 76
old 4: and &bad_block_id between block_id and block_id + blocks-1
new 4: and 76 between block_id and block_id + blocks-1

SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE OWNER TABLESPACE_NAME
--------------- -------------------- ------------------ ---------- ------------------------------
TEST     TABLE  LIVAN LIVAN_TBS

经查我们的数据损坏坏位于我们的用户表上,无备份数据会丢失。

 

<4>标记坏块为"software corrupt"

在第2步的时候全表扫描时已经报ORA-01578错误,说明该数据块已经被标识为:"software corrupt", 正常情况下可以跳过这步。 我们使用dbms_repair包演示标记坏块为"software corrupt"

使用dbms_repair包可参考:http://blog.itpub.net/8494287/viewspace-1357457/

 

--利用dbms_repair包必须先创建repair table两个表:

SQL> begin
 2 dbms_repair.admin_tables(
 3 table_name=>‘REPAIR_TABLE‘,
 4 table_type=>dbms_repair.repair_table,
 5 action=>dbms_repair.create_action,
 6 tablespace=>‘LIVAN_TBS‘); 
 7 end;
 8 /

PL/SQL procedure successfully completed.

SQL> col object_name for a20
SQL> select owner,object_name,object_type
 2 from dba_objects
 3 where object_name like ‘%REPAIR_TABLE%‘;

OWNER    OBJECT_NAME  OBJECT_TYPE
------------------------------ -------------------- -------------------
SYS    REPAIR_TABLE  TABLE
SYS    DBA_REPAIR_TABLE VIEW

 

--再创建orphan key table

SQL> begin
 2 dbms_repair.admin_tables(
 3 table_type=>dbms_repair.orphan_table,
 4 action=>dbms_repair.create_action,
 5 tablespace=>‘LIVAN_TBS‘); 
 6 end;
 7 /

PL/SQL procedure successfully completed.

SQL> select owner,object_name,object_type
 2 from dba_objects
 3 where object_name like ‘%ORPHAN_KEY_TABLE%‘;

OWNER    OBJECT_NAME  OBJECT_TYPE
------------------------------ -------------------- -------------------
SYS    ORPHAN_KEY_TABLE TABLE
SYS    DBA_ORPHAN_KEY_TABLE VIEW

 

--检查对象,检查结果会放到我们之前创建的repair_table中

SQL> set serveroutput on
SQL> declare
 2 rpr_count int;
 3 begin
 4 rpr_count:=0;
 5 dbms_repair.check_object(
 6 schema_name=>‘LIVAN‘,
 7 object_name=>‘TEST‘,
 8 repair_table_name=>‘REPAIR_TABLE‘,
 9 corrupt_count=>rpr_count); 
 10 dbms_output.put_line(‘repair count:‘||to_char(rpr_count));
 11 end;
 12 /
repair count:1

PL/SQL procedure successfully completed.

检查出有1个坏块

 

--检查校验的坏块结果

SQL> select object_name,block_id,corrupt_type,marked_corrupt,
 2 corrupt_description,repair_description
 3 from repair_table;

OBJECT_NAM BLOCK_ID CORRUPT_TYPE MARKED_COR CORRUPT_DESCRIP REPAIR_DESCRIPTION
---------- ---------- ------------ ---------- --------------- ------------------------------
TEST  76  6148 TRUE   mark block software corrupt

我们知道当marked_corrupt为TRUE时,标识这个数据块已经被标识过software corrupt

 

---标识坏块为software corrupt(重新演示一下)

SQL> declare
 2 fix_count int;
 3 begin
 4 fix_count:=0;
 5 dbms_repair.fix_corrupt_blocks(
 6 schema_name=>‘LIVAN‘,
 7 object_name=>‘TEST‘,
 8 object_type=>dbms_repair.table_object,
 9 repair_table_name=>‘REPAIR_TABLE‘,
 10 fix_count=>fix_count);
 11 dbms_output.put_line(‘fix count:‘||to_char(fix_count));
 12 end;
 13 /
fix count:0

PL/SQL procedure successfully completed.

 

--再次检查,因为已经被标志为software corrupt,所以在此标志也没什么变化

SQL> select object_name,block_id,corrupt_type,marked_corrupt,
 2 corrupt_description,repair_description
 3 from repair_table;

OBJECT_NAM BLOCK_ID CORRUPT_TYPE MARKED_COR CORRUPT_DESCRIP REPAIR_DESCRIPTION
---------- ---------- ------------ ---------- --------------- ------------------------------
TEST  76  6148 TRUE   mark block software corrupt

未被标志为oftware corrupt ,marked_corrupt列会显示FALSE

 

<5>检查其他关联对象

检查有多少个索引项指向了坏块的记录

SQL> select index_name from dba_indexes
 2 where table_name in (select distinct object_name from repair_table);

INDEX_NAME
------------------------------
INDEX_TEST

查询发现有一个索引指向这个坏块

 

--检查都有多少索引数据

SQL> set serveroutput on
SQL> declare
 2 key_count int;
 3 begin
 4 key_count:=0;
 5 dbms_repair.dump_orphan_keys(
 6 schema_name=>‘LIVAN‘,
 7 object_name=>‘INDEX_TEST‘,
 8 object_type=>dbms_repair.index_object,
 9 repair_table_name=>‘REPAIR_TABLE‘,
 10 orphan_table_name=>‘ORPHAN_KEY_TABLE‘,
 11 key_count=>key_count);
 12 dbms_output.put_line(‘orphan key count:‘||to_char(key_count));
 13 end;
 14 /
orphan key count:146

PL/SQL procedure successfully completed.



SQL> select index_name,count(*) from orphan_key_table
 2 group by index_name;

INDEX_NAME   COUNT(*)
------------------------------ ----------
INDEX_TEST    146

可以看到有146条数据指向坏块

 

<6>使用dbms_repair.skip_corrupt_blocks或10231事件方式跳过坏块

SQL> select count(*) from livan.test;
select count(*) from livan.test
    *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 76)
ORA-01110: data file 6: ‘/u02/app/oradata/PSDB/livan_tbs01.dbf‘


SQL> begin
 2 dbms_repair.skip_corrupt_blocks(
 3 schema_name=>‘LIVAN‘,
 4 object_name=>‘TEST‘,
 5 object_type=>dbms_repair.table_object,
 6 flags=>dbms_repair.skip_flag);
 7 end;
 8 /

PL/SQL procedure successfully completed.

SQL> select count(*) from livan.test;

 COUNT(*)
----------
 50458

可以看到当执行完dbms_repair.skip_corrupt_blocks数据可以正常访问了,只是统计出来的数据比原先
少了146条(50604-50458),也就是我们坏块上的数据没有统计,被跳过了。

 

---使用10231事件跳过

SQL> select count(*) from livan.test;

 COUNT(*)
----------
 50458

SQL> begin
 2 dbms_repair.skip_corrupt_blocks(
 3 schema_name=>‘LIVAN‘,
 4 object_name=>‘TEST‘,
 5 object_type=>dbms_repair.table_object,
 6 flags=>dbms_repair.noskip_flag);
 7 end;
 8 /

PL/SQL procedure successfully completed.

SQL> select count(*) from livan.test;
select count(*) from livan.test
    *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 76)
ORA-01110: data file 6: ‘/u02/app/oradata/PSDB/livan_tbs01.dbf‘


SQL> alter session set events ‘10231 trace name context forever,level 10‘; 

Session altered.


SQL> select count(*) from livan.test;

 COUNT(*)
----------
 50458
 
 
SQL> alter session set events ‘10231 trace name context off‘;

Session altered. 

 

<7>使用CTAS方式重建表及索引

SQL> create table test_bak as select * from test;

Table created.

SQL> create index idx_test_bak on test_bak(object_id);

Index created.


--重建索引语句
SQL> alter index index_test rebuild online;

Index altered.

 

<8>使用重建对象的freelists方式修复原表

使用这种方式防止坏块以后被加入到freelists中 注意这个方法只适用于段空间手动管理的表空间(SEGMENT SPACE MANAGEMENT MANUAL), 否则会报ORA-10614: Operation not allowed on this segment 错误

SQL> begin
 2 dbms_repair.rebuild_freelists(
 3 schema_name=>‘LIVAN‘,
 4 object_name=>‘TEST‘,
 5 object_type=>dbms_repair.table_object);
 6 end;
 7 /
begin
*
ERROR at line 1:
ORA-10614: Operation not allowed on this segment
ORA-06512: at "SYS.DBMS_REPAIR", line 401
ORA-06512: at line 2

 

<9>坏块中的数据

  如果坏块中的数据不可丢失,只能尝试其他方法从恢复坏块内容,这其中也有一些第三方付费工具可使用, 也可进行以下尝试:

*尝试从索引内容中恢复出索引列的内容

*尝试使用logminer,从日志中挖掘

*联系Oracle Support,会有些工具解释数据块中的内容。

Oracle数据库坏块的恢复

标签:

热心网友 时间:2022-04-29 21:21

  第一种:
  首先,备份数据库(X:\oracle\oradata)下的数据文件,重新命名即可(否则装数据库的时候会提示sid已存在)。重新安装数据库,当然数据库的名字就是你要恢复的名字。安装完成后,打开控制面板,停止oracle的服务。把(X:\oracle\oradata)下新生成的文件改名,把原先目录下的文件恢复名字。再重新启动oracle服务和监听。用sys/as dba 登陆数据库,可能会提示权限不够(ora-01031)修改(X:\oracle\ora92\network\admin )文件夹下的sqlnet.ora文件,添加SQLNET.AUTHENTICATION_SERVICES= (NTS),增加权限。登陆进去后,打开table提示不能打开。打开common页,执行命令alert database open;这时再刷新table,发现原先的表可以打开了。恢复成功了。再用原先数据库的普通用户进入。发现一切正常。
  第二种:
  1、首先,将原来的ORACLE文件夹改名,原来的路径是D:/oracle.我暂时改成D:/oracle_old.找来ORACLE(我用的是ORACLE 9I)安装光盘,将ORACLE安装在原来安装的目录下,这样恢复起来更加方便,主要是注册表的内容不用修改。
  2、安装完了之后,系统中又有一个可以使用的ORACLE了。这个时候要做的就是将原来的文件和数据恢复过来。第一步,先关闭ORACLE的所有已经启动的项目,在"服务"里面逐一关闭。然后,将安装目录改名。(例如D:/oracle.改成D:/oracle_new,再将D:/oracle_old改成D:/oracle. )这样理论上说从物理层面恢复了ORACLE了。但是现在还不能启动ORACLE的监听程序和服务程序,还要从逻辑上解决。
  3、在dos环境下执行一个删除命令:oradim -delete -sid mm,其中mm为创建oracle时候创建的实例 建议执行这个命令后重新启动机器,重启后就可以建立和原来实例名相同的实例。当然你懒,不重新启动也可以,但是你的实例名就不能和原来的一样了。
  4、在dos环境下执行命令 oradim -new -sid mm -startmode a -pfile "D:\oracle\admin\mm\pfile\initmm.ora "创建一个新的实例,其中 "mm"为新数据库的名称。
  5、启动服务,先打开数据库,然后可以用以前的用户名和密码登陆进去。 要补充的是,一般的ORACLE数据库的监听程序都是用电脑的名称来识别地址的,而不是127.0.0.1或者localhost.所以,如果我们安装系统的时候用的是不同的电脑名称(比如我原来用的是wm_mm.重新安装后用的是wenming_mm),那么还有一个工作要做,就是修改文件 listener.ora.将里面的相关的东西改过来就可以了。
  需要耐心、细心,可能在一步里有一个细小的差别就会出些古怪的错误提示,有时需要根据错误提示采取策略,总之原理是,先装一个一模一样的ORACLE,安装目录、数据库名称都一样,这样保证注册表里不用更改;再覆盖物理文件,最后重新实例化,打开数据库就可以进去了。
  注:恢复必须要有以下文件 a、初始化参数文件INIT.ORA b、所有数据文件 .dbf c、所有重做日志文件(联机日志、归档日志)redo d、所有控制文件 crtl e、internal密码文件。

热心网友 时间:2022-04-29 22:39

追加的方式,请一定清除原有用户数据后,在恢复

热心网友 时间:2022-04-30 00:14

1、export应该是指定表中某些数据或者全表数据
2、import的时候如果表有唯一索引肯定会报错。
2.1如果不想让他报错,先把表数据删了,在import。删之前export做下备份。
2.2可能报错也没关系吧,那看你import后数据怎样。报错可能导致违反唯一约束的哪些数据导入失败,也有可能导致整个导入失败。自己看最后表数据是否完整就可以啦

热心网友 时间:2022-04-30 02:05

最好新建一个库导入

热心网友 时间:2022-04-30 04:13

imp前清理所有文件数据,然后再进行对应用户的imp
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么和什么是让文章脉络分明的重要手段9 ...要有事物作为线索 怎么样才能很好的把握住线索 写好文章?_百度... 记叙文如何点题 路由器设置了mac过滤后,中继连不上路由,中继是wn1000rp,路由是d... NETGEAR WN1000RPNETGEAR WN1000RP 万用无线网络扩展器 ...双流兔头之类的,邮局会帮忙抽成真空么,他不抽我又去哪里抽_百度知... 双流有哪些地方能抽真空袋子?来出差,家里孩子想让我带兔头回去,但... ...还没有复婚证,现在以夫妻互保的名义购买保险合法有效吗? 从1写到350,一共写了多少个数字3? 我想知道这个头发叫什么? 理发店能烫出这种感觉吗? 请教:ORA-12638:身份证明检索失败怎么办? ORACLE10g中ASMCMD使用及ASM文件 重装系统怎么恢复oracle数据库 谁能简单介绍一下Oracle数据库备份都有哪几种方法 oracle创建数据库有几种方式? 重装Oracle后,怎么才可以还原.ora 数据库文件? oracle数据恢复 要如何做? Oracle数据库出现了ORA-08102 ORA-08102 错误是怎么回事? Oracle数据库使用asm存储,asm diskgroup mount不起来,说是报错ora-1 win2012系统安装Oracle11g DataGuard 逻辑备库 oracle 9i for Windows 调用数据库出现 ORA-08103:object no longer exists,错误? Oracle数据库SELECT查询老是报ORA-1410怎么办?求大神提点意见 收到个奇怪的短信 ORA-01403:未找到任何数据 有知道的大神吗 数据库存储语句错误ORA-01403和ORA-06512 404 Not Found 迅雷下载为什么到99%就停止不动了啊?? 天天吃大米饭会发胖吗 吃大米饭会发胖吗 米饭长胖吗 米饭吃多了,比吃肉还容易长胖吗? java连接数据库ORA-12505错误,百度的各种方法都试了,没有解决 如何调用WebService接口把数据存储到数据库里而不使用JSP页面 ORACLE ora-00600 为什么我的迅雷下到快完的时候却不动了 想去海边度假,渔夫帽该怎么选择? 选对帽子,才能让你的气质更时髦优雅,什么样的帽子是初夏必备款呢? 双十一是什么节日是不是空军的节日? 苹果在建军节期间会有什么优惠活动吗? 八一建军节淘宝打折吗 8.1建军节华为对军人有老兵有什么优惠? 为什么八一建军节各种游戏没有优惠呢? 1111什么意思 2020年杭州市八一建军有什么优惠福利待遇? 爱奇艺vip建军节一个月的会打折吗 今年八一建军节想去北京玩四天,有没有什么活动之类的啊?比如天安门其他景点优惠? 2018八一建军节深圳哪些景点有优惠 迅雷下载视频 到99.9%就不动了 八一建军节军属有什么待遇 现役军人在深圳特区有哪些优惠政策 八一建军节到了,89医院有没有优惠活动啊?