ORACLE文件的备份与恢复(RMAN的备份与恢复)

以下模拟丢失与RMAN恢复操作在实验环境操作

一、RMAN备份

1、和备份恢复相关的术语

(1)MTTR(mean time to recovery,平均恢复时间):受参数fast_start_mttr_target控制;

(2)PITR(point-in-time recovery,不完全恢复):基于时间点的恢复,有DBPITR(数据库级别不完全恢复)、TPSPITR(表空间级别不完全恢复)、TBPITR(表级别不完全恢复),下面第四大点就是不完全恢复的实验。

(3)RTO(Recovery Time Objective):允许故障持续时间,应用场景是高可用部分,即RAC、DG

(4)RPO(Recovery Point Objective):恢复到最近的时间点,应用场景是容灾和备份策略

2、数据库故障种类

(1)、statement failure(语句级别的失败):试图插入无效的数据、权限不足、分配空间失败、应用程序中逻辑错误

(2)、user process failure(用户级别的失败):用户执行非正常断开连接的操作;用户会话异常断开;用户遇到终止会话的程序错误

(3)、Network failure(网络故障):监听失败、网卡故障、网络连接失败

(4)、User error(用户错误):用户不慎删除或修改数据、用户删除表

(5)、Intance failure:断电故障、硬件故障、关键后台进程失败、紧急关闭操作

实例恢复(数据库自动进行)

 a、实例启动(数据文件与控制文件等不一致)

 b、redo往前滚,在最后一次增量检查点的位置开始,可能包括未提交的数据(未提交的语句也被写进redo)

 c、数据文件这时包括之前提交和未提交的数据

 d、启动数据库

e、利用undo回滚,因为undo里面记录了未提交的数据,回滚redo里面未提交的数据

 f、数据文件这时只包括已提交的数据

(6)、media failure(介质故障):磁盘驱动器故障、磁盘控制器故障、删除或损坏数据库操作所需的文件、存储网络故障、固态存储损坏

 物理恢复(介质恢复,数据块、文件、表空间发生损坏)

a、restore:介质重放(数据、scn重放到最近备份以前的scn号)

b、recover:利用归档和redo做前滚恢复

c、完全恢复:指没有数据丢失的情况,能够恢复到当前redo最新已提交的数据,一直写到redo log的最末端,包含已提交和未提交的数据,利用undo来回滚未提交的数据

d、不完全恢复:是一种按需恢复的手段,恢复用户的误操作,可根据时间、scn或文件号进行恢复,包含已提交和未提交的数据,利用undo来回滚未提交的数据

(7)、data failure(数据故障):无法访问文件(数据文件丢失、访问权限错误、表离线)、物理损坏(数据块的checksum损坏、无效的块头)、逻辑损坏(不一致的字典、损坏的行)、不一致性(控制文件比数据文件、联机重做文件更老)、I/O失败(限制文件的数量超过、不可访问的通道、网络或I/O错误)

3、快速恢复区(fast recovery area)

自动管理与备份相关的文件,推荐大小为数据库目前容量的两倍;可包含控制文件多副本、在线重做日志文件、归档日志文件、数据文件和控制文件的image副本、备份片、闪回日志。

//启用快速恢复区先设置大小,再设置位置
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 40G ;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST ='/u01/app/oracle/fast_recovery_area'  scope=spfile;
//禁用快速恢复区
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='';

4、catatlog

保存控制文件可覆盖区的元数据信息,控制文件存放RMAN的仓库元数据信息,主要包括永久区(存放数据文件、日志文件的元数据)和可覆盖区(为了控制文件大小适中,包括归档日志、备份集信息的元数据),可覆盖区受参数control_file_record_keep_time控制,可以保存多个数据库的元数据信息。

(1)创建catalog(选择数据库;创建表空间;创建恢复目录用户;执行create catalog命令)

//在非容器数据库chenmu上实验,创建表空间
CREATE TABLESPACE tools DATAFILE '/u01/app/oracle/oradata/CHENMU/tools01.dbf' SIZE 5242880
AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT 
NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO; 
//创建恢复目录用户,并授权
CREATE USER cata IDENTIFIED BY cata
TEMPORARY TABLESPACE temp 
DEFAULT TABLESPACE tools 
QUOTA UNLIMITED ON tools;
GRANT RECOVERY_CATALOG_OWNER TO cata;
//在rman环境下执行CREATE CATALOG命令 
rman  catalog cata/cata;
CREATE CATALOG TABLESPACE tools;
//刚创建完未注册,没有数据,只有一些表结构,没有和目标库关联
//注册数据库
rman target / catalog cata/cata;  //登录目标库 /,并连接到catalog库,因为在本地所以可以直接cata/cata登录,否则在后面加上@
register database;  //把控制文件里面的信息放到catalog里面去
report schema;

(2)维护catalog(目标数据库的元数据发生变更)

