l 文档变更记录
日期 | 版本号 | 作者 | 备注 |
2009-6-5 | v1.0 | Caleble | 创建 |
|
|
|
|
|
|
|
|
|
|
|
|
目录
1,恢复的两个阶段
数据库无论采取哪种方式进行恢复都分为Restore和Recover两个步骤。
Restore(还原):把控制文件、重做日志文件和数据文件还原到正确位置。
Recover(恢复):恢复还原后的数据文件,使数据库达到一致状态。
2,Oracle实例启动的三个阶段
Oracle实例启动经过三个阶段:
l NOMOUNT(未装载):读入参数文件,验证参数文件中的目录是否存在。
l MOUNT(装载):读入参数文件指定位置的控制文件。
l OPEN(打开):验证控制文件中指定的重做日志文件和数据文件是否正确、数据文件是否一致,然后读入数据文件中的数据。
所以按照如下顺序使数据库正确打开。
1) SHUTDOWN(关闭)状态下,确保参数文件指定的文件夹存在,启动到NOMMUNT状态。
2) NOMOUNT状态下,保证控制文件的位置和命名与参数文件中相同,控制文件中指定的重做日志文件和数据文件存在,然后启动到MOUNT状态。
3) MOUNT状态下,执行RMAN 还原和恢复操作。
4) OPEN状态下,读入数据文件和重做日志文件。
我们要保证Oracle在各个阶段读入的文件和目录指向正确的路径。
如果更改了某个文件的位置,要把其相应的参数文件和控制文件中的信息要一同更新。
3,RMAN信息的保存位置
NOCATALOG(非恢复目录)模式时,RMAN把备份文件的辅助信息保存在控制文件中。
CATALOG(恢复目录)模式时,RMAN把备份文件的辅助信息保存在一个数据库中。
下面将通过若干实验来总结Oracle的各种崩溃情况下的恢复。
丢失控制文件只需要执行“还原”步骤。
1, 关闭数据库
2, 手动复制剩余控制文件并改名成丢失的控制文件名
3, 启动数据库
数据库中所有控制文件是完全相同的,使用DBCA创建数据库会默认产生三个控制文件,建议多路复用控制文件(把多个控制文件放到不同磁盘上),保证数据库的可用性。
1, 关闭数据库
2, 启动数据库到NOMOUNT状态
3, 重建控制文件
4, 启动数据库
重建控制文件有以下两种方法:
1,找到警告日志,根据其信息创建控制文件。警告日志位于bdump文件夹中,命名为 alert_{oracle_sid}.log,启动失败等信息也可以在这里找到。
2,找到跟踪文件,根据其SQL语句重建控制文件。跟踪文件位于udump文件夹下,使用下述命令备份控制文件到跟踪文件。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
丢失非当前状态的重做日志文件需要执行“还原”步骤,丢失当前状态的重做日志文件需要“恢复”步骤。
重做日志文件按状态分为当前、非当前、已归档和未归档四种,需要用不同的命令来打开数据库。
1,已归档:
SQL> ALTER DATABASE CLEAR LOGFILE GROUP #;
2,未归档:
SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #;
SQL> ALTER DATABASE MOUNT;
SQL> RECOVER DATABASE UNTIL CANCEL;
SQL> ALTER DATABASE OPEN RESETLOGS;
如果清除了未归档的重做日志文件(当前使用的重做日志文件为未归档),会丢失这个重做日志文件包含的信息,导致日后恢复时无法完全恢复,所以清除未归档的重做日志文件后要立刻全备份数据库。
无归档模式一般采用exp导出或者手工冷备份方式进行备份恢复。
手工冷备份方式:
1,创建表
SQL> create table tb(a integer,b integer);
表已创建。
2,插入数据
SQL> insert into tb(a,b) values(1,1);
已创建 1 行。
SQL> insert into tb(a,b) values (2,2);
已创建 1 行。
SQL> commit;
提交完成。
3,关闭数据库,手工删除数据文件模拟数据文件损坏
SQL> shutdown immediate;
4,打开数据库
SQL> startup open;
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 62915940 bytes
Database Buffers 100663296 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'
5,手工还原数据文件,打开数据库
SQL> alter database open;
6,查询数据
SQL> select * from tb;
A B
---------- ----------
1 1
2 2
数据库恢复完成,数据没有丢失。
归档模式下可采用RMAN备份,手工备份与exp导出方式进行备份,推荐使用RMAN方式进行安全可靠的备份。
RMAN方式:
丢失数据文件需要先“还原”,再“恢复”数据文件到一致状态。
1,查看test表中数据
SQL> select * from tb;
A B
---------- ----------
1 1
2 2
2,备份数据库
RMAN TARGET/
RMAN> BACKUP DATABASE;
3,插入数据,切换日志文件
SQL> insert into tb(a,b) values(3,3);
已创建 1 行。
SQL> insert into tb(a,b) values(4,4);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
4,关闭数据库,手动删除USERS01.DBF
SQL> SHUTDOWN IMMEDIATE;
5,启动数据库到MOUNT状态
SQL> STARTUP MOUNT:
6, 还原该数据文件
RMAN> RESTORE DATAFILE 4;
7, 恢复该数据文件
RMAN> RECOVER DATABASE;
8, 打开数据库
RMAN> ALTER DATABASE OPEN;
数据库已更改。
9, 查看数据是否丢失
SQL> select * from tb;
A B
---------- ----------
1 1
2 2
3 3
4 4
数据库恢复完成,数据没有丢失。
1,备份数据库
rman target/
RMAN> backup database;
2,创建表
SQL> create table tb(a integer);
表已创建。
3,插入数据
SQL> insert into tb(a) values(1);
已创建 1 行。
SQL> insert into tb(a) values(2);
已创建 1 行。
SQL> commit;
提交完成。
4,查看数据
SQL> select * from tb;
A
----------
1
2
5,取得当前的SCN
SQL> select dbms_flashback.get_system_change_number() from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
-----------------------------------------
597565
6,切换日志
SQL> alter system switch logfile;
系统已更改。
7,继续插入数据
SQL> insert into tb(a) values(3);
已创建 1 行。
SQL> insert into tb(a) values(4);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
8,查看数据
SQL> select * from tb;
A
----------
1
2
3
4
此时完成准备工作,当前数据为1,2,3,4,需恢复到数据为1,2、SCN为597565的状态。
2) 使用RMAN进行恢复
1,关闭数据库、启动到MOUNT状态
SQL> shutdown immediate;;
SQL> startup mount;
2,连接到RMAN
Rman target /
3,还原整个数据库
RMAN> restore database;
4,恢复数据库到数据为1,2、SCN为597565的状态
RMAN> recover database until scn 597565;
5,通过resetlogs打开数据库
SQL> alter database open resetlogs;
6,查询数据
SQL> select * from tb;
A
----------
1
2
至此,基于SCN的不完全恢复已经完成,数据成功恢复到该SCN所在状态。
1,查询数据
SQL> select * from tb;
A
----------
1
2
3
4
2,备份数据库
RMAN> backup database;
3,查看当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2009-06-04 22:46:35
4,插入数据
SQL> insert into tb(a) values(5);
已创建 1 行。
SQL> insert into tb(a) values(6);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
此时完成准备工作,当前数据为1,2,3,4,5,6,需恢复到数据为1,2,3,4、时间为2009-06-04 22:46:35的状态。
2) 使用RMAN进行恢复
1,关闭数据库、启动到MOUNT状态
SQL> shutdown immediate;
SQL> startup mount;
2,还原数据库
RMAN> restore database;
3,恢复数据库到2009-06-04 22:46:35
RMAN> RMAN> recover database until time "to_date('2009-06-04 22:46:35','yyyy-mm-dd hh24:mi:ss')";
4,查询数据
SQL> select * from tb;
A
----------
1
2
3
4
至此,基于SCN的不完全恢复已经完成,数据成功恢复到该时间所在状态。
1,创建表
SQL> create table test(a int);
表已创建。
2,插入数据
SQL> insert into test(a) values(1);
已创建 1 行。
SQL> insert into test(a) values(2);
已创建 1 行。
SQL> commit;
3,配置RMAN
自动备份控制文件和参数文件
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
设定自动备份控制文件和参数文件的位置:
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘D:/ORACLE/BACKUP/%F’;
设定默认保存备份文件的路径:
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'D:/ORACLE/BACKUP/%U'
配置RMAN使用压缩备份集:
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1;
4,通过RMAN进行备份
RMAN> BACKUP DATABASE;
5,拷贝备份文件到异机相同目录
这里在本机模拟,通过DBCA删除数据库,并删除所有相关目录。
1, 创建oracle实例
命令行模式输入oradim – new – sid orcl,orcl是之前数据库的sid
2, 设定oracle_sid变量
命令行模式输入set oracle_sid=orcl;
3, 使用RMAN连接数据库
命令行模式输入RMAN TARGET/
4, 设定DBID
DBID是RMAN确定某个实例的唯一标志,可以通过以下两个方法确定:
l 通过RMAN连接到目标数据库时显示
l 控制文件和参数文件的备份集文件名中可以找到
这里备份文件名为C-1214105935-20090508-01,1214105935就是之前数据库实例的DBID。
RMAN> SET DBID 1214105935;
5, 启动数据库到nomount状态
RMAN> STARTUP NOMOUNT;
6, 从备份集中恢复spfile
由于RMAN的信息是保存在控制文件中,我们当前没有控制文件,所以需要手动指定备份集
RMAN> RESTORE SPFILE TO PFILE ‘D:\ORACLE\BACKUP\PFILE.ORA’ FROM ‘D:\ORACLE\BACKUP\C-1214105935-20090508-01’
7, 检查还原的PFILE,创建相应目录
8, 通过创建的PFILE启动数据库
RMAN> STARTUP NOMOUNT FORCE PFILE=’D:\ORACLE\BACKUP\PFILE.ORA’
9, 恢复控制文件
RMAN> RESTORE CONTROLFILE FROM ‘D:\ORACLE\BACKUP\C-1214105935-20090508-01’
10,启动到MOUNT状态
RMAN> ALTER DATABASE MOUNT:
11, 还原数据库
由于我们已经还原了控制文件,RMAN已经能够通过控制文件找到备份集,所以不用指定备份集了。
RMAN> RESTORE DATABASE;
12,恢复数据库
RMAN> RECOVER DATABASE:
出错不用管,继续到第13步打开数据库。
13,打开数据库
RMAN> ALTER DATABASE OPEN RESETLOGS;
14,查看数据是否恢复
SQL> select * from test;
A
----------
1
2
15,创建SPFILE,这样就不用每次启动时指定pfile了。
SQL> CREATE SPFILE FROM PFILE=’ D:\ORACLE\BACKUP\PFILE.ORA’
至此,异机恢复已经全部完成。
注意:
l 保证PFILE和控制文件中的目录正确存在
l RMAN备份信息保存在控制文件中,所以在控制文件被恢复前要指定DBID和恢复文件的位置。
1,创建表
SQL> create table test(a int);
表已创建。
2,插入数据
SQL> insert into test(a) values(1);
已创建 1 行。
SQL> insert into test(a) values(2);
已创建 1 行。
SQL> commit;
提交完成。
3,配置RMAN
自动备份控制文件和参数文件
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
设定自动备份控制文件和参数文件的位置:
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘D:/ORACLE/BACKUP/%F’;
设定默认保存备份文件的路径:
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'D:/ORACLE/BACKUP/%U'
配置RMAN使用压缩备份集:
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1;
4,通过RMAN进行备份
RMAN> BACKUP DATABASE;
5,拷贝备份文件到异机异目录
这里在本机模拟,通过DBCA删除数据库,并删除所有相关目录。
1, 创建oracle实例
命令行模式输入oradim – new – sid orcl,orcl是之前数据库的sid
2, 设定oracle_sid变量
命令行模式输入set oracle_sid=orcl;
3, 使用RMAN连接数据库
命令行模式输入RMAN TARGET/
4, 设定DBID
DBID是RMAN确定某个实例的唯一标志,可以通过以下两个方法确定:
l 通过RMAN连接到目标数据库时显示
l 控制文件和参数文件的备份集文件名中可以找到
这里备份文件名为C-1214105935-20090508-01,1214105935就是之前数据库实例的DBID。
RMAN> SET DBID 1207393283;
5, 启动数据库到nomount状态
RMAN> STARTUP NOMOUNT;
6, 从备份集中恢复spfile
由于RMAN的信息是保存在控制文件中,我们当前没有控制文件,所以需要手动指定备份集
RMAN> RESTORE SPFILE TO PFILE ‘D:\RECOVERYDB\PFILE.ORA' FROM 'D:\ORACLE\BACKUP\C-1207393283-20090510-01’
7, 修改生成的PFILE.ORA目录后启动数据库到nomount状态
RMAN> startup nomount force pfile='D:\recoverydb\pfile.ora'
8, 恢复控制文件
RMAN>RESTORE CONTROLFILE FROM 'D:\ORACLE\BACKUP\C-1207393283-20090510-01'
启动 restore 于 10-5月 -09
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在复原控制文件
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:03
输出文件名=D:\RECOVERYDB\ORADATA\ORCL\CONTROL01.CTL
输出文件名=D:\RECOVERYDB\ORADATA\ORCL\CONTROL02.CTL
输出文件名=D:\RECOVERYDB\ORADATA\ORCL\CONTROL03.CTL
完成 restore 于 10-5月 -09
9,启动数据库到MOUNT状态,找到当前控制文件中数据文件的路径
RMAN> ALTER DATABASE MOUNT;
SQL> select file#,name from v$datafile;
10,指定数据文件的新路径和备份集的位置,还原数据文件
SQL>
DECLARE
devtype varchar2(256);
done boolean;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1');
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>01,toname=>'d:\recoveryDB\oradata\orcl\system01.dbf');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>02,toname=>'d:\recoveryDB\oradata\orcl\undotbs01.dbf');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03,toname=>'d:\recoveryDB\oradata\orcl\sysaux01.dbf');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04,toname=>'d:\recoveryDB\oradata\orcl\users01.dbf');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05,toname=>'d:\recoveryDB\oradata\orcl\example01.dbf');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'d:\oracle\backup\1FKEMC7E_1_1', params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;
/
11,重建控制文件
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
在D:\recoveryDB\admin\orcl\udump中找到生成的跟踪文件
复制并修改生成的两个重建控制文件SQL语句的后一个
关闭数据库并启动到nomount状态
SQL> SHUTDOWN IMMEDIATE;
SQL> startup nomount pfile='d:\recoveryDB\pfile.ora';
使用更改后的SQL语句重建控制文件
SQL>
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\recoveryDB\ORADATA\ORCL\REDO01.LOG' SIZE 50M,
GROUP 2 'D:\recoveryDB\ORADATA\ORCL\REDO02.LOG' SIZE 50M,
GROUP 3 'D:\recoveryDB\ORADATA\ORCL\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:\recoveryDB\ORADATA\ORCL\SYSTEM01.DBF',
'D:\recoveryDB\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\recoveryDB\ORADATA\ORCL\SYSAUX01.DBF',
'D:\recoveryDB\ORADATA\ORCL\USERS01.DBF',
'D:\recoveryDB\ORADATA\ORCL\EXAMPLE01.DBF'
CHARACTER SET ZHS16GBK;
12,还原数据库
SQL> recover database using backup controlfile until cancel;
输入Cancel
13,用resetlogs方式打开数据库
SQL> alter database open resetlogs;
14,查看数据是否恢复
SQL> select * from test;
A
----------
1
2
15,修改临时表空间的大小,因为RMAN不备份临时表空间。
16,创建SPFILE,这样就不用每次启动时指定pfile了。
SQL> create spfile from pfile=’d:\recoveryDB\pfile.ora’
17,如需恢复EM,可通过以下方法:
1) 删除原资料库
emca -deconfig all db -repos drop
2) 建立资料库
emca -config dbcontrol db -repos create
18,环境变量中设定oracle
至此,数据库已经恢复完成。
1,取消自动扩展
SQL> alter database datafile 4 autoextend off
2,插入数据,重复执行直到无法插入
SQL> insert into tb select * from tb
3,关闭数据库
SQL> shutdown immediate;
4,使用UltraEdit打开USERS01.DBF,修改几个数据块。
5,打开数据库
SQL> startup open;
6,通过count值对tb表进行全表扫描
SQL> select count(*) from caleb.tb;
select count(*) from caleb.tb
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 313)
ORA-01110: 数据文件 4: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'
7,使用Oracle提供工具dbverify来验证数据文件
C:\Documents and Settings\Caleb>dbv
file=D:\oracle\product\10.2.0\oradata\orcl\sers01.dbf
DBVERIFY: Release 10.2.0.4.0 - Production on 星期五 6月 5 14:41:36 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - 开始验证: FILE = D:\oracle\product\10.2.0\oradata\orcl\users01.dbf
页 313 标记为损坏
Corrupt block relative dba: 0x01000139 (file 4, block 313)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x01000139
last change scn: 0x0000.0009575a seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x575a0601
check value in block header: 0xa4e5
computed block checksum: 0x200
DBVERIFY - 验证完成
检查的页总数: 640
处理的页总数 (数据): 389
失败的页总数 (数据): 0
处理的页总数 (索引): 2
失败的页总数 (索引): 0
处理的页总数 (其它): 234
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 14
标记为损坏的总页数: 1
流入的页总数: 0
最高块 SCN : 612677 (0.612677)
7,使用RMAN进行在线数据块恢复
rman target/
RMAN> blockrecover datafile 4 block 313;
启动 blockrecover 于 05-6月 -09
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=155 devtype=DISK
通道 ORA_DISK_1: 正在还原块
通道 ORA_DISK_1: 正在指定要从备份集还原的块
正在还原数据文件 00004 的块
通道 ORA_DISK_1: 正在读取备份片段 D:\ORACLE\BACKUP\0MKGQQK2_1_1
通道 ORA_DISK_1: 已从备份片段 1 还原块
段句柄 = D:\ORACLE\BACKUP\0MKGQQK2_1_1 标记 = TAG20090605T140450
通道 ORA_DISK_1: 块还原完成, 用时: 00:00:02
正在开始介质的恢复
存档日志线程 1 序列 2 已作为文件 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\OR
CL\ARCHIVELOG\2009_06_05\O1_MF_1_2_52KFFT6T_.ARC 存在于磁盘上
存档日志线程 1 序列 3 已作为文件 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\OR
CL\ARCHIVELOG\2009_06_05\O1_MF_1_3_52KFHJX9_.ARC 存在于磁盘上
介质恢复完成, 用时: 00:00:03
完成 blockrecover 于 05-6月 -09
8,查询数据
SQL> select count(*) from caleb.tb;
COUNT(*)
----------
196608
至此,数据块恢复成功完成。
RMAN可以在线完成数据块恢复,避免停机。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14293419/viewspace-605266/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14293419/viewspace-605266/