一、恢复的相关概念
1.1)实例恢复
是指数据库在遭遇突然情况下崩溃,在处理的事务中有提交的,有没有提交的,
也就是说有脏数据,数据库系统本身有某种记录状态和数据的机制。在下次重启之后,再次运行该实例时,
系统自动检查相关状态并有专有进程将该实例的状态、数据恢复到崩溃的那个时候。
1.2)介质恢复
首先使用备份还原数据,然后再应用归档日志、重做日志的恢复方式称为介质恢复。
介质恢复能将一个经过还原的数据更新到当前的时间点或之前的某个时间点。
通常介质恢复这个术语专指对数据文件进行恢复的过程。
数据块的介质恢复指数据文件中的个别数据块出现错误时进行的特殊恢复操作。
介质恢复通常又可以分为完全恢复和不完全恢复
1.2.1)完全恢复
使用数据库,表空间或数据文件的备份进行还原,再使用归档,重做日志或增量备份将数据更新到当前时间点
用户可以实现基于对数据库、表空间、数据文件执行完全恢复
1.2.2)不完全恢复
是将数据恢复到某一个特定的时间点或特定的SCN。
不完全介质恢复的几种类型:
基于时间的恢复(Time-based recovery) 将数据恢复到指定的时间点
用户控制的恢复(Cancel-based recovery) 当用户提交CANCEL后停止恢复
(此选项在使用RMAN时无效)
基于SCN 的恢复(Change-based recovery) 将数据恢复到指定的SCN
按重做日志序号恢复(Log sequence recovery)将数据恢复到指定的重做日志序号
(仅使用RMAN时有效)
二、基于用户管理恢复的方法
数据恢复时的常用视图
v$reover_file --查询需要恢复的文件,该视图信息来自控制文件,
如控制文件来自备份或重建过则信息会不准
v$archived_log --查询所有归档日志列表
v$recovery_log --查询所有需要用于恢复的日志
常用的recover命令
--mount状态下执行恢复
SQL> recover database;
--open状态下执行恢复
SQL> recover tablespace users;
配置恢复自动使用归档日志
在介质恢复前通过设置set autorecovery on来自动应用归档日志实现恢复
也可以在输入归档日志路径、文件名时输入auto
恢复文件到新路径
alter database rename file '
三、完全恢复
3.1) 恢复数据库
3.1.1)备份数据库
RMAN> backup database;
3.1.2) 删除所有数据文件
SQL> SELECT 'rm -f '||file_name FROM DBA_DATA_FILES;
tail -f /opt/oracle/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log
3.1.3)恢复数据库
SQL> startup;
SQL> select OPEN_MODE from v$database;
SQL> set linesize 200
col ERROR format a20
select * from v$recover_file;
rman target /
RMAN> restore database ;
SQL> set linesize 200
col ERROR format a20
select * from v$recover_file;
recover database ;
alter database open;
3.2) 恢复表空间:恢复表空间时候,记得OFFLINE表空间,恢复完成ONLINE;
3.2.1)创建表空间并插入数据
create tablespace rman_tablespace_test datafile '/opt/oracle/oradata/WEISIDB/dbfile_01.dbf' size 100M;
alter user weisi default tablespace rman_tablespace_test;
backup databae;
sqlplus weisi/weisi@weisi
create table big_rman_t tablespace rman_tablespace_test as select * from sys.dba_objects ;
select count(1) from big_rman_t;
select file_name from dba_data_files where tablespace_name='RMAN_TABLESPACE_TEST' ;
/opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckrv2vky_.dbf
rm -f /opt/oracle/oradata/WEISIDB/dbfile_01.dbf
/opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckrv2vky_.dbf
select count(1) from big_rman_t;
select file_name,online_status from dba_Data_files;
alter database datafile '/opt/oracle/oradata/WEISIDB/dbfile_01.dbf' offline;
col TABLESPACE_NAME format a30
col file_name format a50
select file_name,online_status from dba_Data_files;
select tablespace_name , status from dba_tablespaces;
alter tablespace rman_tablespace_test offline;
alter tablespace rman_tablespace_test offline immediate;
RMAN> restore tablespace rman_tablespace_test;
recover tablespace rman_tablespace_test;
alter tablespace rman_tablespace_test online;
select count(1) from big_rman_t;
3.3) 恢复数据文件
select file_name,online_status from dba_Data_files;
rm -f /opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckh42899_.dbf
select count(1) from big_rman_t;
alter system flush buffer_cache;
alter database datafile 8 offline;
RMAN> restore datafile 8;
recover datafile 8;
alter database datafile 8 online;
总结:
数据库处于关闭状态下的恢复:包括系统表空间(系统数据文件)、Undo 表空间、整个数据库
1.关闭实例
2.startup mount;
3.还原数据文件
4.使用归档日志更新到最新
5.打开数据库
数据库处于打开状态下,非系统数据文件丢失的恢复
1.将数据文件offline(alter database datafile n offline)
2.还原数据文件(restore)
3.恢复数据文件(recover datafile n)
4.使数据文件online (alter database datafile n online)
四:控制文件恢复
Oracle 控制文件为二进制文件,记录了当前数据库的物理结构信息,多路复用的原则。
在mount阶段被读取,open阶段一直被使用
控制文件中包含的内容:
数据库的名字、ID、创建的时间戳
表空间的名字
联机日志文件、数据文件的位置、个数、名字
联机日志的Sequence号码
检查点的信息
归档信息
备份信息
alter database backup controlfile to trace as '/opt/soft/control.sql';
SHOW PARAMETER CONTROL_FILES --列出控制文件的名字、状态、位置等
备份控制文件
1.alter database backup controlfile to '/opt/soft/control.ctl';
2.alter database backup controlfile to trace as '/opt/soft/control.sql' ;
3.RMAN> backup current controlfile;
备份:SPFILE
backup spfile;
恢复SPFILE
/opt/oracle/product/11.2.0/dbhome/dbs/spfileORCL.ora
实验:
1.完全备份数据库
2.关闭数据库
3.删除SPFILE
cd /opt/oracle/product/11.2.0/dbhome/dbs/
4.恢复SPFILE
RMAN> startup force nomount;
RMAN> restore spfile;
RMAN> restore spfile from autobackup;
RMAN> restore spfile from '/opt/oracle/flash_recovery_area/WEISIDB/backupset/2016_12_11/o1_mf_ncsnf_TAG20161211T113526_d4slkyt2_.bkp';
RMAN> restore spfile to '/opt/soft/spfile' from '/opt/soft/recover/ORCL/backupset/2016_04_23/o1_mf_nnsnf_TAG20160423T072145_ckodj973_.bkp';
RMAN> shutdown immediate;
RMAN> start;
恢复控制文件:
/opt/oracle/oradata/ORCL/control01.ctl, /opt/oracle/oradata/ORCL/control02.ctl
RMAN> backup current controlfile;
SQL> shutdown immediate;
mv /opt/oracle/oradata/ORCL/control01.ctl /opt/oracle/oradata/ORCL/control01.ctl_20160424
mv /opt/oracle/oradata/ORCL/control02.ctl /opt/oracle/oradata/ORCL/control02.ctl_20160424
cd opt/soft/recover/ORCL/backupset/
ll -th
SQL> startup
RMAN> restore controlfile from '/opt/oracle/flash_recovery_area/WEISIDB/backupset/2016_12_11/o1_mf_ncnnf_TAG20161211T142803_d4swhn8w_.bkp';
RMAN> alter database mount;
RMAN> recover database;
RMAN> alter database open resetlogs;
手动创建控制文件
SQL> alter database backup controlfile to trace as '/opt/soft/control.sql' ;
shutdown immediate;
mv /opt/oracle/oradata/ORCL/control01.ctl /opt/oracle/oradata/ORCL/control01.ctl_20160424_4
mv /opt/oracle/oradata/ORCL/control02.ctl /opt/oracle/oradata/ORCL/control02.ctl_20160424_4
sqlplus / as sysdba
SQL> startup nomount;
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 40
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE GROUP 2 '/opt/oracle/oradata/ORCL/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/opt/oracle/oradata/ORCL/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE '/opt/oracle/oradata/ORCL/system01.dbf','/opt/oracle/oradata/ORCL/sysaux01.dbf', '/opt/oracle/oradata/ORCL/undotbs01.dbf', '/opt/oracle/product/11.2.0/dbhome/dbs/data_D-ORCL_I-1434170406_TS-USERS_FNO-4_0vr1prk2', '/opt/oracle/oradata/ORCL/weisi_catalog_01.dbf','/opt/oracle/oradata/ORCL/undo02.dbf','/opt/soft/oracle/rman_tbs_01.dbf' CHARACTER SET AL32UTF8;
RECOVER DATABASE using backup controlfile;
alter database open resetlogs;
数据文件无备份情况下的恢复
前提是非系统表空间
控制文件未被重新创建或恢复到以前的版本(丢失数据文件的描述信息应在数据字典和控制文件中)
该数据文件从文件开始到丢失期间的所有日志必须存在
使用下面的命令重建数据文件
alter database create datafile 'filename';
alter database create datafile 'filename' as 'new file name'; --可以放置到不同目录
步骤:-->先将丢失数据文件脱机-->重建数据文件-->应用归档日志-->联机恢复的数据文件
SQL> create tablespace rman_datafile_nobackup datafile '/opt/oracle/oradata/ORCL/no_back.dbf' size 100M
create user wuzhenxing identified by wuzhenxing default tablespace rman_datafile_nobackup;
grant select on DBA_OBJECTS to wuzhenxing;
grant connect to wuzhenxing;
grant resource to wuzhenxing;
wuzhenxing
create table t as select * from sys.dba_objects;
insert into t select * from t;
select count(1) from t;
SYS
alter system switch logfile;
alter system checkpoint;
os
rm -f /opt/oracle/oradata/ORCL/no_back.dbf
SYS
alter system flush buffer_cache;
wuzhenxing
select count(1) from t;
SYS
select * from dba_data_files;
5
alter database datafile 5 offline;
select * from v$recover_file;
alter database create datafile 5;
select * from v$recovery_log;
select name,checkpoint_change# from v$datafile_header;
recover datafile 5;
alter database datafile 5 online;
wuzhenxing
select count(1) from t;
rm -f /opt/oracle/oradata/ORCL/no_back.dbf
ps -ef |grep dbw
cd /proc/11573/fd
ll | grep no
cp 31 /opt/oracle/oradata/ORCL/no_back.dbf
alter database datafile 9 offline;
recover datafile 9;
alter database datafile 4 online;
resetlogs
数据在启动时候是要做一致性检查的,oracle在open阶段要做两次检查
1. 检查数据文件头的检查点计数(checkpoint cnt)是否和控制文件的检查点计数(checkpoint cnt)一致。目的是确认数据文件
是否来自同一版本,而不是从备份中恢复的。如果这一步检查通过,就进行第二步检查
2. 检查数据文件头的开始scn和控制文件中记录该文件的结束scn是否一致。如果数据文件头的开始scn和控制文件中该文件的结束scn
相等,那说明这个数据文件就不需要恢复,否则就要恢复文件
如果以上两步检查都通过,那就可以正常打开数据库,锁定数据文件,同时将控制文件中每个数据文件的结束scn设置无穷大。
我们在某些条件下打开数据,会提示让用resetlogs选项open数据库,为什么要用resetlogs呢?它是干嘛用的呢?问号一大堆了吧,
下面来具体分析下。
resetlogs的作用
防止陈旧的数据进入数据库(保证数据库的一致性),用resetlogs打开数据库,一定要立即对数据库做个全备。
在控制文件,data file header,redo log header里存储”resetlogs data“,当open resetlogs被执行时,可以通过这些内容检查一致性。
什么时候用resetlogs
1. 不完全恢复
2. 用备份的控制文件恢复
3. 新创建的控制文件来恢复