自动同步:将恢复目录与目标数据库的当前或备份控制文件进行对比并更新,有全部同步(添加或删除数据文件、修改RMAN配置)、部分同步(新的备份集、归档日志)。

手动同步:conn target / catalog cata/cata;resync catalog;

(3)删除catalog

rman target / catalog cata/cata;  //登录目标库,连接catalog库
drop catalog;  //删除catalog

可以将用于RMAN备份的脚本保存到catalog中;VPC:Virtual Private Catalogs,更加细粒度控制目标数据库的权限。

//有cata用户做基础,且和创建cata用户一样创建vpc1
rman catalog cata/cata;  //连接到base catalog库
GRANT CATALOG FOR DATABASE prod1 TO vpc1;  //将prod的catalog权限授权给cata
GRANT REGISTER DATABASE TO vpc1; 
CONNECT CATALOG vpc1/vpc1;  //登录vpc管理用户
CREATE VIRTUAL CATALOG;
//若需回收权限,再次登录cata用户,revoke权限,之后登录vpc1用户删除catalog,即 DROP CATALOG;

5、RMAN参数设置

主要有stand-alone(独立执行命令)、Job(不能独立执行的命令,必须包含在run块中)、SQL语句三种命令。

(1)、configure retention policy to...,配置保留备份策略

configure retention policy to redundancy n,保留最新的n份备份,不是最新的n份被标记为redundancy

configure retention policy to recovery window of n days,recovery window是能够恢复的窗口期,保留最近n天的备份,不是最近n天内的被标记为obsolete,备份集有obsolete和expired两种状态,obsolete指不在保留策略里的备份集,但是仍然存在,expired是指在操作系统里已经删除,但备份记录仍存在控制文件。

configure retention policy clear,还原默认值

(2)、configure backup of optimization off,备份优化功能,默认是关闭的,无论是否有备份过都还需要备份,设置为on时,备份优化某些情况下跳过文件的备份,如离线、只读、正常关闭的数据文件或相同的scn和时间的归档文件。

CONFIGURE BACKUP OPTIMIZATION ON;  //打开备份优化,redundancy冗余数是1
alter tablespace users read only;  //调整成read only后,备份数大于n+1时不再备份
backup database;  //此时有users01.dbf的备份
backup database;  //此时有users01.dbf的备份,备份数是n+1=2
backup database;  //没有users01.dbf的备份,备份数=3>n+1
backup database force;  //此时有users01.dbf的备份,即使备份次数大于n+1

(3)、configure default device type to disk|sbt 配置备份到磁盘或磁带。

(4)、configure controlfile autobackup off,控制文件的自动备份功能,默认是关闭,当打开时会自动备份参数文件和控制文件,backup、create catalog、run{backup}、add | alter tablespace等会自动备份。

run{
backup database;
backup tablespace users;
}  
//在run块只备份一次控制文件

0-3是上面的备份优化功能测试产生的,backup后自动备份控制文件。

(5)、configure controlfile autobackup format for device type disk to '%F',配置控制文件的备份路径与备份格式

(6)、configure device type disk parallelism n,配置数据库设备类型的并行度;configure device type disk clear,还原默认值

(7)、configure datafile backup copies for device type disk to n,配置数据库每次备份的copy数量,每一次备份都有可以有多份完全相同的拷贝,backupse(一个或多个文件,可备份至磁盘设备或磁带,优点是不包含空的块,占用较少空间)备份集相当于对文件进行打包,要进行压缩,image copies(镜像文件,必须备份至磁盘设备,不能备份至磁带设备,优点是恢复速度快),大小和原来的数据文件大小是一致的,没有压缩。双工备份对image copies无效;当备份路径是快速恢复区时不能使用双工备份;控制文件自动备份不会是双工的;双工备份不能同时备份到磁盘和磁带。

(8)、configure archivelog backup copies for device type disk to n,配置数据库的归档日志的存放设备类型

RMAN的备份路径优先级是备份语句中指定的format>rman配置中的configure channel device type disk format>闪回恢复区>$ORACLE_HOME/dbs

6、RMAN创建备份

rman target " '/ as sysdba' "在12c以后开始支持,11g不支持;rman target / log rman.log;所有信息定向到rman.log中,前台没有信息输出;rman target / |tee rman.log;所有信息定向到rman.log中,前台也有信息输出。

rman target /;
backup spfile; //备份参数文件 list backup of spfile; //输出参数文件信息 backup current controlfile; //备份正在使用的控制文件,文件必须处于归档模式 list backup of controlfile; //输出控制文件信息 backup tablespace users; //备份表空间 backup datafile 4,5; //备份数据文件 backup database; //备份所有的数据文件,控制文件和参数文件,在线重做日志文件不能备份,要在归档形成归档文件之后才能进行备份 backup database format '...%U....'; //将数据库备份到指定路径 backup archivelog all; backup atchivelog all delete input; //在归档日志备份到备份路径后,把已经备份的归档日志从归档路径删除 backup database plus archivelog; //备份所有的数据文件,控制文件,日志文件和参数文件,加上归档日志 backup incremental level 0|1|2|3|4 database|datafile<>|tablespace <>; //差异增量,备份上次增量级别以来变化的数据。0级备份和全备份的区别在于0级可以用来增量恢复而全备份不可以。

