讲真,你该做备份的有效性校验了
编辑手记:最近刷爆了朋友圈的GitLab删库事件惊醒了一大批运维人员,五重备份全部失效,这是真的吗?嗯,经过无数次确认,的确所有备份都失效。而我同样相信,存在类似隐患的企业不在少数,如果你的系统遭遇类似故障,你是否能幸免。
讲真,年初好好地做一次备份的有效性校验吧。今天分享一些常用的校验有效性的方法。文章来自官方文档翻译。
1、RMAN校验
RMAN校验的主要目的是检验坏块和丢失的文件,数据库一般会阻止可能导致失效的备份文件或者损坏的还原文件的操作。
RMAN校验主要会进行以下操作:
- 在恢复或还原数据文件的过程中阻止对其进行访问
- 针对一个数据文件每次只允许一个还原操作
- 确保增量备份的有序性
- 将存储信息存放在备份文件中以便可以检查文件损坏
- 在每次读写块的时候都做检查,使得坏块及时被发现
>关于校验和与坏块
所谓坏块指的是块中的数据改变了,跟Oracle预期想要查找的数据不同,坏块产生的原因包含但不局限于以下几种:
- 磁盘和磁盘控制器故障
- 内存故障
- Oracle数据库软件的缺陷
DB_BLOCK_CHECKSUM是一个数据库初始化参数,用于控制数据库(而非备份)中的数据文件和联机重做日志文件中的块的校验和的写入。 如果DB_BLOCK_CHECKSUM是Typical的,那么数据库在正常操作期间计算每个块的校验和,并在写入磁盘之前将其存储在块头中。 当数据库稍后从磁盘读取块时,会重新计算校验和并与存储的值进行比较。 如果值不匹配,则块已损坏。
默认情况下,BACKUP命令计算每个块的校验和,并将其存储在备份中。 BACKUP命令忽略DB_BLOCK_CHECKSUM的值,因为此初始化参数适用于数据库中的数据文件,而不是备份。
>认识物理和逻辑坏块
- 在物理坏块(介质损坏)中,数据库根本无法识别该块:校验和无效,块包含全零,或块头和块尾不匹配。
默认情况下,BACKUP命令计算每个块的校验和,并将其存储在备份中。 如果指定NOCHECKSUM选项,则创建备份时,RMAN不会执行块的校验和。
- 在逻辑坏块中,块的内容在逻辑上不一致。 逻辑坏块的示例包括行或索引条目的损坏。 如果RMAN检测到逻辑损坏,则会将该块记录在告警日志和服务器会话跟踪文件中。
默认情况下,RMAN不检查逻辑损坏。 但是,如果在BACKUP命令上指定CHECK LOGICAL,则RMAN会对数据和索引块进行逻辑损坏(例如行片或索引条目的损坏)进行测试,并将其记录在位于自动诊断信息库(ADR)中的告警日志中, 如果在备份或恢复文件时使用具有以下配置的RMAN,则它会检测可能检测到的所有类型的块损坏:
- 在数据库的初始化参数文件中,设置DB_BLOCK_CHECKSUM = typical,以便数据库自动计算数据文件校验和(不用于备份,而是用于数据库使用的数据文件)
- 不要在BACKUP命令之前使用SET MAXCORRUPT,因为RMAN不会容忍任何未标记的块损坏。
- 在BACKUP命令中,不要指定NO CHECKSUM选项,方便RMAN在写入备份时计算校验和
- 在BACKUP和RESTORE命令中,指定CHECK LOGICAL选项,使得RMAN能够检查逻辑和物理损坏
>RMAN备份中的坏块限制
可以通过SET MAXCORRUPT 命令限制在RMAN备份的一个文件中的未标记的坏块的总数。默认值为0,表示Oracle不允许备份文件中存在任何未标记的块损坏。
如果在备份期间RMAN遇到未标记的损坏块时超过MAXCORRUPT限制,则RMAN终止备份。 否则,RMAN将新检测到的损坏块写入备份,并使用特殊标头指示该块已标记为已损坏。 可以使用VALIDATE命令确定哪些块被标记为已损坏,并找到任何未标记的已损坏块。
缺陷:
因为RMAN允许在备份中标记损坏的块,并且可以指示RMAN允许未标记的损坏块在备份中被标记为损坏(当使用MAXCORRUPT时),可以恢复具有被标记为损坏的块,因此 如果备份此恢复的数据文件(假设没有发生新的损坏),即使没有设置MAXCORRUPT,备份也会成功。 这是因为先前标记的损坏不会阻止RMAN完成备份。
>坏块的检测
Oracle数据库支持对数据库坏块的监控、检测和修复。该技术取决于损坏是块间损坏还是块内损坏。 在块内损坏中,损坏发生在块本身内。 这种损坏可以是物理的或逻辑的。 而块间损坏只能是逻辑的。
例如,V$DATABASE_BLOCK_CORRUPTION视图记录intrablock损坏,而自动诊断信息库(ADR)跟踪所有类型的损坏。 下表总结了数据库如何处理不同类型的数据块损坏。
2、使用VALIDATE命令检查坏块
可以使用VALIDATE命令手动检查数据库文件中的物理和逻辑损坏。 此命令执行与BACKUP VALIDATE相同类型的检查,但VALIDATE可检查更大的对象选择。 例如:
- 可以使用VALIDATE DATAFILE ... BLOCK命令验证单个块。
- 如果指定要验证的备份片段的副本号,请运行VALIDATE FROM COPY NUMBER命令。
- 当验证整个文件时,RMAN检查每个输入文件块。 如果备份验证发现先前未标记的损坏块,则RMAN将使用描述损坏的行更新V$ DATABASE_BLOCK_CORRUPTION视图。
若怀疑备份集中的一个或多个备份块丢失或已损坏时,可以使用VALIDATE BACKUPSET。 此命令检查备份集中的每个块,以确保备份可以还原。 如果RMAN发现块损坏,则它发出错误并终止验证。 使用命令VALIDATE BACKUPSET可以选择要检查的备份,而RESTORE命令的VALIDATE选项允许RMAN选择。
>使用VALIDATE命令进行有效性校验的案例
1、打开RMAN并连接到目标数据库
2、根据需求执行不同的VALIDATE命令
例如:如果要校验所有的数据文件和控制文件(如果有使用参数文件的话也包含),则在RMAN中执行以下命令:
RMAN> VALIDATE DATABASE;
也可以校验制定的备份集,使用如下命令:
RMAN> VALIDATE BACKUPSET 22;
Starting validate at 17-AUG-13
using channel ORA_DISK_1
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: SID=89 device type=SBT_TAPE
channel ORA_SBT_TAPE_1: Oracle Secure Backup
channel ORA_DISK_1: starting validation of datafile backup set
channel ORA_DISK_1: reading from backup piece
/disk1/oracle/work/orcva/RDBMS/backupset/2013_08_16/o1_mf_nnndf_
TAG20130816T153034_2g774bt2_.bkp
channel ORA_DISK_1: piece
handle=/disk1/oracle/work/orcva/RDBMS/backupset/2013_08_16/o1_mf_nnndf_
TAG20130816T153034_2g774bt2_.bkp tag=TAG20130816T153034
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
Finished validate at 17-AUG-13
以下示例说明如何检查数据文件中的各个数据块是否损坏。
RMAN> VALIDATE DATAFILE 1 BLOCK 10;
Starting validate at 17-AUG-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00001 name=/disk1/oracle/dbs/tbs_01.f
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1 OK 0 2 127 481907
File Name: /disk1/oracle/dbs/tbs_01.f
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 36
Index 0 31
Other 0 58
Finished validate at 17-AUG-13
>并行的数据文件校验
如果验证大数据文件,RMAN可以通过将文件划分为多个部分并行处理每个部分。 如果配置或分配多个通道,并且希望通道进行并行验证,则指定VALIDATE命令的SECTION SIZE参数。
如果指定的段大小大于文件的大小,则RMAN不会创建文件段。 如果指定的小段大小将产生超过256个段,则RMAN将段大小增加到导致正好256个段的值。
并行校验的实现过程如下:
1、打开RMAN并连接到目标数据库,目标数据库必须是mount或者open状态 。
2、执行包含section size参数的VALIDATE命令:以下命令设置了两个Channel校验一个大数据文件,分区大小设置为1200MB。
RUN
{
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
VALIDATE DATAFILE 1 SECTION SIZE 1200M;
}
3、使用BACKUP VALIDATE 校验数据文件
可以使用BACKUP VALIDATE命令执行以下操作:
- 检查数据文件的物理或者逻辑坏块
- 确保所有的数据库文件都存在并且存放在正确的位置
当运行BACKUP VALIDATE时,RMAN读取要完整备份的文件,与在实际备份过程中一样。 但是,RMAN实际上不会生成任何备份集或映像副本。
注意
不能将BACKUPSET,MAXCORRUPT或PROXY参数与BACKUP VALIDATE一起使用。 要验证特定的备份集,需要运行VALIDATE命令
以下是使用BACKUP VALIDATE命令校验的示例:
1、打开RMAN并连接到目标数据库和恢复的catalog数据库(如果有的话)
2、执行BACKUP VALIDATE命令
例如:校验所有数据库文件和归档日志文件能够被正常备份的语句如下,该语句仅用于校验物理坏块。
BACKUP VALIDATE
DATABASE
ARCHIVELOG ALL;
如果要校验逻辑坏块,则使用上述命令的以下变体:
BACKUP VALIDATE
CHECK LOGICAL
DATABASE
ARCHIVELOG ALL;
在前面的示例中,RMAN客户端显示的输出与真正备份文件时的输出相同。 如果RMAN无法备份一个或多个文件,那么它会发出错误消息。 例如,RMAN可能会显示类似以下内容的输出:
RMAN-00571: ========================================
RMAN-00569: ====== ERROR MESSAGE STACK FOLLOWS =====
RMAN-00571: ========================================
RMAN-03002: failure of backup command at 08/29/2013 14:33:47
ORA-19625: error identifying file /oracle/oradata/trgt/arch/archive1_6.dbf
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
4、还原备份之前校验其有效性
可以运行RESTORE ... VALIDATE来测试RMAN是否可以从备份恢复特定文件或一组文件。 RMAN选择要使用的备份。
使用 该命令数据库必须mount或者open。 在验证数据文件的还原时,不必使数据文件脱机,因为数据文件的备份验证仅读取备份,并且不会影响生产数据文件。
在验证磁盘或磁带上的文件时,RMAN读取备份片段或映像副本中的所有块。 RMAN还验证异地备份, 验证与真正的恢复操作相同,除了RMAN不写入输出文件。
RMAN还允许指定要验证的备份片段的副本号。
示例如下:
1、执行具有VALIDATE参数的RESTORE命令。以下语句校验所有数据库文件包含归档日志的还原
RESTORE DATABASE VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;
如果没有看到RMAN错误栈,则跳过后续步骤。 缺少错误消息意味着RMAN已经确认它可以在真正的恢复和恢复期间成功使用这些备份。
如果在输出和RMAN-06026消息中看到错误,请查找问题的原因。 如果可能,阻止RMAN验证备份并重试验证的问题。
以下错误表示RMAN无法从可用备份还原一个或多个指定的文件:
RMAN-06026: some targets not found - aborting restore
以下示例输出显示RMAN在读取指定备份时遇到问题:
RMAN-03009: failure of restore command on c1 channel at 12-DEC-12 23:22:30
ORA-19505: failed to identify file "oracle/dbs/1fafv9gl_1_1"
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
5、CDB和PDB的校验
RMAN能够验证多租户下CDB和PDB, 可以选择为要为CDB和PDB验证的备份片段指定副本号。
本章中的所有过程都适用于CDB,其差异在以下部分中描述:
>检查整个CDB
验证CDB的步骤与用于验证非CDB的步骤类似。 唯一的区别是,您必须以通用SYSBACKUP或SYSDBA权限作为公共用户连接到根。 然后,使用VALIDATE DATABASE和RESTORE DATABASE VALIDATE命令。
以下命令在连接到根时验证整个CDB:
VALIDATE DATABASE;
The following command validates the root:
VALIDATE DATABASE ROOT;
>校验PDB
使用以下方式可以校验PDB的有效性
连接到根目录并使用VALIDATE PLUGGABLE DATABASE或RESTORE PLUGGABLE DATABASE VALIDATE命令, 能够验证一个或多个PDB。
以下命令在连接到根时验证PDB hr_pdb和sales_pdb。
VALIDATE PLUGGABLE DATABASE hr_pdb, sales_pdb;
连接到PDB并使用VALIDATE DATABASE和RESTORE DATABASE VALIDATE命令仅验证一个PDB。 此处使用的命令与您将用于非CDB的命令相同。
以下命令在连接到PDB时验证数据库的还原。
RESTORE DATABASE VALIDATE;
以上就是今天要分享的关于备份的有效性检查。更多内容请访问官方文档。如有疑问欢迎加入云和恩墨大讲堂与专家交流探讨。
2017,一起进步。
- [喵咪BELK实战(1)]浅谈日志的重要性以及介绍BELK
- Unicode编解码函数
- 适配器模式
- [PhalApi实战篇(1)]Redis队列处理异步任务
- 修饰者模式
- PhalApi-RabbitMQ基于PhalApi专业队列拓展
- Python的三个问题
- [喵咪开源软件推荐(4)]Liunx跑分神器-unixbench
- 正则化贪心森林(RGF)的入门简介,含案例研究
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由
- [喵咪开源软件推荐(3)]全球IP库-GeoLite2-City
- [喵咪MQ(3)]RabbitMQ集群安装配置
- 动态实现指定图片半透明及鼠标事件
- JVM杂谈之JIT
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 性能优化漫谈(一):无代码调优
- C++职责链模式
- Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单
- 使用 NextCloud + COS 搭建个人网盘
- Shader基础技巧整理
- 隐秘的物理粒子系统与渲染 !Cocos Creator LiquidFun !
- 一起用Gradle Transform API + ASM完成代码织入呀~
- 掩盖浏览痕迹不会被发现的方法【逗】
- webpack实战——样式预处理
- 前端防止浏览器访问旧版 js 和 css 的优化思路
- 少数派实测报告:AI巨无霸模型GPT-3 | 附送API 调用方法「AI核心算法」
- Qt音视频开发19-海康sdk录像存储
- 单元测试在深度学习中的应用 | 附代码「AI产品/工程落地」
- 实现 AOP 的三种方式
- Spring Boot 配置