实验目的,通过恢复来演示归档文件的作用;归档模式;
测试:针对SCOTT.EMP1表进行操作,DML,DDL操作;
针对表所在的表空间进行备份;
切换日志,确保中途的某一次插入数据的操作,切换到一个归档文件,然后破坏这个归档文件;
再切换几次日志,模拟真实环境;
最后破坏数据文件; ---使用RMAN工具恢复
准备工作:开启归档:
alter database archivelog --数据库一致性关闭后,启动到Mount阶段;
alter system set log_archive_dest_2='location=/u01/recovery/'; ---一般dest_1就OK,可以指定多个归档文件,没有意义,两个归档目录就可以了,相当于一个日志组的两个成员互为备份;
archive log list --归档模式查询,是否开启归档;
SQL> show parameter log log_archive_format
string %t_%s_%r.dbf
1_19_958808441.dbf arch_1_21_958808441.log
alter system switch logfile;
SQL> select group#,sequence#,thread#,status from v$log;
GROUP# SEQUENCE# THREAD# STATUS
---------- ---------- ---------- ----------------
1 18 1 INACTIVE
2 20 1 INACTIVE
4 19 1 INACTIVE
5 21 1 ACTIVE
6 22 1 CURRENT
%t =>日志,线程的ID号,单实例都是1,RAC;多实例;
%s=>sequenct#,日志序列号写入归档名称,通过序列号快速找到归档日志
%r=>resetlogs =>alter database open resetlogs,代表数据库新的周期;
日志重置,resetlogs从1开始,才会改变,否则统一
准备工作完成:开始测试:
查询相关视图:
SQL> select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where USERNAME='SCOTT';
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------------------
SCOTT USERS TEMPTS1
SQL> conn scott/tiger
SQL> create table emp1 as select * from emp;
SQL> select count(*) from emp;
COUNT(*) ---------- 14
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/recovery/
cd /u01/recovery/ ls --查看
**使用RMAN 备份对应表空间:
[oracle@yang recovery]$ rman target /
RMAN> backup tablespace users;
RMAN> list backup of tablespace users;
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
4 Full 437609 31-OCT-17 /picclife/app/hukou/data/users01.dbf
--继续操作;alter system switch logfile; / / / 切换几次归档文件后,
SQL> select group#,sequence#,thread#,status from v$log; --查询当前日志组;
5 41 1 CURRENT ---
--插入数据文件;
SQL> insert into emp1 select * from emp;
SQL> commit;
SQL> select count(*) from emp1;
COUNT(*) ---------- 28
alter system switch logfile; / / / /
--破坏:
rm -f /picclife/app/hukou/data/users01.dbf
SQL> alter system flush buffer_cache;
--访问emp1表:
select * from emp1
*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/picclife/app/hukou/data/users01.dbf'
--使用RMAN :恢复:
001:restore 还原: RMAN> restore datafile 4; 报错;先对非关键性表空间offline操作,此时数据库还是Open状态;
RMAN> sql 'alter database datafile 4 offline';
sql statement: alter database datafile 4 offline
RMAN> restore datafile 4;
--查询数据文件头部记录的SCN号:
SQL> select name,checkpoint_change# from v$datafile_header;
NAME -------------------------CHECKPOINT_CHANGE#
/picclife/app/hukou/data/undotbs01.dbf 437716
/picclife/app/hukou/data/users01.dbf 437609 为啥小,使用的是备份片还原来的,旧的;
RMAN> recover datafile 4;
RMAN> sql 'alter tablespace users online';
SQL> select count(*) from emp1;
COUNT(*) ---------- 28
以上是归档完整的情况,可以完全恢复数据文件;
如下我需要破坏一个归档文件;形成四个情况:
A备份节点,表emp1,刚刚创建 14条数据
SQL> drop table emp1 purge;
SQL> create table emp1 as select * from emp;
SQL> select count(*) from emp1;
COUNT(*) ---------- 14 此时14条记录
--查询创建的表,存储的数据所在的表空间:
SQL> select TABLESPACE_NAME from user_segments where SEGMENT_NAME='EMP1';
TABLESPACE_NAME ------------------------------ USERS
--备份:oracle: rman target /
RMAN> backup tablespace users;
RMAN> list backup of tablespace users;
List of Datafiles in backup set 3
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
4 Full 444188 31-OCT-17 /picclife/app/hukou/data/users01.dbf
--生成归档文件,查询A操作产生的归档文件名称:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/recovery/
Next log sequence to archive 69
alter system switch logfile;
[oracle@yang recovery]$ ls *69*
arch_1_69_958808441.log
B: 时间节点 28条数据
-操作,插入数据,commit<统计数据量,确定归档日志文件;
SQL> insert into emp1 select * from emp1;
SQL> commit;
SQL> select count(*) from emp1;
COUNT(*) ---------- 28
SQL> archive log list
Archive destination /u01/recovery/
Next log sequence to archive 70
alter system switch logfile;
[oracle@yang recovery]$ ls *70*
arch_1_70_958808441.log
alter system switch logfile; 切换几次日志
C节点:delete emp1 where rownum<20; 9条数据
19 rows deleted.
SQL> commit;
SQL> select count(*) from emp1;
COUNT(*) ---------- 9
SQL> archive log list
Next log sequence to archive 71
SQL> alter system switch logfile;
[oracle@yang recovery]$ ls *71*
arch_1_71_958808441.log
alter system switch logfile; / /切换几次日志
D节点 ---查询18条数据
SQL> insert into emp1 select * from emp1;
SQL> commit;
SQL> select count(*) from emp1;
COUNT(*) ---------- 18
alter system switch logfile;
SQL> archive log list
Next log sequence to archive 77
****破坏:删除C节点操作产生的归档文件; 因为设置两份归档,因此只破坏一个归档文件,还是可以恢复;
SQL> select NAME from v$archived_log where name like '%71%';
NAME --------------------------------------------------------------------------------
/u01/guidang/arch_1_71_958808441.log
/u01/recovery/arch_1_71_958808441.log
[oracle@yang recovery]$ rm /u01/guidang/arch_1_71_958808441.log
[oracle@yang recovery]$ ls /u01/guidang/arch_1_71_958808441.log
ls: /u01/guidang/arch_1_71_958808441.log: No such file or directory
[oracle@yang recovery]$ rm /u01/recovery/arch_1_71_958808441.log
[oracle@yang recovery]$ ls /u01/recovery/arch_1_71_958808441.log
ls: /u01/recovery/arch_1_71_958808441.log: No such file or directory
以上破坏了归档文件,继续破坏,删除数据文件;
[oracle@yang guidang]$ rm /picclife/app/hukou/data/users01.dbf
alter system flush buffer_cache;
select count(*) from scott.emp1;
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/picclife/app/hukou/data/users01.dbf'
请问使用备份,进行恢复,能恢复到哪个节点:
A节点:14
B节点:28
C节点:9 ---产生的归档文件删除了
D节点:18
实际操作:RMAN> sql 'alter tablespace users offline';
RMAN> restore datafile 4;
RMAN> recover datafile 4;
Starting recover at 31-OCT-17 using channel ORA_DISK_1
starting media recovery
archived log for thread 1 with sequence 69 is already on disk as file /u01/guidang/arch_1_69_958808441.log archived log for thread 1 with sequence 70 is already on disk as file /u01/guidang/arch_1_70_958808441.log archived log for thread 1 with sequence 72 is already on disk as file /u01/guidang/arch_1_72_958808441.log archived log for thread 1 with sequence 73 is already on disk as file /u01/guidang/arch_1_73_958808441.log archived log for thread 1 with sequence 74 is already on disk as file /u01/guidang/arch_1_74_958808441.log archived log for thread 1 with sequence 75 is already on disk as file /u01/guidang/arch_1_75_958808441.log archived log for thread 1 with sequence 76 is already on disk as file /u01/guidang/arch_1_76_958808441.log RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 10/31/2017 19:59:49 RMAN-06053: unable to perform media recovery because of missing log RMAN-06025: no backup of archived log for thread 1 with sequence 71 and starting SCN of 444273 found to restore
RMAN> sql 'alter tablespace users online';
ORA-01110: data file 4: '/picclife/app/hukou/data/users01.dbf'
SQL> alter tablespace users online;
alter tablespace users online * ERROR at line 1:
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/picclife/app/hukou/data/users01.dbf'
SQL> recover datafile 4; ORA-00279: change 444188 generated at 10/31/2017 19:46:56 needed for thread 1 ORA-00289: suggestion : /u01/recovery/arch_1_69_958808441.log ORA-00280: change 444188 for thread 1 is in sequence #69
Specify log: {<RET>=suggested | filename | AUTO | CANCEL} auto ORA-00279: change 444226 generated at 10/31/2017 19:47:41 needed for thread 1 ORA-00289: suggestion : /u01/recovery/arch_1_70_958808441.log ORA-00280: change 444226 for thread 1 is in sequence #70
ORA-00279: change 444273 generated at 10/31/2017 19:49:52 needed for thread 1 ORA-00289: suggestion : /u01/recovery/arch_1_71_958808441.log ORA-00280: change 444273 for thread 1 is in sequence #71
ORA-00308: cannot open archived log '/u01/recovery/arch_1_71_958808441.log' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3
--------------------------------------如上遇到一个情况,一个数据文件,使用备份还原,但是缺失归档,导致控制文件与数据文件记录的SCN号不一致,无法被读取,这种情况下,局部应用redo recover无法取得效果,重启数据库启动到Mount状态,使用数据库级别的recover尝试
SQL> shutdown immediate;
SQL> startup mount;
SQL> select file#,name,checkpoint_change#,last_change#,status from v$datafile;
3 /picclife/app/hukou/data/undotbs01.dbf 445828 445828 ONLINE
4 /picclife/app/hukou/data/users01.dbf 444497 444497 OFFLINE
SQL> select file#,name,checkpoint_change#,status from v$datafile_header;
3 /picclife/app/hukou/data/undotbs01.dbf 445828 ONLINE
4 0 OFFLINE
SQL> alter database datafile 4 online;
SQL> select file#,name,checkpoint_change#,status from v$datafile_header;
3 /picclife/app/hukou/data/undotbs01.dbf 445828 ONLINE
4 /picclife/app/hukou/data/users01.dbf 444273 ONLINE --使用的是备份的数据文件还原回来的,因此,SCN小
alter database open
*
ERROR at line 1:
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/picclife/app/hukou/data/users01.dbf'
SQL> recover datafile 4;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log '/u01/recovery/arch_1_71_958808441.log'
cancel
Media recovery cancelled.
RMAN> run{
2> set until sequence 71;
3> restore database;
4> recover database;};
RMAN-03002: failure of restore command at 11/01/2017 00:28:31
RMAN-06026: some targets not found - aborting restore
RMAN-06023: no backup or copy of datafile 1 found to restore 没有找到备份文件
不是全库备份:----------
SQL> @/home/oracle/huanyuan.sql ---由于没有RMAN备份,只能使用之前的冷备脚本,但是这段时间内,新建的表空间没了,新的数据也没了,彻底的不完全恢复;
SQL> startp mount;
select file#,name,checkpoint_change#,last_change#,status from v$datafile
SQL> select file#,name,checkpoint_change# from v$datafile_header;
FILE# ---------- NAME -----CHECKPOINT_CHANGE# ------------------
1 /picclife/app/hukou/data/system01.dbf 377583
2 /picclife/app/hukou/data/sysaux01.dbf 377583 ---控制文件记录的SCN,数据文件头部的SCN全都是统一的;
SQL> alter database open; --为啥能打开?
Database altered.
SQL> archive log list Database log mode No Archive Mode --归档转为非归档了?
[oracle@yang app]$ cat /home/oracle/huanyuan.sql
host cp /u01/app/lengbei/system01.dbf /picclife/app/hukou/data/system01.dbf;
host cp /u01/app/lengbei/sysaux01.dbf /picclife/app/hukou/data/sysaux01.dbf;
host cp /u01/app/lengbei/undotbs01.dbf /picclife/app/hukou/data/undotbs01.dbf;
host cp /u01/app/lengbei/users01.dbf /picclife/app/hukou/data/users01.dbf;
host cp /u01/app/lengbei/redo03a.log /picclife/app/hukou/log/redo03a.log;
host cp /u01/app/lengbei/redo03b.log /picclife/app/hukou/log/redo03b.log;
host cp /u01/app/lengbei/redo02a.log /picclife/app/hukou/log/redo02a.log;
host cp /u01/app/lengbei/redo02b.log /picclife/app/hukou/log/redo02b.log;
host cp /u01/app/lengbei/redo01a.log /picclife/app/hukou/log/redo01a.log;
host cp /u01/app/lengbei/redo01b.log /picclife/app/hukou/log/redo01b.log;
host cp /u01/app/lengbei/ora_control1 /picclife/app/oracle/oradata/hukou/ora_control1;
host cp /u01/app/lengbei/control5 /picclife/control5;
*************总结,备份备份最重要,测试环境没有备份,无法完全恢复,直接不完全的恢复可以用,但是实际中万万要保存数据重要性不容忽视,丢失归档,如果没有全备,和不开归档时一样的