Oracle——不完全恢复步骤
不完全恢复分为用户不完全恢复和RMAN不完全恢复。若联机重做日志文件或者归档日志文件有丢失,则只能进行不完全恢复。
一.不完全恢复的分类
1.time recover选项,指定恢复到某个时间点,常用。
2.cancel recover选项,停止在某个日志切换序列号处,通常只在归档日志文件受损或丢失的情况下使用,从而无法进一步恢复。
3.change-base recover选项,指定到某个SCN号。
4.在所有情况下都将恢复到恰好在请求的停止点之前的变更向量,比如将不会应用到指定的SCN。
二.执行不完全恢复的步骤
1.关闭和备份数据库或者某些数据文件;
2.加载数据库。
3.还原数据文件(必要时还原控制文件);
4.将数据库恢复到某个时间点;
5.使用重置日志(resetlog)打开数据库。
三.基于时间的恢复
指定到某个时间点,但是要注意其时间的格式是不允许改变的,无论在SQL*PLUS会话中如何设置它的NLS_DATE_FORMAT ,日期必须是yyyy-mm-dd:hh24:mi:ss。
1.在用户Dave下创建个表sunny,插入数据,
SQL> create table sunny (id int,name char(10)) tablespace app1;
Table created.
SQL> insert into sunny values(0,'baby');
1 row created.
SQL> commit;
Commit complete.
手动发生检查点,
SQL> alter system checkpoint;
System altered.
这样数据写进了数据文件app1_01.dbf。
2.关闭数据库,对app1_01.dbf数据文件做个备份,插入新的数据
备份数据文件,
[oracle@oracle11g wilson]$ cp app1_01.dbf /u01/ubackup/cold
打开数据库,插入新数据
SQL> insert into sunny values(1,'Jasper');
1 row created.
SQL> commit;
Commit complete.
查看当前时间,
SQL> select to_char(sysdate,'DD-MON-YYYY HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'DD-MON-YYYYH
-----------------------------
04-SEP-2013 12:52:34
3.删除表,再恢复回来,
SQL> drop table sunny;
Table dropped.
关闭数据库,删除数据文件,再还原备份的数据文件(这个文件中不含有新的数据),
[oracle@oracle11g wilson]$ rm -f app1_01.dbf
还原数据文件,
[oracle@oracle11g backup]$ cp /u01/backup/app1_01.dbf /u01/oradata/wilson/
4.将数据库置于mount状态,恢复表
SQL> recover database until time '2013-09-04:12:52:22';
Media recovery complete.
指定时间点,打开数据库,
SQL> alter database open resetlogs;
即可。
四.基于cancel的恢复
1.关闭数据库,备份数据库,命令如下,
[root@oracle11g wilson]# cp /u01/oradata/wilson/* /u01/ubackup/cold/
2.打开数据库,在表Dave.sunny中插入数据,
SQL> insert into sunny values(3,'memory');
1 row created.
SQL> commit;——————数据存于联机重做日志中
Commit complete.
SQL> alter system checkpoint;——————数据存于数据文件中
System altered.
SQL> alter system archive log current;——————数据存于归档日志中
System altered.
可以看到记录(3,‘memory’)存于数据文件,联机重做日志文件和归档日志文件中。
3.插入新数据,不放在归档日志中
SQL> insert into sunny values(4,'king');
1 row created.
SQL> commit;——————数据存于联机重做日志中
Commit complete.
SQL> alter system checkpoint;——————数据存于数据文件中
System altered.
4.先备份控制文件
SQL> alter database backup controlfile to trace as '/tmp/wilson.sql';
Database altered.
然后除了归档日志文件,把其它文件都删除了,关闭数据库,把备份的数据文件还原(没有控制文件和联机重做日志文件),
[root@oracle11g wilson]# cp /u01/ubackup/cold/*.dbf /u01/oradata/wilson/
5.修改备份的控制文件脚本
如果不用脚本创建,可以复制个二进制的控制文件,复制过去即可;
在脚本中有两组恢复方法:a.在联机重做日志正常的情况下,
b.在联机重做日志不正常的情况下,
这里使用b方法,打开脚本修改一下,
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "WILSON" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/wilson/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/oradata/wilson/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/oradata/wilson/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/oradata/wilson/system01.dbf',
'/u01/oradata/wilson/sysaux01.dbf',
'/u01/oradata/wilson/undotbs01.dbf',
'/u01/oradata/wilson/users01.dbf',
'/u01/oradata/wilson/example01.dbf',
'/u01/oradata/wilson/app1_01.dbf',
'/u01/oradata/wilson/smallundo1.dbf'
CHARACTER SET AL32UTF8
;
注意上面语句之间能有空格行,
中间略..........
下面语句是脚本中的,也删除了,可以手工执行,
RECOVER DATABASE USING BACKUP CONTROLFILE
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'
SIZE 104857600 REUSE AUTOEXTEND OFF;
执行脚本,
SQL> @/tmp/wilson.sql
执行下面语句,因为联机重做日志丢失,所以恢复到某个日志切换序列号处,
SQL> recover database using backup controlfile until cancel;
提示,输入cancel
打开数据库,
SQL> alter database open resetlogs;
然后执行恢复临时表空间,
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'
SIZE 104857600 REUSE AUTOEXTEND OFF;
是脚本中的语句。
为