7、备份策略:有全量备份、部分备份、增量备份(0级备份:针对全库的备份,作为增量备份的基础;1级备份:分为累计增量备份(从0级备份)和差异增量备份(从0级或1级备份))、在线备份(非一致性备份)、离线备份(一致性备份)。

(1)全量备份:归档模式可在mount和open下进行全备,非归档模式只能在mount下进行备份。

backup database;  //非容器数据库全备
//备份CDB$ROOT
rman target /;
BACKUP PLUGGABLE DATABASE "CDB$ROOT";
//备份PDB,可以通过target sys/oracle@172.25.100.137/orclpdb连接进orclpdb,执行backup database,还可以用下面的方法
rman target /;
BACKUP PLUGGABLE DATABASE "CDB$ROOT", orclpdb;

备份表表空间

REPORT SCHEMA;
BACKUP TABLESPACE orclpdb:hr;  //备份orclpdb的表空间hr

(2)增量备份:全量备份不能作为增量备份的0级备份使用;进行增量1级备份时,如果之前没有0级备份,则自动创建0级备份;0级备份可以使backupset和image copy,1级备份只能是backupset。

backup incremental level 0 database format '/home/oracle/data/%U';  //0级备份
backup incremental level 1 differential database format '/home/oracle/data/%U';  //1级备份,如果没有指定differential或cumulative,默认是differential

快速增量备份要开启块跟踪,提高增量备份效率。

(3)压缩备份:未分配的块和未使用的块在分配时可以跳过,由high、medium、low、basic四种算法;关注CPU资源开销时,用low算法,关注网络资源开销时使用high算法。

CONFIGURE COMPRESSION ALGORITHM 'BASIC';  //使用basic算法
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;

安全备份(Oracle Secure Backup)、多片段备份(Multisection Backups)、

(4)存档备份(Archive Backups):对备份文件进行存档,不能在FRA中,永久保存时信息保存在catalog中;自动备份数据文件、控制文件、参数文件,自动备份一些归档文件,为了处于一致性。

BACKUP DATABASE FORMAT '/home/oracle/backup/%I_%U' TAG quarterly KEEP UNTIL TIME 'SYSDATE + 365';  //keep保留一年
BACKUP DATABASE FORMAT '/home/oracle/backup/%I_%U' TAG quarterly KEEP FOREVER;  //永久保留

(5)加密备份:有全库加密和表空间加密两种方式;image copy不能被加密;解密在提供密码或key后自动完成的。

查看备份进度

select sid,serial#,opname,context,sofar,totalwork,round(sofar/totalwork*100,2) complete from v$session_longops where opname like 'RMAN%' and sofar<>totalwork;
show parameter diag;  //显示自我诊断路径
show parameter db_unique_name; 

实例的诊断日志常规存放路径是在$ORACLE_BASE/diag/rdbms/db_unique_name/sid

8、自我诊断(在11g之后的版本存在)

(1)、诊断备份性能

backup validate database;  //检测数据库的坏块问题

如果backup validate时间近似实际备份时间,大概率读阶段是备份的瓶颈点,使用高性能的存储设备和多路设备来提高读性能的手段;如果backup validate时间小于实际备份时间,可以改进压缩和加密算法,若使用的是磁带设备,则调整磁带设备的缓存大小。

9、恢复顾问(自动诊断数据库故障,提供适当的修复选项,根据用户的请求执行恢复)

list failure;  //查看失败的问题语句,从告警日志中读出来的,无需处于mount或open状态
advise failure;  //查看修复选项,必须处于mount以上阶段执行
repair failure;  //执行该命令自动修复故障;执行ADVISE FAILURE命令后,可以手动修复故障

恢复顾问的使用

list backup of database;  //在做恢复顾问的实验之前先确保全库备份可用,否则不会给出一些自动化建议
cd $ORACLE_BASE/oradata/CHENMU;
mv chenmu.dbf chenmu.dbf.bak;  //模拟数据文件损坏
validate database;  //出现 could not access datafile 5错误
list failure;  //查看故障,出现 One or more non-system datafiles are missing
advise failure;  //查看建议,出现Restore and recover datafile 5 
repair failure preview;  //查看恢复手段,有Repair script
repair failure;  //执行恢复
list failure;  //再次查看故障,发现故障关闭了

系统表空间、undo表空间在mount阶段,其他数据文件可以在open阶段,即可联机。

10、还原点(对每个特定时间的SCN起别名)

normal restore point(普通还原点):在控制文件中,受control_file_record_keep_time控制,无需手动维护;guarantee restore point(保证还原点):不受control_file_record_keep_time控制,只能手动删除。

