闪回归档的简单测试(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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2016-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏十月梦想

php创建数据库和数据表

注意:在php5.5以上取消了mysql_query请使用mysqli_query(mysql $link,string $query[,int $resul...

1002
来自专栏数据库

oracle常用命令大全

一、Oracle数据库实例、用户、目录及session会话查看: 1、ORACLE SID查看设置 查看SID、用户名 $ env|grep SID 、sele...

4177
来自专栏顶级程序员

为什么忘记 commit 也会造成 select 查询的性能问题

作者:潇湘隐者 www.cnblogs.com/kerrycode/p/5836015.html 今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器OR...

2958
来自专栏程序猿

SQL sever 触发器

一: 触发器 是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新 记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性...

3487
来自专栏源哥的专栏

oracle中如何删除重复数据

        我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?         重复的数据可能有这样...

1003
来自专栏乐沙弥的世界

ORA-00942: table or view does not exist

      在过程,包,函数,触发器中调用Oracle相关动态性能视图时,需要授予适当的权限,否则会收到表和视图不存在的错误提示。即使你可以单独查询这些视图。因...

1352
来自专栏杨建荣的学习笔记

MySQL在RR隔离级别下的unique失效和死锁模拟

今天在测试MySQL事务隔离级别的时候,发现了一个有趣的问题,也参考了杨一之前总结的一篇。http://blog.itpub.net/22664653/view...

3626
来自专栏杨建荣的学习笔记

迁移式升级的测试(二)(r10笔记第35天)

在之前写的一篇博文中,自己是打算对一台数据库使用Data Guard+TTS的方式来完成数据迁移和升级的工作,迁移式升级的新方案测试 (r10笔记第30天) 整...

3414
来自专栏乐沙弥的世界

临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是 对于大...

1103
来自专栏乐沙弥的世界

导出MySQL用户权限

    在对MySQL数据库进行迁移的时候,有时候也需要迁移源数据库内的用户与权限。对于这个迁移我们可以从mysql.user表来获取用户的相关权限来生成相应的...

1213

扫码关注云+社区