闪回归档的简单测试(r8笔记第68天)
11g里面的新特性闪回归档,为历史数据的定制查询提供了一种可能。抽时间学习了一下这个特性,发现还是比较清晰易用。如果使用得当还是很不错的一个特性。
我们来简单模拟一个例子来看看。
首先需要创建独立的表空间,属性需要为segment space management auto,因为默认属性就是如此,所以我们简化语句。
SQL> create tablespace fbarch datafile'/U01/app/oracle/oradata/actvdb/fbarch.dbf' size 10M ;
Tablespace created.
然后我们创建闪回数据归档区,可以指定多个表空间,也可以修改保留时长。
SQL> create flashback archive fda tablespace fbarch retention 1 month;
Flashback archive created.
创建一个测试表
SQL> create table test_fbarch as select * from dba_objects;
Table created.
然后修改表属性,指定闪回归档区,当然这个地方闪回数据归档区是不对应的。
SQL> alter table test_fbarch flashback archive fbarch;
alter table test_fbarch flashback archive fbarch
*
ERROR at line 1:
ORA-55605: Incorrect Flashback Archive is specified
我们删除原有的闪回数据归档区,重新创建一个。
SQL> drop flashback archive fda;
Flashback archive dropped.
重新创建闪回数据归档区
SQL> create flashback archive fbarch tablespace fbarch retention 1 month;
Flashback archive created.
然后再次修改表属性,指定为fbarch
SQL> alter table test_fbarch flashback archive fbarch;
Table altered.
通过闪回功能来查找以前的历史数据,可以基于时间戳或者基于SCN
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
380440310
假设基于SCN查询
SQL> select count(*)from test_fbarch as of scn 380440310;
COUNT(*)
----------
86840
在此处,我们故意要刷新undo数据空间,而且要让数据的变化频率大大加快。
使用下面的pl/sql来刷undo
SQL> begin
2 for i in 1 .. 100 loop
3 update test_fbarch set object_id=object_id+1;
4 commit;
5 end loop;
6 end;
7 /
当然这个时候,会不断在后台执行语句,刷新数据,当然原来的闪回数据归档区肯定是不够的。
在alert日志中就会看到如下的报错。
Wed Apr 13 22:43:23 2016
ORA-1688: unable to extend table CYDBA.SYS_FBA_HIST_239635 partition HIGH_PART by 1024 in tablespace FBARCH
当然这个错误看起来还不是很清晰,我们来简单分析一下。
SQL> col segment_name format a30
SQL> select segment_name,segment_type from user_segments;
SEGMENT_NAME SEGMENT_TYPE
------------------------------ ------------------
TEST_FBARCH TABLE
SYS_FBA_DDL_COLMAP_239635 TABLE
SYS_FBA_TCRV_239635 TABLE
SYS_FBA_HIST_239635 TABLE PARTITION
SYS_FBA_TCRV_IDX_239635 INDEX
可以看到多出了4个段对象,三个是后台数据表,一个是索引。
通过字段的情况也可以猜出闪回归档的一些实现原理来。
SQL> desc SYS_FBA_TCRV_239635 --这个表记录的是在指定时间范围内,进行特定操作(OP)的记录。
Name Null? Type
----------------------------------------- -------- ----------------------------
RID VARCHAR2(4000)
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OP VARCHAR2(1)
SQL> desc SYS_FBA_HIST_239635 --这个表记录的是指定时间范围内,数据变化的明细情况,可以看到里面有原表的所有字段。
Name Null? Type
----------------------------------------- -------- ----------------------------
RID VARCHAR2(4000)
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OPERATION VARCHAR2(1)
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
NAMESPACE NUMBER
EDITION_NAME VARCHAR2(30)
SQL> desc SYS_FBA_DDL_COLMAP_239635 --这个表记录的是在指定时间范围内的DDL相关记录。
Name Null? Type
----------------------------------------- -------- ----------------------------
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OPERATION VARCHAR2(1)
COLUMN_NAME VARCHAR2(255)
TYPE VARCHAR2(255)
HISTORICAL_COLUMN_NAME VARCHAR2(255)
当然对于闪回归档来说,DDL如果涉及表字段的drop操作,就会有限制,而对于添加字段的操作可以支持。
而对于239635该怎么理解呢?我们来看看object_id
SQL> select object_id,object_name from dba_objects where object_id=239635;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
239635 TEST_FBARCH
这个时候查看后台进程,会发现闪回归档其实还有一个后台进程fbda
SQL> !ps -ef|grep fb
oracle 26606 1 59 22:38 ? 00:07:24 ora_fbda_actvdb
oracle 26924 26849 0 22:51 pts/1 00:00:00 /bin/bash -c ps -ef|grep fb
oracle 26926 26924 0 22:51 pts/1 00:00:00 grep fb
- 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 数组属性和方法
- 一文快速上手Rollup,JavaScript类库打包好帮手
- Day67:剪绳子
- Typecho实现微信发消息:Type时光机
- 插入排序
- Typecho1.1仿简书主题小屏幕菜单栏展开优化
- Typecho1.1仿简书主题大小屏适配
- Typecho1.1文章内链接用新窗口打开的办法
- 搭建一个低配版的Mock Server
- Nginx解决跨域资源问题:No 'Access-Control-Allow-Origin' header is present on the requested resource.
- Typecho 仿简书主题 时间轴归档页实现
- Typecho如何添加“编辑”当前文章按钮
- Flutter入门第二讲:项目运行,Hello world
- Flutter入门第一讲:环境搭建(mac os为例)
- 第12天:NLP补充——HMM(隐马尔科夫模型)
- android View事件分发实测