CREATE RESTORE POINT res_scn;   //创建还原点,默认是普通还原点
CREATE RESTORE POINT res_scn1 AS OF SCN 100;  //创建100号还原点的别名,但是这个scn号不能超过当前数据库化身的范围
CREATE RESTORE POINT res_scn2 GUARANTEE FLASHBACK DATABASE;  //创建保证还原点,这个操作要开启闪回恢复区,否则出现 Recovery area is not enabled.
LIST RESTORE POINT ALL;  //查看所有还原点
select name,scn,time,guarantee_flashback_database from v$restore_point;
DROP RESTORE POINT res_scn;

 

二、控制文件管理(先做好rman备份,通过restore database preview确认备份存在,restore database validate校验备份可用性)

模拟控制文件丢失与恢复

1、部分丢失(其中一个文件被删除),只需复制恢复区的控制文件即可,前提是恢复区控制文件要存在---这个就是多路复用控制文件解决方法(在oracle的存储结构后面有)

ho rm /u01/app/oracle/oradata/CHENMU/control01.ctl;
shutdown immediate;   //控制文件删除之后这样关闭会出错,因为要修改数据文件,只能用abort
shutdown abort;
startup;    //这样启动也会出错,会显示没有控制文件
ho cp /u01/app/oracle/fast_recovery_area/CHENMU/control2.ctl /u01/app/oracle/oradata/CHENMU/control01.ctl;  //从恢复区复制控制文件
alter database mount;
alter database open;

2、所有控制文件损坏,有历史备份且active/current状态的redo未损坏,利用备份做完全恢复,并以resetlogs方式开库

//在操作系统层面打开RMAN,先对控制文件进行备份
rman target /
backup database;  //会自动备份控制文件
list backup of controlfile;  //显示控制文件的备份位置
exit;
//删除所有控制文件
rm /u01/app/oracle/oradata/CHENMU/control0*;
rm /u01/app/oracle/fast_recovery_area/CHENMU/control0*;
shutdown abort;
rman target /;
startup nomount;
restore controlfile from  autobackup;  //有自动备份的可以通过其恢复
//也可以restore controlfile from '/u01/app/oracle/fast_recovery_area/CHENMU/backupset/2022_12_15/...';  
//恢复成功后面会出现Finished ...,否则会出现RMAN-...
alter database mount;
alter database open resetlogs;  //如果没有这一步alter database open会出现must use resetlogs or....,要重建在线重做日志文件

RESETLOGS:对在线重做日志进行归档,清空redo log内容,将序列号重置为1,若redo log不存在则创建。incarnation是化生,resetlogs之后就会有一个新化生产生。

 3、所有控制文件损坏,有历史备份且active/current状态的redo损坏,利用备份做不完全恢复,并以resetlogs方式开库

backup database;
cd /u01/app/oracle/oradata/CHENMU;
mv  redo01.log  redo01.log.bak;  //模拟日志文件损坏
mv  redo1a.log  redo1a.log.bak;
shutdown immediate;
startup nomount;
restore controlfile from autobackup;
alter database mount;
select name,checkpoint_change# from v$datafile;  //查看数据文件的scn,是21563185
restore database until scn 21563185;
recover database until scn 21563185;
alter database open resetlogs;

4、所有控制文件损坏,且没有历史备份,利用sql语句创建控制文件

如果日志文件可用,用noresetlogs方式恢复控制文件

alter database backup controlfile to trace as '/tmp/c.sql' reuse;  //将控制文件转为文本文件
vi /tmp/c.sql;  //找到#1开始,执行noresetlogs方式以下的sql
:set nu;
/Set #2;
:117,$d; //resetlogs方法在117行,将117行以后删除
sed '/^--/d' /tmp/c.sql >/tmp/noreset1.sql;   //删除注释行
sed '/^$/d' /tmp/noreset1.sql >/tmp/noreset.sql;  //删除空行
shutdown immediate;
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CHENMU" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/u01/app/oracle/oradata/CHENMU/redo01.log',
'/u01/app/oracle/oradata/CHENMU/redo1a.log'
) SIZE 200M BLOCKSIZE 512,
GROUP 2 (
'/u01/app/oracle/oradata/CHENMU/redo02.log',
'/u01/app/oracle/oradata/CHENMU/redo2a.log'
) SIZE 200M BLOCKSIZE 512,
GROUP 3 (
'/u01/app/oracle/oradata/CHENMU/redo03.log',
'/u01/app/oracle/oradata/CHENMU/redo3a.log'
) SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/CHENMU/system01.dbf',
'/u01/app/oracle/oradata/CHENMU/autoallocate.dbf',
'/u01/app/oracle/oradata/CHENMU/sysaux01.dbf',
'/u01/app/oracle/oradata/CHENMU/undotbs01.dbf',
'/u01/app/oracle/oradata/CHENMU/chenmu.dbf',
'/u01/app/oracle/oradata/CHENMU/users01.dbf',
'/u01/app/oracle/oradata/CHENMU/tools01.dbf',
'/u01/app/oracle/oradata/CHENMU/bigfile01.dbf',
'/u01/app/oracle/oradata/CHENMU/undo_test.dbf',
'/u01/app/oracle/oradata/CHENMU/scott.dbf'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/temp02.dbf'
SIZE 104857600 REUSE AUTOEXTEND OFF;
ALTER TABLESPACE TEST_TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/test_temp01.dbf'
SIZE 33554432 REUSE AUTOEXTEND OFF;

