闪回数据库不是“万金油”(r11笔记第73天)
闪回数据库这个特性在很多Oracle DBA眼里就是鸡肋特性,因为谁会因为恢复数据而需要在主库闪回,最后可能丢掉更多的数据,这个观点没错。
但是如果是备库呢,这个特性就顺利成章的满足了绝大多数的恢复需求,无论你是truncate,还是一些drop table的操作都是可以轻而易举的恢复。所以更多的时候我们其实更偏爱于Data Guard基础上的这种数据恢复方式,而原本的逻辑备份exp,expdp,物理备份RMAN就显得有些臃肿了。
拿一个真实的小案例来说明,有一次因为数据查询的SQL有问题,结果查出的数据结果有问题,但是发现的时候这个时间已经过去了好几天,要追溯到那天那个时间点的数据状态,使用备份是完全不可能的。这个时候因为备库开启了闪回,我们可以很轻松的恢复到几天前的任意一个时间点,就这样这个问题就引刃而解了。这也算是闪回数据库尝到了一些甜头。所以在后来这个特性我也会逐步放开手脚去使用。
但是对于闪回数据库,很多场景虽然恢复起来全然没有问题,但是它可能不是罪完美的,如果让你说出个一二三,可能也会不是很肯定。
其实闪回数据库不是数据恢复的“万金油”,有一些场景它是无法实现闪回的。我们要清楚的这个这个边界才能在数据恢复的时候更加充满信心。这个信息还是从官方文档中能够得到要合适一些。(https://docs.oracle.com/cd/E11882_01/backup.112/e10642/flashdb.htm#BRADV286)
大体来说,有下面的几个场景是无法实现闪回的。
1.通过闪回数据库来修复介质问题或者是数据文件丢失
2.如果对数据文件做了收缩操作,比如数据文件为200M,我们收缩为190M,那么这个我们是无法闪回到收缩前的状态的。
3.如果drop datafile这样的操作,本身也是无法支持闪回的,而且在10g的子版本中,这个操作直接会导致MRP异常终止。
4.一些特殊的NOLOGGING操作是不支持闪回的,比如做一个direct path的数据导入,比如持续时间是9:00~9:15,启用了Nologging,如果你要闪回到9:07的这个状态是不可以的。
总体来看上面的几个场景,也算是极为罕见了。而且放开所有的权限,开发同学是全然没有这些权限去破坏和操作的。
我们来简单做一个例子来强化理解一下。
SQL> select file_id,file_name ,bytes/1024/1024 from dba_data_files;
FILE_ID FILE_NAME BYTES/1024/1024
---------- -------------------------------------------------- ----
4 /home/oracle/users01.dbf 935
3 /U01/app/oracle/oradata/dataguru/undotbs01.dbf 295
2 /U01/app/oracle/oradata/dataguru/sysaux01.dbf 1250
1 /U01/app/oracle/oradata/dataguru/system01.dbf 750
5 /U01/app/oracle/oradata/dataguru/test_new01.dbf 200
6 /U01/app/oracle/oradata/dataguru/test/test02.dbf 10
我们记下一个时间戳。然后在主库端把5号文件从200M收缩到190M.
alter database datafile '/U01/app/oracle/oradata/dataguru/test_new01.dbf' resize 190M;
这个时候查看数据文件的大小是明显发生了变化,收缩到了190M.
那么我们在备库端取消日志应用,准备开始闪回。
SQL> recover managed standby database cancel;
Media recovery complete.
SQL> alter database close;
Database altered.
开始闪回数据库到收缩前的状态。
SQL> flashback database to timestamp to_timestamp('2017-02-12 22:32:15','yyyy-mm-dd hh24:mi:ss');
flashback database to timestamp to_timestamp('2017-02-12 22:32:15','yyyy-mm-dd hh24:mi:ss')
*
ERROR at line 1:
ORA-38766: cannot flashback data file 5; file resized smaller
ORA-01110: data file 5: '/U01/app/oracle/oradata/dataguru/test_new01.dbf'
由此可以看出这个操作是支持不了的,所以对于闪回数据库这些场景就是一些底线,我们需要了解闪回数据库能够做什么,哪些是不支持的。
明确了这些问题,其实闪回数据库还是大有可为。
- Linux | CentOS7下会玩JDK不?你确定?
- Linux | 不懂Linux的码神,不是真正的菜鸟
- 初体验Spring Boot 2支持的HikariCP连接池
- 快来了解JDK10中引入的全新JIT编译器:Graal
- 基于Ryu打造自定义控制器
- Junit 5新特性全集
- 深入了解浏览器的重绘与重排
- 自己动手写区块链(Java版)
- 自己动手写区块链-发起一笔交易(Java版)
- 详解JavaScript跨域问题
- OpenStack Magnum及Liberty新功能简介
- JDK10要来了:下一代 Java 有哪些新特性?
- 是时候忘掉finalize方法了
- 学会一个JVM插件:使用HSDIS反汇编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 数组属性和方法
- Android实现关机后数据不会丢失问题
- Canvas 进阶(五)实现图片滤镜效果
- 将IP地址字符串分割成数组
- android监听器实例代码
- (火狐)Selenium WebDriver测试 NotADirectoryError: [WinError 267] 目录名称无效。
- 浅析Android高斯模糊实现方案
- Android 自定义验证码输入框的实例代码(支持粘贴连续性)
- _countof和sizeof
- Flutter适配深色模式的方法(DarkMode)
- RecyclerView+SnapHelper实现无限循环筛选控件
- 详解Android 8.1.0 Service 中 弹出 Dialog的方法
- 短信收发类无错版JustinIO.cs
- Android快速实现无预览拍照功能
- RecyclerView+PagerSnapHelper实现抖音首页翻页的Viewpager效果
- android中使用react-native设置应用启动页过程详解