Oracle总复盘(3)—— 高级管理
一、RMAN概述
RMAN属于物理备份,区别于逻辑备份(数据泵)。RMAN可以做到基于时间点的恢复,恢复到指定的时刻,而逻辑备份无法实现。
RMAN中的备份信息,都是从控制文件中读取的。
归档模式下,RMAN既可以冷备,也可以热备;非归档模式下,RMAN只能冷备。
二、在归档和非归档模式下备份数据库,一致性备份与非一致性备份的概念
1、一致性备份
数据库一致性备份是指关闭了数据库后备份所有数据文件和控制文件的方法。
当使用SHUTDOWN 命令正常关闭了数据库之后,所有数据库文件的当前SCN 值完全一致,所以关闭后的数据库备份被称为数据库一致性备份或者冷备份。
数据库一致性备份既适用于ARCHIVELOG 也适用于NOARCHIVELOG
2、非一致性备份
数据库非一致性备份是指在OPEN 状态下备份数据库所有数据文件和控制文件的方法。
因为在OPEN 状态下数据库内容随时都会改变,从而导致不同数据库文件的当前SCN值完全不同,所以打开时的数据库备份被称为数据库非一致性备份。进行数据库一致性备份会中断业务操作。而数据库非一致性备份不会影响业务操作,因此建议你在实际环境中应该使用数据库非一致性备份。
数据库非一致性备份只适用于ARCHIVELOG模式
三、list和report命令
3.1 常用的list命令
list backup或list backupset # 列出所有备份信息
list backupset of datafile 1 # 列出包含数据文件datafile 1的备份信息
list backupset of tablespace users # 列出包含users表空间的备份信息
list backupset 8 # 单独查看编号为8的备份集;
list backup tag 'xxxxxx' # 查看标签为xxx的备份集信息
list archivelog all # 查看归档备份信息
3.2 常用的report命令
report命令用于判断数据库的当前可恢复状态和提供数据库备份的特定信息。
- 查看数据库的组成结构——report schema
- 报告需要备份的文件——report need backup
- 在那些文件上执行了不可恢复的操作——report unrecoverable
- 查看三天未备份的文件:report need backup days 3;
- 查看备份次数少于2次的文件:report need backup redundancy 2;
- 列出需要备份的表空间:report need backup tablespace;
- 列出system表空间需要备份的文件:report need backup tablespace system;
- 列出违反保留策略的备份集:report obsolete; (使用show all查看保留策略)
四、backup命令与备份示例
4.0 备份集与备份片
备份集是Oracle默认的备份类型。把数据文件中已经使用过的数据块备份到一个或多个文件中,这样的文件叫做“备份片”,所有备份出来的文件组合成为“备份集”。
备份集与备份片的关系类似于表空间与数据文件的关系,备份集是一个逻辑概念,将备份片(物理文件)逻辑地组织在一起。
4.1 冷备
冷备份可以是shutdown状态下基于操作系统的cp等命令的拷贝备份,也可以是处于mount状态下的基于rman工具的备份。
1. 停机cp
1.获取数据文件路径:select FILE_NAME from dba_data_files; 或 select NAME from v$dbfile;
2.获取控制文件路径:select NAME from v$controlfile
3.查询日志文件路径:select MEMBER from v$logfile;
4.查询参数文件路径:show parameter spfile;
5.shutdown immediate;
6.复制四类文件即备份成功。
2.RMAN冷备(非归档模式下的备份)
① 确定当前模式:非归档
select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
② 进入RMAN备份数据库
rman target /
backup database
报错:cannot backup or copy active file in NOARCHIVELOG mode;无法在非归档模式下备份数据库;
此时数据库处于open状态,需要将数据库置为mount状态;因为在非归档模式下,RMAN只能进行冷备。
shutdown immediate;
startup mount;
③ 备份到指定的位置
backup tag 'full_db_bk' format '/data/backup/db_%U' database;
4.2 热备(归档模式下备份数据库)
全库备份:open状态下可以直接执行backup database 命令
backup format '/data/backup/hot_db_bk' database;
执行全库备份+归档日志文件备份
backup format '/data/backup/hot_db_bk_%U' database plus archivelog;
遇到问题:expected archived log not found, loss of archived log compromises recoverability
原因:之前手动删除过归档日志文件,但是controlfile中还记录着归档日志信息,oracle还会去找这些归档日志文件,因此就会报错。
解决方法:使控制文件中的归档日志信息和实际物理文件信息保持一致;
1. crosscheck archivelog all; 此命令用来检查控制文件和实际物理文件信息的差异。
2. delete expired archivelog all; 删除无效的归档日志信息,使检查控制文件和实际物理文件信息同步。
4.3 备份参数文件
backup spfile;
4.4 备份控制文件
backup current controlfile;
自动备份控制文件:自动备份打开时,会在把数据文件,日志文件,控制文件,spfile等等都备份完了后,再自动备份一遍当前的控制文件。
1. 开启自动备份ctl文件
CONFIGURE CONTROLFILE AUTOBACKUP ON;
2. 设置自动备份的存储位置
configure controlfile autobackup format for device type disk to '/u01/backup/ctl_%F';
3. 清空设置
configure controlfile autobackup format for device type disk clear;
4.5 备份归档日志
backup archivelog all;
backup archivelog all delete all input; -- 会在完成备份后自动删除归档目录中已备份的归档日志(即会产生一个归档日志的备份文件,但是归档日志会被删除)
4.6 使用映像副本
镜像副本与手工OS Copy备份数据文件类似,是一个数据文件生成一个镜像副本文件(数据库数据文件、归档重做日志或者控制文件的精确副本),不同的是这个过程由RMAN完成,RMAN复制的时候也是一个数据块一个数据块(Oacle block)的复制,同时默认检测数据块是否出现物理损坏(默认不会进行逻辑损坏检查,需要手工启动),且不需要将表空间置为begin backup状态,和备份集类型不同在于生成的镜像副本中包含使用过的数据块,也包含从来没有用过的数据块 。
使用印象副本备份库 :backup as copy database;
备份单独的数据文件到指定路径: backup as copy datafile 4 format '/u01/backup/user01.bak'
五、手工注册备份集和归档日志
由于备份文件和归档日志有可能是从其他机器中拷贝过来的,在本机的控制文件中并没有它的备份信息,此时就需要人工注册备份集和归档文件。核心就是将该备份文件的路径添加到控制文件中,让RMAN可以读取到。
- 注册单个备份片(即单个备份文件)
catalog backup piece '/tmp/o1_ckgx_.bkp';
- 如果tmp目录下有多个备份文件,可以直接注册整个目录
catalog start with '/tmp/';
- 注册归档日志
同2:catalog start with '/tmp/'; 检验:list archivelog all;
六、crosscheck命令、validate命令、delete命令
6.1 crosscheck交叉检查
检查备份集是否有效;用于核对备份文件,以确保RMAN资料库与备份文件保持同步。
- 执行检查: crosscheck backup;
- 删除已过期的备份文件:如果删除了某个备份文件,执行交叉检查会显示expired已过期; 执行 delete expired backup; 删除那些本来RMAN以为存在,但是实际上在磁盘或者磁带上已经被删除了的信息,删除的只是RMAN资料库中的记录;不删除任何文件,只更新RMAN的存储库。
- 删除违反备份保留策略定义的备份数据,同时也更新RMAN资料库以及控制文件: delete obsolete
6.2 使用validate验证数据库
检查是否有损坏的块和丢失的文件,验证物理坏块和逻辑坏块,验证备份集是否可以用来做恢复等;
validate验证有三种方式:
- validate 验证物理文件是否有损坏
validate database include current controlfile plus archivelog; --综合验证
validate database
validate tablespace users;
validate datafile 1;
validate archivelog all; -- 验证归档日志
validate backupset 56; -- 验证备份集
2. backup validate 验证对象是否可以备份,但不真的备份
有时,我们仅仅希望验证一下数据文件是否可以备份,而不想进行真正的备份,这是我们就可以使用validate命令了,例如 backup validate database
更好的话,可以在物理校验的基础上,进行逻辑校验: backup validate check logical database;
3. restore validate:恢复备份文件是否可以正确恢复
1、 验证数据备份
restore validate database;
2、 验证控制文件备份
restore validate controlfile;
3、 验证参数文件备份
restore validate spfile;
4、验证单个数据文件
restore validate datafile 1;
6.3 delete命令
1. 删除备份集
delete backup;
2. 删除指定备份集
delete backupset 60;
3. 删除违反保留策略的备份集;
delete obsolete;
4.删除归档备份文件
delete archivelog all;
七、Config配置RMAN
- show all;查看所有配置策略
RMAN> show all;
(1) 冗余策略
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
(2) 备份优化
CONFIGURE BACKUP OPTIMIZATION OFF; # default
(3) 修改默认设备类型
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
(4) 设置控制文件自动备份
CONFIGURE CONTROLFILE AUTOBACKUP ON;
(5) 设置控制文件自动备份的存储路径和格式
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/ctl_%F';
(6) 设置并行数(通道数)和备份类型是备份集
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
(7) 设置数据文件的备份副本
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
(8) 设置归档日志的备份副本
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
(9) 配置备份集的大小,一般不使用这个默认值,都是配置备份片的大小
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
(10) 配置加密备份集,能够具体到某个表空间、加密算法
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
(11) 压缩算法
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
(12) 指定归档文件何时可以被删除的策略
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
(13) 配置控制文件的快照文件的存放路径和文件名
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_orcl.f'; # default
2. 修改配置后,所发生的配置变化都会记录在v$rman_configuration动态视图中。
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
SQL > select * from v$rman_configuration;
CONF# NAME VALUE
-------------------------------------------------------------------------------
1 CONTROLFILE AUTOBACKUP ON
2 DEFAULT DEVICE TYPE TO DISK
3. 恢复默认配置
configure default device type clear;
4. 设置备份的类型(备份集、映像副本)
configure device type disk backup type to copy; --改为映像副本
configure device type disk backup type to compressed backupset; -- 改为压缩的备份集
5. 配置并行
configure device type disk backup type to compressed backupset parallelism 2;
6. 配置优化
configure backup optimization on;
7. run块
run{
allocate channel c1 device type disk;
backup tablespace users;
release c1;
}
8. 配置控制文件自动备份的位置
configure controlfile autobackup format for device type disk to '/u01/backup/ctrl_%F';
9. 配置备份集、备份片的maxsize;
备份集只是个逻辑上的概念,一个备份里可能包含多个备份片。
RMAN> configure maxsetsize to 500m; -- 设置备份集maxsize
RMAN> report schema;
File Size(MB) Tablespace RB segs Datafile Name
---- -------- ------------------ ------- ------------------------
1 790 SYSTEM *** /u01/app/oracle/oradata/orcl/system01.dbf --system表空间790M
RMAN> backup tablespace system;
...
RMAN-06183: datafile or datafile copy /u01/app/oracle/oradata/orcl/system01.dbf (file number 1) larger than MAXSETSIZE -- 报错提示过大
RMAN> configure channel device type disk maxpiecesize 500m; -- 设置备份片的maxsize
RMAN> backup tablespace system;
[oracle@test150 2021_12_07]$ ll -h
total 684M
-rw-r-----. 1 oracle oinstall 500M Dec 7 16:54 o1_mf_nnndf_TAG20211207T165444_jty8bnoz_.bkp
-rw-r-----. 1 oracle oinstall 184M Dec 7 16:54 o1_mf_nnndf_TAG20211207T165444_jty8bqp2_.bkp
10. 双工备份集:备份的时候会产生两个一摸一样的备份集
RMAN> configure datafile backup copies for device type disk to 2;
RMAN> backup tablespace example;
......
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 12/07/2021 17:19:42
ORA-19806: cannot make duplex backups in recovery area
报错:双重备份不能存储在快速恢复区中,所以需要format指定路径
RMAN> backup tablespace example format '/u01/backup/example_%U.bkp';
Starting backup at 07-DEC-21
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/u01/app/oracle/oradata/orcl/example01.dbf
channel ORA_DISK_1: starting piece 1 at 07-DEC-21
channel ORA_DISK_1: finished piece 1 at 07-DEC-21 with 2 copies and tag TAG20211207T172746
piece handle=/u01/backup/example_3d0g570i_1_1.bkp comment=NONE
piece handle=/u01/backup/example_3d0g570i_1_2.bkp comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 07-DEC-21
Starting Control File and SPFILE Autobackup at 07-DEC-21
piece handle=/u01/backup/ctl_c-1611896356-20211207-01 comment=NONE
Finished Control File and SPFILE Autobackup at 07-DEC-21
11.备份整个数据库时排除部分表空间
configure exclude for tablespace sysaux;
backup database; -- 默认就排除了sysaux表空间;
backup database noexclude; -- 有个别时候就不想排除掉这个表空间时,可以执行该条命令
configure exclude for tablespace sysaux clear; --清除该配置
该命令可以多次执行,排除多个,show all可以查看;
12. 压缩
-- 设置压缩级别
configure compression algorithm 'BASIC|HIGH|MEDIUM|LOW'
-- 配置压缩开启
configure device type disk backup type to compressed backupset;
13. 备份集加密
Oracle所支持的备份集加密算法有AES128、AES192、AES256; 加密属于CPU密集型操作,可能会对备份的性能产生影响。
① 口令加密模式
-- 开启加密并备份
RMAN> set encryption ON identified by "123456" only;
RMAN> backup datafile 4;
-- 删除4号文件user.dbf
RMAN> shutdown immediate;
rm -f user01.dbf
-- 恢复
RMAN> startup mount;
RMAN> set decryption identified by "123456";
RMAN> restore datafile 4;
RMAN> recover datafile 4;
RMAN> alter database open;
② 透明加密模式wallet
在本机上设置一个钱包,钱包打开的情况下,备份和还原的时候都不再需要设置密码;但仅限在本机还原。
--a. 查询Oracle默认的wallet目录
SQL> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
---------------------------------------------------------------
file /u01/app/oracle/admin/orcl/wallet CLOSED
-- b. 创建wallet目录
mkdir -p /u01/app/oracle/admin/orcl/wallet
-- c. 设置wallet密钥
RMAN> alter system set encryption key identified by "123456";
-- d. 打开钱包(需要密码才能打开钱包)
RMAN> alter system set wallet open identified by '123456'
RMAN> configure encryption for database on;
-- e. 关闭钱包
RMAN> alter system set wallet close identified by "123456";
恢复时,如果钱包被关闭了,那么会出现报错: ORA-19913: unable to decrypt backup ORA-28365: wallet is not open
解决:打开钱包 RMAN> sql 'alter system set wallet open identified by "123456"';
八、执行数据库恢复
8.1 完全恢复
如何在丢失一个或多个数据文件后使用RMAN使数据库恢复正常运行。
实验过程:
- 全库备份
RMAN> backup database format '/u01/backup/full_db_%U.bkp';
2. 拟删除数据文件system、sysaux、users的数据文件
[oracle@test150 orcl]$ rm -f users01.dbf system01.dbf sysaux01.dbf
3. 关闭数据库
RMAN> shutdown abort;
4. 准备执行恢复,重新启动数据库到mount状态; 由于只删除了部分文件,无需整个restore database;( restore:恢复备份文件。 recover:应用归档日志和redo日志)
RMAN> startup mount;
RMAN> restore datafile 1;
RMAN> recover datafile 1;
RMAN> restore datafile 2;
RMAN> recover datafile 2;
RMAN> restore datafile 4;
RMAN> recover datafile 4;
5. 启动数据库
alter database open;
6. 如果数据文件原始路径满了,恢复的时候不想恢复到原目录下,可以执行如下命令:
run{
set newname for datafile 1 to '/newpath/system01.dbf';
set newname for datafile 2 to '/newpath/users01.dbf';
restore datafile 1;
restore datafile 2;
switch datafile all;
recover database;
}
8.2 不完全恢复
场景:① 执行备份 → ② scott.stu插入“小明”记录 → ③ scott.stu插入“小红”记录 → ④ 误操作整表删除
需求:恢复到小明记录。(恢复到某个时间点)
实践过程:
1. RMAN> backup database; --2021-12-09 14:47:02
2. SQL> insert into scott.stu values('s011','小明',23,'男'); -- 2021-12-09 15:09:00
3. SQL> insert into scott.stu values('s012','小红',23,'女'); -- 2021-12-09 15:11:00
4. SQL> delete from scott.stu; -- 2021-12-09 15:22:00
5. 基于时间的不完全恢复
run{
set until time "to_date('2021-12-09 15:09:00','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
}
6. 打开数据库
alter database open;
出现报错:ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
原因:数据库启动的时候,会去检查SCN系统变动码.如果发现不一致,那么就意味着有不一致的LOG需要处理。
因为执行了不完全恢复,相对就有一部分的日志差异(比如小红的记录虽然在日志里有,但是恢复到15:09的时候并没有小红的记录);
alter database open RESETLOGS;
7.重新给数据库做备份
backup database;
(恢复后的数据中,包含小明的记录,然而原备份并不包含该记录,所以为了数据完整,需要重新做一次数据库备份)
九、使用Data Recovery Advisor恢复数据库
Data Recovery Advisor是一款oracle数据库工具,自动故障诊断,提供适当的恢复建议与修复;
上述两种恢复情形,第一种是因为故障丢失文件,可以使用恢复指导;第二种并不是故障,所以不用恢复指导。
第一种情景中,已经知道了故障点——某某文件被误删了,那如果不知道哪里出现故障了呢?就可以使用恢复指导。
实验过程:
- 备份数据库
backup database;
2. 某人误删除了一些文件,但管理员此时并不知道
rm -f xxx.dbf
3. 准备进行恢复,先启动到mount阶段
shutdown abort;
startup mount;
4. 查看是否有错误信息
* 该命令需要触发,可以alter database open就会触发,即可在该命令下查看到错误信息;
RMAN> list failure;
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------------- -------
4282 HIGH OPEN 2021-12-09 16:20:25 One or more non-system datafiles are missing
5. 执行恢复指导:会生成一个手工恢复建议和一个自动脚本恢复建议
RMAN> advise failure;
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------------- -------
4282 HIGH OPEN 2021-12-09 16:20:25 One or more non-system datafiles are missing
analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=68 device type=DISK
analyzing automatic repair options complete
Mandatory Manual Actions
========================
no manual actions available
Optional Manual Actions -- 手工恢复建议
=======================
1. If file /u01/app/oracle/oradata/orcl/users01.dbf was unintentionally renamed or moved, restore it
Automated Repair Options -- 脚本自动恢复建议
========================
Option Repair Description
------ ------------------
1 Restore and recover datafile 4
Strategy: The repair includes complete media recovery with no data loss
Repair script: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_3963228765.hm
6. 可以使用repair failure preview查看恢复脚本内容
RMAN> repair failure preview;
Strategy: The repair includes complete media recovery with no data loss
Repair script: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_3963228765.hm
contents of repair script:
# restore and recover datafile
restore datafile 4;
recover datafile 4;
sql 'alter database datafile 4 online';
7. 执行恢复脚本
RMAN> repair failure;
十、增量备份
分类:差异增量备份、累积增量备份
10.1 差异增量备份
自上一次同级别的差异备份或者是上一次更高级别的备份完成之后的数据库发生改变的数据块。
如图,全备是0级别的,每周的差异增备是1级别的。
增量备份必须要基于全量备份文件。
与普通的全量备份不同,backup database备份文件不能作为增量策略的一部分,而 backup incremental level 0 database; 才可以作为增量备份的基础。
-
归档模式,可以在open状态下增备;非归档模式下,需要在mount状态下增量。
-
命令
backup incremental level 0 database format '/u01/backup/level_0_%U_%M_%D'; -- 0级全备
backup incremental level 1 database format '/u01/backup/level_1_%U_%M_%D'; -- 1级增倍
10.2 累积增量备份
差异增量备份,会备份自上次同级或低级差异增量备份以来所有发生变化的数据块。
累积增量备份,会备份自上次0级备份以来发生变化的数据块。也就是他们的差异主要在于起点不同。 简而言之:差异增量备份是以上一次的备份文件为基准的。而累积增量备份是以0级备份文件为基准。
命令:
backup incremental level 1 cumulative database
十一、基于增量备份的数据恢复
- 备份策略:每周六全备,周日到周五差异增倍;
-- 周六
RMAN> backup incremental level 0 format '/u01/backup/full_%U' database;
-- 周日-周五
RMAN> backup incremental level 1 format '/u01/backup/level1_%Y_%M_%D_%U.bak' database;
2. 模拟数据损坏
rm -f xxx.dbf
3. 数据恢复
第一步:mount状态下 restore database;恢复全备。
第二步:应用增量备份集、归档文件和日志文件——recover database;
注意,recover时,多个增备文件都会全部应用;如果指定还原到星期日时,可以将星期一及之后的增备文件先移到另一个目录下,或者也可以执行不完全恢复。
run{
set until time "to_date('2021/12/13 18:00:00','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
}
alter database open resetlogs;
4. 总结
十二、使用catalog管理备份信息
使用 rman target / 或者 rman target / nocatalog 进入rman执行备份,备份信息都存放在各数据库的控制文件中。
catalog恢复目录——其实就是个专门存储备份信息的数据库,实现了集中管理。
- catalog主机上创建恢复目录的使用用户
SQL> create user rco identified by rco quota unlimited on users;
SQL> grant connect,resource,recovery_catalog_owner to rco;
2. 客户端的rman连接并创建恢复目录
rman target / catalog rco/rco@172.26.128.151:1521/orclcreate catalog;
3. 客户端在恢复目录中注册数据库
register database;
4. 当通过rman target / 方式备份后,备份信息存在本地控制文件中,可以手工同步,将控制文件中的备份信息转移到catalog中;
resync catalog;
十三、手工制造坏块(用于实验)
- 创建测试表和测试数据
begin
for i in 1..5000 loop
insert into t1(name) values('loto');
end loop;
commit;
end;
/
2. 查询该表中的数据所涉及的块号
select distinct dbms_rowid.rowid_relative_fno(rowid) "文件号",dbms_rowid.rowid_block_number(rowid) "块号" from loto.t1;
文件号 块号
---------- ----------
4 13879
4 13876
4 13875
4 13884
4 13881
4 13882
4 13883
4 13877
4 13878
9 rows selected.
3. 模拟坏块
dd if=users01.dbf of=test.dbf bs=8192 count=1 skip=13881 conv=notrunc
dd if=/dev/zero of=users01.dbf bs=8192 count=1 seek=13881 conv=notrunc
4. 查询坏块信息
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE
---------- ---------- ---------- ------------------ ---------------
4 13881 1 0 ALL ZERO
十四、块屏蔽与块恢复
14.1 块恢复
可以使用块恢复来恢复一个或者多个损坏文件块。
优点:
- 降低MTTR平均故障恢复时间,只需要恢复损坏的块。
- 恢复期间,数据文件他是联机的状态。
- 如果没有块恢复技术,一个块故障,需要将整个数据文件离线,执行恢复后online。
前提条件:必须要有RMAN备份!
方法一:查询到损坏的块号,执行recover恢复
RMAN> recover datafile 4 block 13881;
方法二:通过恢复指导recovery advisor进行恢复
list failure
advise failure
repair failure preview
repair failure
14.2 块屏蔽
没有备份的话,可以屏蔽坏块,其他块不影响。
SQL> select skip_corrupt from dba_tables where table_name='T1' and OWNER='LOTO';
SKIP_CORRUPT
------------
DISABLED
SQL> exec dbms_repair.skip_corrupt_blocks('LOTO','T1');
PL/SQL procedure successfully completed
SQL> select skip_corrupt from dba_tables where table_name='T1' and OWNER='LOTO';
SKIP_CORRUPT
------------
ENABLED
十五、使用dbms_bakcup_restore包
使用场景: 控制文件损坏、数据文件也损坏;需要通过备份集进行恢复;首先通过spfile参数文件进入nomount状态,然后恢复控制文件,再进入mount状态,恢复数据文件。
而dbms_backup_restore包可以在数据库nomount下使用,用于从RMAN备份集中读取各类文件。
15.1 nomount状态下恢复控制文件
将原本的控制文件删除,nomount状态下执行如下存储过程,可以恢复备份的控制文件到指定目录下。
declare deviceType varchar2(256); done boolean; begin devicetype:=dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1'); dbms_backup_restore.restoresetDataFile; dbms_backup_restore.restoreControlFileto('/u01/app/oracle/oradata/orcl/control01.ctl'); dbms_backup_restore.restoreBackupPiece('/u01/app/oracle/fast_recovery_area/ORCL/backupset/2021_12_13/o1_mf_ncnnf_TAG20211213T151446_jvfwq7od_.bkp',done=>done); dbms_backup_restore.deviceDeallocate; end; /
15.2 nomount状态下恢复数据文件
declare deviceType varchar2(256); done boolean; begin devicetype:=dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1'); dbms_backup_restore.restoresetDataFile; dbms_backup_restore.restoreDataFileto(dfnumber=>1,toname=>'/u01/app/oracle/oradata/orcl/system01.dbf'); dbms_backup_restore.restoreDataFileto(dfnumber=>4,toname=>'/u01/app/oracle/oradata/orcl/users01.dbf'); dbms_backup_restore.restoreBackupPiece('/u01/backup/full_4v0gkoqq_1_1.bak',done=>done); dbms_backup_restore.deviceDeallocate; end; /
十六、RMAN表级别恢复(12c新特性)
对于用户DDL、DML等误操作引起的数据丢失,一般都使用基于数据库时间点的不完全恢复 或者 基于表空间时间点恢(TSPITR)进行数据恢复。
闪回也可以实现恢复的功能,但是truncate操作是无法闪回的。
12c rman新的特性——基于表的时间点恢复。更加方便。将一个或多个表恢复到指定的时间点,而不影响其他对象。
原理:(基于数据库时间点的不完全恢复+数据泵)
- 建立一个辅助的实例
- 在辅助实例上做全库的恢复
- 通过datapump工具导出,导入
前提:已经有RMAN备份
场景:Time1: 2018-05-20 15:53:29 有数据
Time2: truncate清空表记录
rman target /
recover table fx.fxtbs
until time "to_date('2018-05-20 15:53:29','yyyy-mm-dd hh24:mi:ss')"
auxiliary destination '/u01/tsbak'
remap table fx.fxtbs:fx.fstbs_new
datapump destination '/tmp'
dumpfile 'exp.dat'
十七、自动全备脚本
- rman备份策略定义
包含内容:
① 设置控制文件自动备份,设置备份位置
② 删除七天之前的备份
③ 进行归档(尽可能的备份当下的日志)
④ 备份归档日志,完毕后删除原日志文件,节省空间。
(rman策略可执行rman target / cmdfile fullback.rman
校验)
vim /u01/exec/fullback.rman
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/backup/%d-ctrl-%F';
run{
delete noprompt backupset completed before 'sysdate-7';
sql 'alter system archive log current';
backup format '/u01/backup/%d_full_%U_%M_%D' database;
backup archivelog all format '/u01/archbak/%d_arch_%U_%M_%D' delete all input;
}
2. 编写sh脚本
[oracle@test150 exec]$ cat fullback.sh
#!/bin/bash
RMANscript="/u01/exec/fullback.rman"
LOGFILE="/u01/exec/fullback.log"
echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * 全备 ———— "`(date +"%Y-%m-%d")`" * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" >> $LOGFILE
echo " 备份开始时间:$(date +"%H:%M:%S")" >> $LOGFILE
rman target / cmdfile $RMANscript log $LOGFILE append
if [ $? -eq 0 ]; then
echo -e " \033[32m 【备份成功】 \033[0m" >> $LOGFILE
else
echo -e " \033[31m 【备份失败】 \033[0m">> $LOGFILE
fi
echo -e " 备份结束时间:$(date +"%H:%M:%S")\n\n\n" >> $LOGFILE
3. 写入计划任务
0 1 * * * /u01/exec/fulldb.sh > /dev/null 2&>1
十八、自动增备脚本
- 设置0级全备
注意点:删除七天前的数据需要用sysdate-14;解释原因如下图。
[oracle@test150 exec]$ cat level0.rman
run{
delete noprompt backupset completed before 'sysdate-14';
sql 'alter system archive log current';
backup incremental level 0 format '/u01/backup/%d-inc0-%U-%M-%D' database;
backup archivelog all format '/u01/archbak/%d-arch-%U' delete all input;
}
2. 设置1级增备
[oracle@test150 exec]$ cat level1.rman
run{
delete noprompt backupset completed before 'sysdate-14';
sql 'alter system archive log current';
backup incremental level 1 format '/u01/backup/%d-inc1-%U-%M-%D' database;
backup archivelog all format '/u01/archbak/%d-arch-%U' delete all input;
}
3. 编写shell脚本
vim level0.sh
#!/bin/bash
echo "-------------------0级全备-----------------" >> /u01/exec/level0.log
rman target / cmdfile level0.rman log /u01/exec/level0.log append
echo "-------------------备份完毕----------------" >> /u01/exec/level0.log
vim level1.sh
#!/bin/bash
echo "-------------------1级增备-----------------" >> /u01/exec/level1.log
rman target / cmdfile level1.rman log /u01/exec/level1.log append
echo "-------------------备份完毕----------------" >> /u01/exec/level1.log
4. 写入计划任务
0 1 * * 1 /u01/exec/level0.sh > /dev/null 2&>1 0 1 * * 0,2-6 /u01/exec/level1.sh > /dev/null 2&>1