如果日志文件不可用,用resetlogs方式恢复控制文件

alter database backup controlfile to trace as '/tmp/c.sql' reuse;
vi /tmp/c.sql; //找到#2开始,执行resetlogs方式以下的sql /Set #2; :1,117d; //将1至117行删除 sed '/^--/d' /tmp/c.sql >/tmp/reset1.sql; //删除注释行 sed '/^$/d' /tmp/reset1.sql >/tmp/reset.sql; //删除空行 shutdown immediate; STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "CHENMU" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 ( '/u01/app/oracle/oradata/CHENMU/redo01.log', '/u01/app/oracle/oradata/CHENMU/redo1a.log' ) SIZE 200M BLOCKSIZE 512, GROUP 2 ( '/u01/app/oracle/oradata/CHENMU/redo02.log', '/u01/app/oracle/oradata/CHENMU/redo2a.log' ) SIZE 200M BLOCKSIZE 512, GROUP 3 ( '/u01/app/oracle/oradata/CHENMU/redo03.log', '/u01/app/oracle/oradata/CHENMU/redo3a.log' ) SIZE 200M BLOCKSIZE 512 DATAFILE '/u01/app/oracle/oradata/CHENMU/system01.dbf', '/u01/app/oracle/oradata/CHENMU/autoallocate.dbf', '/u01/app/oracle/oradata/CHENMU/sysaux01.dbf', '/u01/app/oracle/oradata/CHENMU/undotbs01.dbf', '/u01/app/oracle/oradata/CHENMU/chenmu.dbf', '/u01/app/oracle/oradata/CHENMU/users01.dbf', '/u01/app/oracle/oradata/CHENMU/tools01.dbf', '/u01/app/oracle/oradata/CHENMU/bigfile01.dbf', '/u01/app/oracle/oradata/CHENMU/undo_test.dbf', '/u01/app/oracle/oradata/CHENMU/scott.dbf' CHARACTER SET AL32UTF8 ; RECOVER DATABASE USING BACKUP CONTROLFILE; //控制文件没有scn号,需要读取redo的scn号(日志文件的是最新的),所以需要输入当前使用的redo文件路径 select a.status,b.member from v$log a,v$logfile b where a.GROUP#=b.GROUP#; //状态是current的redo ALTER DATABASE OPEN RESETLOGS; ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/temp02.dbf' REUSE; ALTER TABLESPACE TEST_TEMP ADD TEMPFILE '/u01/app/oracle/oradata/CHENMU/test_temp01.dbf' REUSE;

 

三、数据文件管理(先做好rman备份,和上面一样验证数据库存在及有效性)--完全恢复

在容器数据库进行测试

shutdown immediate;  //在进行备份是先允许归档
startup mount;
alter database archivelog;
backup database plus archivelog;

1、undo文件丢失与恢复(系统关键数据文件system、undo)

undo数据是数据修改前的备份,保证回滚操作。system、undo这些关键性的数据文件恢复必须关闭数据库,在mount状态下进行恢复。下面以容器数据库下的PDB做实验。

alter pluggable database orclpdb5 open;  //以orclpdb5为例
select tablespace_name,file_id,file_name,status,bytes/1024/1024 MB from dba_data_files;  //undotbs01是69号数据文件

创建一个用户hr,并建立一个表test。

create user hr identified by hr123;
grant connect,resource to hr;
alter user hr quota unlimited on users;
conn hr/hr123@172.25.100.137/orclpdb5;
create table test(a varchar(2));
insert into test values('ch');

 

ho rm /u01/app/oracle/oradata/ORCLCDB/orclpdb5/undotbs01.dbf;   //操作系统删除数据文件,此时执行DML操作,因为缓存存在
conn / as sysdba;
alter system flush shared_pool;  //清理shared_pool里缓存的所有数据,生产系统谨慎使用,不知道这个为什么不能直接在hr用户执行
alter system flush buffer_cache;  //清理buffer_cache
alter system flush global context;  //清理连接通信信息

conn hr/hr123@172.25.100.137/orclpdb5;  //连接用户,出现undo文件出错
//在rman执行
shutdown abort;
startup mount;
restore datafile 69;
recover database;
alter database open;

2、用户数据文件丢失与恢复(系统非关键数据文件,可以数据库开启的状态下恢复)

