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; //修复全部列出的坏块
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示