当前位置:数据库 > Oracle >>

Oracle——不完全恢复步骤

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;
是脚本中的语句。
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,