实例失败是Oracle数据库最常见的故障之一,通常由操作系统崩溃、数据库异常关闭等原因引起。恢复步骤如下:
sqlplus / as sysdba连接数据库,执行STARTUP命令启动实例。Oracle会自动执行**前滚(Roll Forward)操作,将联机重做日志(Online Redo Log)中的已提交事务应用到数据文件;随后回滚(Roll Back)**未提交的事务,确保数据一致性。$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<instance_name>.log文件,定位故障原因(如ORA-00600内部错误、资源不足等)。介质故障指数据库物理文件(如数据文件、控制文件、重做日志)损坏,需根据损坏对象选择不同恢复方式:
适用于全库数据丢失或控制文件损坏的场景,需使用RMAN(Recovery Manager)工具:
rman target /。RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
RESTORE DATABASE; -- 还原数据文件和控制文件
RECOVER DATABASE; -- 应用归档日志和重做日志
RELEASE CHANNEL ch1;
}
ALTER DATABASE OPEN;;若需恢复到指定时间点(如误删除后),需添加RESETLOGS选项(会清空重做日志,需谨慎使用)。适用于需撤销已提交事务的场景(如误删除表、误更新数据),步骤如下:
STARTUP MOUNT;。RUN {
SET UNTIL TIME "TO_TIMESTAMP('2025-11-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')"; -- 指定恢复时间点
RESTORE DATABASE;
RECOVER DATABASE;
RELEASE CHANNEL ch1;
}
ALTER DATABASE OPEN RESETLOGS;(RESETLOGS会创建新的重做日志序列,丢失RESETLOGS后的数据)。若单个数据文件损坏(如SYSTEM01.DBF),不影响其他数据文件运行,步骤如下:
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/system01.dbf' OFFLINE;。RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
RESTORE DATAFILE '/oracle/oradata/ORCL/system01.dbf';
RECOVER DATAFILE '/oracle/oradata/ORCL/system01.dbf';
RELEASE CHANNEL ch1;
}
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/system01.dbf' ONLINE;。控制文件是数据库的“骨架”,记录数据文件、重做日志的位置等信息。若控制文件损坏,可通过以下方式恢复:
RESTORE CONTROLFILE FROM '/backup/controlfile.bak';,然后执行RECOVER DATABASE并打开数据库(需RESETLOGS)。Oracle闪回技术可快速将数据库回退到特定时间点,适用于误删除表、误更新数据等场景:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG; -- 开启归档模式
ALTER DATABASE FLASHBACK ON; -- 启用闪回
ALTER DATABASE OPEN;
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2025-11-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS');。ALTER DATABASE OPEN RESETLOGS;。ALTER TABLE <table_name> ENABLE ROW MOVEMENT;。FLASHBACK TABLE <table_name> TO TIMESTAMP TO_TIMESTAMP('2025-11-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS');。若物理备份不可用,可使用逻辑备份(如expdp导出的数据泵文件)恢复数据:
impdp system/password@SID DIRECTORY=DATA_PUMP_DIR DUMPFILE=expdp_full.dmp LOGFILE=import.log FULL=Y
其中,DIRECTORY为备份文件所在目录(需提前创建并授权),DUMPFILE为备份文件名,FULL=Y表示全库恢复。若数据丢失时间超过undo保留期(默认900秒),可使用DBMS_LOGMNR工具挖掘归档日志,恢复历史数据:
EXEC DBMS_LOGMNR.START_LOGMNR(STARTTIME => TO_TIMESTAMP('2025-11-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'), ENDTIME => TO_TIMESTAMP('2025-11-01 13:00:00', 'YYYY-MM-DD HH24:MI:SS'), OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
SELECT * FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'SCHEMA_NAME' AND TABLE_NAME = 'TABLE_NAME';
EXEC DBMS_LOGMNR.END_LOGMNR;。SYSDBA或相应权限(如SYSBACKUP、SYSDG)。