对于Oracle数据库来说,如果是实例恢复,需要确定检查点和检查点之后所有的日志的有效性,Oracle会自己完成恢复。如果是介质恢复,数据库运行在归档模式下,Oracle需要有一个备份,作为恢复的起点,需要从这个备份时间开始之后所有的归档日志和联机日志文件。当然,如果从严格意义上来讲,对于普通数据文件而言,即使没有备份也是可以恢复的。
我们来看下面的例子:
在这个例子当中,我创建了一个表空间userdata,并在表空间上创建表T,并插入数据
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/db01/system01.dbf
/u01/app/oracle/oradata/db01/undotbs01.dbf
/u01/app/oracle/oradata/db01/sysaux01.dbf
/u01/app/oracle/oradata/db01/users01.dbf
/u01/app/oracle/oradata/db01/example01.dbf
SQL> create tablespace userdata
2 datafile '/u01/app/oracle/oradata/db01/userdata01.dbf' size 10m;
Tablespace created.
SQL> create table t (x number) tablespace userdata;
Table created.
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- --------------------------------
1 2 CURRENT
2 0 UNUSED
3 1 INACTIVE
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
使用alter sytem switch logfile 切换日志,模拟由于业务操作比较多,联机日志文件写满切换,导致刚才插入的日志2中的操作被覆盖
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- --------------------------------
1 5 CURRENT
2 3 INACTIVE
3 4 ACTIVE
再往表中插入一条数据,由于提交了,此次操作会写入到联机日志文件5号中
SQL> insert into t values(5);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t;
X
----------
2
5
退出sqlplus,模拟文件丢失,再次进入sqlplus,当我们要建表t1时报错,到目录下检查文件,文件已经丢失
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@ztj10 ~]$ rm /u01/app/oracle/oradata/db01/userdata01.dbf
[oracle@ztj10 ~]$
[oracle@ztj10 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu May 17 14:08:40 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> create table t1(x number) tablespace userdata;
create table t1(x number) tablespace userdata
*
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/db01/userdata01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@ztj10 ~]$ ls /u01/app/oracle/oradata/db01/
a.sql control02.ctl example01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf
control01.ctl control03.ctl redo01.log redo03.log system01.dbf undotbs01.dbf
[oracle@ztj10 ~]$
使用RMAN恢复文件,即使没有备份Oracle也可以把文件修复回来,只要从表空间创建开始的归档日志和联机日志文件全部存在就可以,更直白一点,只要表空间创建之后的所有操作都存在就可以。
[oracle@ztj10 ~]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu May 17 14:09:59 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: DB01 (DBID=1414786454)
使用list backup命令确认,没有对表空间做过备份
RMAN> list backup of tablespace userdata;
using target database control file instead of recovery catalog
使用RMAN命令修复表空间,注意红色部分,由于没有备份,所以Oracle并没有执行restore动作,而是创建了一个新的数据文件,当然这个文件是空的,
没有内容的,所以后面Oracle会开始recover的动作,应用日志,把文件修复到当前的时间点。
RMAN> run{
2> allocate channel c1 type disk;
3> sql 'alter tablespace userdata offline immediate';
4> restore datafile 6;
5> recover datafile 6;
6> sql 'alter tablespace userdata online';
7> }
allocated channel: c1
channel c1: sid=141 devtype=DISK
sql statement: alter tablespace userdata offline immediate
Starting restore at 2012-05-17 14:18:06
creating datafile fno=6 name=/u01/app/oracle/oradata/db01/userdata01.dbf
restore not done; all files readonly, offline, or already restored
Finished restore at 2012-05-17 14:18:07
Starting recover at 2012-05-17 14:18:07
starting media recovery
archive log thread 1 sequence 2 is already on disk as file
/u01/app/oracle/flash_recovery_area/DB01/archivelog/2012_05_17/o1_mf_1_2_7v95dv07_.arc
archive log thread 1 sequence 3 is already on disk as file
/u01/app/oracle/flash_recovery_area/DB01/archivelog/2012_05_17/o1_mf_1_3_7v95dzfd_.arc
archive log thread 1 sequence 4 is already on disk as file
/u01/app/oracle/flash_recovery_area/DB01/archivelog/2012_05_17/o1_mf_1_4_7v95f3bo_.arc
archive log filename=/u01/app/oracle/flash_recovery_area/DB01/archivelog/2012_05_17/o1_mf_1_2_7v95dv07_.arc thread=1 sequence=2
media recovery complete, elapsed time: 00:00:02
Finished recover at 2012-05-17 14:18:10
sql statement: alter tablespace userdata online
released channel: c1
RMAN> exit
Recovery Manager complete.
[oracle@ztj10 ~]$
修复完成后,在sqlplus下检验文件是否可以使用
[oracle@ztj10 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu May 17 14:20:50 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select * from t;
X
----------
2
5
SQL>
SQL> create table t2(x number) tablespace userdata;
Table created.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
检查文件所在目录,文件也已经存在
[oracle@ztj10 ~]$ ls /u01/app/oracle/oradata/db01/ -l
total 1063336
-rw-r--r-- 1 oracle oinstall 551 May 13 16:54 a.sql
-rw-r----- 1 oracle oinstall 7061504 May 17 14:21 control01.ctl
-rw-r----- 1 oracle oinstall 7061504 May 17 14:21 control02.ctl
-rw-r----- 1 oracle oinstall 7061504 May 17 14:21 control03.ctl
-rw-r----- 1 oracle oinstall 104865792 May 17 14:07 example01.dbf
-rw-r----- 1 oracle oinstall 52429312 May 17 14:21 redo01.log
-rw-r----- 1 oracle oinstall 52429312 May 17 14:07 redo02.log
-rw-r----- 1 oracle oinstall 52429312 May 17 14:07 redo03.log
-rw-r----- 1 oracle oinstall 241180672 May 17 14:20 sysaux01.dbf
-rw-r----- 1 oracle oinstall 503324672 May 17 14:18 system01.dbf
-rw-r----- 1 oracle oinstall 20979712 May 17 12:01 temp01.dbf
-rw-r----- 1 oracle oinstall 26222592 May 17 14:20 undotbs01.dbf
-rw-r----- 1 oracle oinstall 10493952 May 17 14:18 userdata01.dbf
-rw-r----- 1 oracle oinstall 5251072 May 17 14:07 users01.dbf
以上方法并不适用于所有的表空间,比如system表空间。
也许有人会说,既然对于数据文件来说,不用备份就可以修复,那是不是以后备份的工作我们就不做了呢?显然不是的,我们这样的恢复是有严格的前提的,就是所有的归档日志和联机日志文件都要存在,一点不丢,那就意味着,为了保证数据库不做备份就可以恢复,我们需要非常大的存储来保留日志,还要保证日志不被意外损坏,这个难度是非常大的。当然还有一点是非常重要的,日志越多,恢复的速度是越慢的,这个也是很多公司所不能承受的。
在这里我们只是介绍Oracle的技术,具体的备份恢复策略需要根据实际的应用和业务需求来定。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html