非system、undo可以脱机恢复,可以不用关闭数据库

ho mv /u01/app/oracle/oradata/CHENMU/chenmu.dbf /u01/app/oracle/oradata/CHENMU/chenmu.dbf,bak; //模拟文件丢失
conn hr/hr123;
select * from employees;  //查询表出现数据文件缺失错误,data file 5: '/u01/app/oracle/oradata/CHENMU/chenmu.dbf',确认是5号文件丢失
//在rman执行,设置离线、在线状态可以在表空间级别也可以在数据文件级别
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online';
}

如果关键数据文件和非关键数据文件同时丢失,按照关键数据文件恢复方法。

3、利用image copy恢复

backup as copy database format '/rmanbak/%u_%N';  //拷贝数据文件
mv chenmu.dbf chenmu.dbf.bak;  //模拟数据文件损坏
alter tablespace chenmu offline immediate;  //离线chenmu表空间
switch datafile '/u01/app/oracle/oradata/CHENMU/chenmu.dbf' to copy;  //切换chenmu.dbf文件为镜像文件,把控制文件里文件路径记录切换成备份的文件路径
recover tablespace chenmu;  //恢复chenmu表空间
alter tablespace chenmu online;  //将chenmu表空间设置为在线
report schema;  //验证恢复结果

4、移动数据文件(将数据文件从备份的路径迁移到原来的路径)

方法一:将之前拷贝数据文件/rmanbak/1d1f1o24_CHENMU再拷贝一次,且路径还原成原来数据文件的路径

backup as copy datafile '/rmanbak/1d1f1o24_CHENMU' format '/u01/app/oracle/oradata/CHENMU/chenmu.dbf';
alter tablespace chenmu offline immediate;
switch datafile '/rmanbak/1d1f1o24_CHENMU' to copy;  //修改控制文件里面的记录
recover tablespace chenmu;
alter tablespace chenmu online;

方法二:利用操作系统拷贝数据文件且rename表空间的数据文件

alter tablespace chenmu offline normal;
cp /u01/app/oracle/oradata/CHENMU/chenmu.dbf /rmanbak/chenmu.dbf;  //操作系统层拷贝文件
alter tablespace chenmu rename datafile '/u01/app/oracle/oradata/CHENMU/chenmu.dbf' to '/rmanbak/chenmu.dbf';  //rename等价于set newname + switch
recover datafile 5;
alter tablespace chenmu online;

方法三:alter database move datafile方法,在19c版本以后

ho rm /u01/app/oracle/oradata/CHENMU/chenmu.dbf;  //在移动之前,先把目标路径存在的文件删除
alter database move datafile '/rmanbak/chenmu.dbf' to '/u01/app/oracle/oradata/CHENMU/chenmu.dbf';

5、临时文件恢复(使用周期基于事务)

(1)、自动重建(当临时文件丢失或损坏时,重启数据库后临时文件会自动创建)

cd /u01/app/oracle/oradata/CHENMU/;
mv temp01.dbf temp01.dbf.bak;
shutdown immediate;
startup;

(2)、手动创建

rm -rf temp*;  //删除两个temp文件
alter tablespace temp add tempfile '/u01/app/oracle/oradata/CHENMU/temp02.dbf' SIZE 100M AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;  //增加临时文件temp02.dbf
alter tablespace temp drop tempfile '/u01/app/oracle/oradata/CHENMU/temp01.dbf';  //删除旧的临时文件temp01.dbf

 

四、不完全恢复

基于时间点的恢复(保证服务器的时间点准确):PITR,使用场景是①恢复truncate table语句后丢失的数据表数据块发生损坏取消一部分的批处理作业或DML语句的操作恢复被删除的表空间。

1、DBPITR级别恢复(这里以scott用户做实验,创建默认表空间是scott)

(1)、创建用户和表空间,并创建表emp,这个表来源是hr用户的employees表

//创建scott表空间
CREATE TABLESPACE "SCOTT" DATAFILE
'/u01/app/oracle/oradata/CHENMU/scott.dbf' SIZE 9175040
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;
//创建scott用户
create user scott identified by tiger default tablespace scott;
grant connect,resource,dba,unlimited tablespace to scott;  //给他授权dba权限,这样就可以查询hr用户的表
conn scott/tiger;
create table emp as select * from hr.employees;
select count(*) from emp;

(2)、备份数据库并模拟表损坏,然后进行全库级别的不完全恢复(在sys用户环境)

backup database;  //备份数据库,就是恢复之前要有一份备份
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;  //确认恢复的时间点,2022-12-14 17:10:51
select current_scn from v$database;  //确认恢复的scn号, 21493074
select count(*) from scott.emp;
truncate table scott.emp;  //模拟误删除表
select count(*) from scott.emp;  //数据被清空了
//进入rman进行基于scn和时间点的不完全恢复,这里进行的是全库恢复
shutdown immediate;
startup nomount;
restore controlfile from autobackup;  //不要忘记这一步
alter database mount;
RUN
{
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
set until scn  21493074;  //如果是基于时间点恢复就写set until time '2022-12-14 17:10:51'
restore database;
recover database;
}
//验证数据,read only状态数据库的scn不会改变
alter database open read only;
select count(*) from scott.emp;  //数据完全恢复
select file#,checkpoint_change# from v$datafile;  //查看数据文件的scn号
shutdown immediate;
startup mount;
alter database open resetlogs;

2、TBSPITR级别恢复()

步骤:①创建并开启辅助实例,连接;

           ②将目标数据库需要恢复的表置为offline状态;

           ③在辅助实例restore在目标恢复时间以前的控制文件;

           ④在辅助实例restore需要恢复的数据文件;

           ⑤在辅助实例中将数据文件恢复至目标时间;

           ⑥以resetlogs方式打开辅助实例;

           ⑦导出辅助实例中已恢复的表空间的元数据;

           ⑧关闭辅助实例;

           ⑨在目标库中导入已恢复表空间的元数据;删除辅助库的文件

上面步骤就是说新建一个内容和目标库一样的辅助实例,然后在辅助实例中进行还原恢复,再把已修复的表导出,然后导入目标库。但是因为不完全恢复后,在目标时间之后建立的对象可能就不存在,所以需要查出这些对象,将这些对象导出之后再导入。查询不完全恢复后可能丢失的对象语句如下(因为没有查到可能丢失的对象就没有导出导入步骤):

select owner,name,tablespace_name,to_char(creation_time, 'yyyy-mm-dd hh24:mi:ss')
from TS_PITR_OBJECTS_TO_BE_DROPPED
where tablespace_name in ('CHENMU')
and creation_time >to_date('2022-12-15 08:20:08', 'yyyy-mm-dd hh24:mi:ss')
order by tablespace_name, creation_time;

还原恢复步骤

backup database;  //备份整库
select sysdate from dual;  //确认恢复的时间点,2022-12-15 08:20:08
conn scott/tiger;
truncate table emp;  //模拟删除表
//进入rman恢复
rman target /;
recover tablespace scott until time "to_date('2022-12-15 08:20:08','yyyy-mm-dd hh24:mi:ss')" auxiliary destination '/rmanbak';
backup tablespace scott format '/rmanbak/%T_%N';  //再一次备份恢复的表空间
alter tablespace scott online;  //将表空间设置成online状态
select count(*) from emp;  //验证结果

3、TPITR级别恢复(12c以后,允许将一个或多个表或表分区恢复到指定的时间点)

限制条件是不能恢复属于SYS模式的表和表分区;不能恢复SYSTEM和SYSAUX表空间中的表和表分区;无法恢复备库上的表和表空间;带有命名的NOT NULL约束的表不能使用REMAP选项恢复。目标库必须是read-write模式;必须是归档模式;必须包含要恢复表的备份集。

select dbid,log_mode,open_mode,current_scn from v$database;  //验证前提条件
backup database;  //备份数据库
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;  //查看需要恢复到的时间点,2022-12-15 08:38:46
drop table scott.emp purge;  //模拟删除表
mkdir /rmanbak/recover;  //建立目录
 mkdir /rmanbak/dumpfiles;
recover table scott.emp until time "to_date('2022-12-15 08:38:46','yyyy-mm-dd hh24:mi:ss')"
auxiliary destination '/rmanbak/recover'
datapump destination '/rmanbak/dumpfiles'
dump file 'emp.dmp'
notableimport;  
//notableimport表示恢复时不自动导入到数据库中,先生成dmp文件,后面可以手动导入。   
create or replace directory rman_dir as '/rmanbak/dumpfiles';
impdp scott/tiger dumpfile=rman_dir:emp.dmp logfile=imp_rman.log;  //手动导入
conn scott/tiger;
select count(*) from emp;  //验证数据

 

五、在线重做日志文件管理(在做这些操作之前先备份数据库)

1、日志文件损坏时不同状态的处理情况(分为归档和非归档模式)

select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;

(1)、inactive redo 损坏后恢复:

dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo01.log bs=512 count=10;  //操作命令执行,模拟损坏redo,count是块数,一般块大小是512
dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo1a.log bs=512 count=10;
shutdown abort; 
starup;  //会出现错误
conn / as sysdba;
startup mount;
alter database clear logfile group 1;
alter database drop logfile group 1; 
alter database add logfile group 1 ('/u01/app/oracle/oradata/CHENMU/redo01.log','/u01/app/oracle/oradata/CHENMU/redo1a.log') size 200m reuse;

(2)active redo 恢复(归档模式,这里指包含未提交事务的情况,没有包含事务的恢复步骤和inactive是一样的):未测试成功

conn scott/tiger;
create table test(a varchar(10));
insert into test values('chenmu');  //模拟存在未提交的事务
alter system switch logfile;  //切换日志,current变为active,且包含事务,模拟active状态的redo损坏
dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo01.log bs=512 count=10;
dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo1a.log bs=512 count=10;

//在参数文件中修改参数,允许在日志文件损坏的情况下打开数据库
create pfile='/tmp/pfile.ora' from spfile;
ho vi /tmp/pfile.ora;
*._allow_resetlogs_corruption=TRUE;  //修改
*._allow_error_simulation=true;  //添加
shutdown abort;
startup mount pfile='/tmp/pfile.ora';
recover database until cancel;  //选择auto
alter database open resetlogs;

(3)current redo恢复(归档模式,有还未提交的事务):未测试成功

conn scott/tiger;
create table cur(a varchar(10));
insert into cur values('chenmu');
dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo01.log bs=512 count=10;  //模拟损坏current redo
dd if=/dev/null of=/u01/app/oracle/oradata/CHENMU/redo1a.log bs=512 count=10;
//在参数文件中修改参数
create pfile='/tmp/cur_pfile.ora' from spfile;
ho vi /tmp/cur_pfile.ora;
*._allow_resetlogs_corruption=true
*._allow_error_simulation=true
shutdown immediate;
conn / as sysdba;
startup mount pfile='/tmp/cur_pfile.ora';
recover database until cancel;
alter database open resetlogs;

2、日志组增加成员并多路存放(防止当个成员损坏而发生数据丢失的风险,当一个数据文件丢失或损坏不影响另一个成员的正常使用)

select group#,members,a.status,member from v$log a join v$logfile using(group#);
//查看日志组成员状态信息,current表示正在使用该组日志。如果状态是current或active不允许被删除。

默认是一个成员,当前正在使用的是redo3,实现多路复用可以放在不同路径下

alter database add logfile member '/u01/app/oracle/fast_recovery_area/CHENMU/redo1a.log' to group 1,'/u01/app/oracle/fast_recovery_area/CHENMU/redo2a.log' to group 2,'/u01/app/oracle/fast_recovery_area/CHENMU/redo3a.log' to group 3 //向每个日志组添加成员且分开存放
alter system switch logfile;  //切换日志组
alter system switch logfile current;  //等归档完再切换,归档是对日志文件的备份
archive log list;   //查看归档模式,Database log mode=Archive Mode说明是归档模式
alter database archivelog;  //将数据库设置为归档模式,但是会出现database must be mounted in this instance and not open in any instance,说明数据库需要处于mount,但不是open状态
shutdown;  //关闭数据库
startup mount;  //启动到mount阶段
alter database archivelog; 
show parameter db_recovery;   //查看数据库备用路径,方便恢复

 

六、数据块管理(修复前提是目标库必须处于归档模式;备份集是全备或0级;RMAN仅能做redo前滚,不能用1级备份恢复)

产生坏块原因:磁盘故障、异常断电、数据库软件缺陷。坏块类别:物理坏块(不正确的校验和、块中内容全为0、块头与块尾不匹配)、逻辑坏块(逻辑块的值没有按照顺序排列、数据块的行被不存在的事务锁住)、interblock corruption(块之间损坏,不是块内部,都是逻辑损坏)、intrablock corruption(块内部发生的损坏,可能是物理坏块也可能是逻辑坏块)。

1、检测坏块方法(oracle会自动检测物理坏块,但不会检测逻辑坏块,需要在backup、validate后面加上check logical)

(1)validate(只检测intrablock corruption)

validate database;  //可以检测物理坏块
backup validate check logical database;  //检测逻辑坏块
select * from v$database_block_corruption;  //查看发现的损坏,只记录intrablock类型的坏块,所有类型的坏块信息也会保存在adr仓库日志文件里

(2)dbverify工具(即可以检测interblock corruption也可以检测intrablock corruption)

dbv file=/u01/app/oracle/oradata/CHENMU/scott.dbf blocksize=8192;  //操作命令层面执行

(3)analyze命令(检测interblock corruption)

analyze table employees;

2、模拟破坏数据库块

backup database;  //在破坏数据库时要先备份数据库
select segment_name,tablespace_name,header_block,blocks from dba_segments where tablespace_name='SCOTT';  //查看scott表块范围,模拟损坏其中一个块
ho dd if=/dev/zero of=/u01/app/oracle/oradata/CHENMU/scott.dbf bs=8192 conv=notrunc seek=390 count=1;  //在操作系统层面模拟丢失,seek表示模拟损坏哪个块

3、恢复数据坏块(如果是索引块可以直接重建,如果是其他类型块需要restore)

recover datafile 11 block 390;   //修复单块
recover datafile 11 block 390 datafile 11 block 391;  //修复多块
recover corruption list;  //修复全部列出的坏块

 

posted @ 2022-05-23 09:21  微风徐徐$  阅读(2078)  评论(0编辑  收藏  举报