在oracle 11g以前的版本中,如果对大表进行全表扫描,通过v$session_wait可以看到wait event是:db file scattered read;在11g中,如果对大表进行全表扫描,通过v$session_wait可以看到wait event是:direct path read;也就是说,在11g中,大表全表扫描是将数据块直接读入会话的pga区域。 10g: [oracle10g@csdba worksh]$ sh list_sql.sh -------------------------------------------------------------------------- YEKAI(159,235) ospid=5318 hash_value=1577916882 execs=918 els_time=1.04 program=sqlplus@csdba (TNS V1-V3) disk_reads=0 buffer_gets=43658.46 SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1 -------------------------------------------------------------------------- |SELECT STATEMENT |----- 1577916882 ----| | | 8609 | |SORT AGGREGATE | | 1 | 13 | | | TABLE ACCESS FULL |TMP_OBJECTS | 483 | 6K| 8609 | -------------------------------------------------------------------------- ----------------------------alter system kill session----------------------- alter system kill session '159,235'; [oracle10g@csdba worksh]$ sh list_sql.sh -------------------------------------------------------------------------- YEKAI(159,235) ospid=5318 hash_value=1577916882 execs=919 els_time=1.04 program=sqlplus@csdba (TNS V1-V3) disk_reads=0 buffer_gets=43658.52 SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1 -------------------------------------------------------------------------- |SELECT STATEMENT |----- 1577916882 ----| | | 8609 | |SORT AGGREGATE | | 1 | 13 | | | TABLE ACCESS FULL |TMP_OBJECTS | 483 | 6K| 8609 | -------------------------------------------------------------------------- ----------------------------alter system kill session----------------------- 11g: [oracle11g@csdba worksh]$ sh list_sql.sh -------------------------------------------------------------------------- YEKAI(137,491) ospid=5324 hash_value=1577916882 execs=719 els_time=1.34 program=sqlplus@csdba (TNS V1-V3) disk_reads=43713.11 buffer_gets=68684.45 SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1 -------------------------------------------------------------------------- |SELECT STATEMENT |----- 1577916882 ----| | | 11936 | |SORT AGGREGATE | | 1 | 13 | | | TABLE ACCESS FULL |TMP_OBJECTS | 482 | 6K| 11936 | -------------------------------------------------------------------------- ----------------------------alter system kill session----------------------- alter system kill session '137,491'; [oracle11g@csdba worksh]$ sh list_sql.sh -------------------------------------------------------------------------- YEKAI(137,491) ospid=5324 hash_value=1577916882 execs=720 els_time=1.34 program=sqlplus@csdba (TNS V1-V3) disk_reads=43713.2 buffer_gets=68684.58 SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1 -------------------------------------------------------------------------- |SELECT STATEMENT |----- 1577916882 ----| | | 11936 | |SORT AGGREGATE | | 1 | 13 | | | TABLE ACCESS FULL |TMP_OBJECTS | 482 | 6K| 11936 | -------------------------------------------------------------------------- ----------------------------alter system kill session----------------------- 大家看测试,很明显,在11g中,大表全表扫描时数据块不经过sga而直接进pga,就会造成每次进行大表全表扫描,物理读都是很大,而在10g中,由于全表扫描的数据块在sga中已经存在,所以执行全表扫描时,它的物理读为0;这种变迁,体现了oracle在优化策略上的进步,就是假定大表频繁全表扫描这种现象,在产生库上是不常有的,通过把数据直接读入pga,进而减少了cache buffer的繁忙交换程度,提高了cache buffer的使用效率。。。
11g新特性:实时sql监控增强 |
|
在11g以前的版本,SQL的运行情况可以通过监控v$session_longops来了解,当某个操作执行时间超过6秒,就会被v$session_longops感知,通常可以监控到比如全表扫描,全索引扫描,哈希联接,并行查询等;在11g中,当sql并行运行时,马上会被real-time monitor到,当sql单进程运行时,如果运行时间超过5秒,它也会被监控到。 可以通过v$sql_monitor与v$sql_plan_monitor视图查看sql执行的统计信息,可以联合v$active_session_history,v$session,v$session_longops,v$sql, v$sql_plan等视图,查看sql更多的信息。v$sql_monitor收集关键的一些指标,比如:elapsed time, CPU time, number of reads and writes, I/O wait time and various other wait times等,这些信息是每秒刷新一次,当sql执行完比,并不会立即把它从v$sql_monitor中删除,至少保留1分钟,real-time sql monitor也包括收集sql执行计划的统计信息,可以通过v$sql_plan_monitor视图来查看被监控sql的执行计划,这些统计数据也是每秒更新一次,当sql执行完结,它们至少被保留1分钟。 如何生成sql监控报表: 方法一: variable my_rept CLOB; BEGIN :my_rept :=DBMS_SQLTUNE.REPORT_SQL_MONITOR(); END; / print :my_rept 方法二: set long 10000000 set longchunksize 10000000 set linesize 200 select dbms_sqltune.report_sql_monitor from dual; 如何激活或禁止real-time sql monitor? real-time sql monitor需要statistics_level参数等于all或typical,且CONTROL_MANAGEMENT_PACK_ACCESS参数必须是DIAGNOSTIC+TUNING(默认就是如此),还有两个语句级的hints可以激活或禁止real-time sql monitor:/*+ monitor */与/*+ no_monitor */,这两个参数也必须在CONTROL_MANAGEMENT_PACK_ACCESS参数是DIAGNOSTIC+TUNING下才生效,案例: 强制sql使用实时监控: select /*+ monitor */ count(*) from test where title = 'abc'; 取消sql使用实时监控: select /*+ no_monitor */ count(*) from test where title = 'abc'; Sys@ORA11G> set long 10000000 Sys@ORA11G> set longchunksize 10000000 Sys@ORA11G> set linesize 200 Sys@ORA11G> select dbms_sqltune.report_sql_monitor from dual; REPORT_SQL_MONITOR -------------------------------------------------------------- SQL Monitoring Report SQL Text -------------------------------------------------------------- SELECT COUNT(*) FROM TEST WHERE OBJECT_ID = :B1 -------------------------------------------------------------- Global Information Status : DONE (ALL ROWS) Instance ID : 1 Session ID : 122 SQL ID : 2ywfyn7r0ywky SQL Execution ID : 16777216 Plan Hash Value : 1950795681 Execution Started : 08/16/2007 15:48:24 First Refresh Time : 08/16/2007 15:48:28 Last Refresh Time : 08/16/2007 15:48:30 -------------------------------------------------------------------- | Elapsed | Cpu | IO | Other | Fetch | Buffer | Reads | | Time(s) | Time(s) | Waits(s) | Waits(s) | Calls | Gets | | -------------------------------------------------------------------- | 4.30 | 1.36 | 0.01 | 2.93 | 1 | 94869 | 94613 | -------------------------------------------------------------------- SQL Plan Monitoring Details ================================================================== | Id | Operation | Name | Rows | Cost | Time | | | | | (Estim) | | Active(s) | ================================================================== | 0 | SELECT STATEMENT | | | 35310 | 1 | | 1 | SORT AGGREGATE | | 1 | | 1 | | 2 | TABLE ACCESS FULL | TEST | 126 | 35310 | 5 | ================================================================== 接上表: =========================================================== Start | Starts | Rows | Activity | Activity Detail | Active | | (Actual) | (percent) | (sample #) | =========================================================== +6 | 1 | 1 | | | +6 | 1 | 1 | | | +2 | 1 | 0 | 100.00 | Cpu (5) | =========================================================== |
11g在awr report方面,还是增加了一些吸引眼球的地方,比如增加了对OS等主机配置的报告,对于dba来讲,在接手一个新环境时,或做现场服务时,该报表将会简少一些额外的工作,比如报表中已经可以显示主机名,操作系统,CPU个数,物理内存等,最让人关注的还是增加了主机负载的一些情况,具体变化请看下文: 主机方面: Host Name Platform CPUs Cores Sockets Memory(GB) ----------- ------------------ ---- ----- ------- ---------- log51 Linux IA (32-bit) 4 2 2 3.96 LOAD PROFILE: Load Profile Per Second Per Trans Per Exec Per Call ~~~~~~~~~~~~ ----------- ---------- --------- -------- DB Time(s): 1.0 6.5 0.11 0.29 DB CPU(s): 1.0 6.4 0.11 0.29 Redo size: 1,059.2 6,813.2 Logical reads: 73,493.3 472,724.2 Block changes: 5.7 36.5 Physical reads: 73,465.3 472,544.3 Physical writes: 0.6 3.7 User calls: 3.4 22.1 Parses: 2.1 13.3 Hard parses: 0.0 0.0 W/A MB processed: 9,217.0 59,285.9 Logons: 0.0 0.1 Executes: 8.9 57.3 Rollbacks: 0.1 0.4 Transactions: 0.2 说明:在load profile section,增加了DB Time(s),DB CPU(s),W/A MB processed,Rollbacks等,当然也去掉了sorts的统计信息,如果想看memery sort与disk sort等情况,需要在Instance Efficiency Percentages部分来观察,Instance Efficiency Percentages section没有原化。 HOST CPU & LOAD AVG: Host CPU (CPUs: 4 Cores: 2 Sockets: 2) ~~~~~~~~ Load Average Begin End %User %System %WIO %Idle --------- --------- --------- --------- --------- --------- 1.01 1.20 14.2 11.6 0.1 74.2 Instance CPU ~~~~~~~~~~~~ % of total CPU for Instance: 25.1 % of busy CPU for Instance: 97.2 %DB time waiting for CPU - Resource Mgr: 0.0 Memory Statistics ~~~~~~~~~~~~~~~~~ Begin End Host Mem (MB): 4,054.0 4,054.0 SGA use (MB): 600.0 600.0 PGA use (MB): 126.6 126.8 % Host Mem used for SGA+PGA: 17.92 17.92 Operating System Statistics - Detail Snaps: 137-138 Snap Time Load %busy %user %sys %idle %iowait --------------- -------- -------- -------- -------- -------- -------- 16-Aug 08:00:35 1.0 N/A N/A N/A N/A N/A 16-Aug 09:00:37 1.2 25.8 14.2 11.6 0.1 74.2 ------------------------------------------------------------- 关于TOP SQL部分,主要按以下方面进行排序: SQL ordered by Elapsed Time SQL ordered by CPU Time SQL ordered by Gets SQL ordered by Reads SQL ordered by Executions SQL ordered by Parse Calls SQL ordered by Sharable Memory SQL ordered by Version Count
11g新特性:增强的add column |
|
在11g以前的版本中,如果表上存在未提交的事务,则对表进行DDL操作将失败,在11g中,这个限制已经被取消啦,执行ADD COLUMN操作时,并不会受未提交事务的影响,另外,ADD COLUMN还有一个增强,就是在一个非常大的表上执行ADD COLUMN xxx DATATYPE DEFAULT yyy NOT NULL时,它不会再去将默认值更新到表中已经存在的记录,这样改进的好处是非常大的,DBA对表结构的变更将更加容易,而且不会产生大量的library cache lock/pin等,更不会阻塞事务,它是怎么做到的呢? 其实现方法很简单,ORACLE引擎仅仅依赖数据字典中记录的字段的默认值来对新增字段中为空的数据进行解释,比如在test表有1000万的记录,执行alter table TEST add test_add_column number default 1 not null操作,它不会将默认值更新到存在的1000万条记录,当我们进行查询select count(*) from test where test_add_column = 1时,ORACLE引擎扫描到test_add_column存在大量为NULL的记录时,它根据数据字典中记录的test_add_column字段的默认值,将NULL解释为1...
11g stream新特性列表 |
|
从最初学习9iR2的stream,以及10gR1,10gR2的stream,到现在的11gR1,可以说oracle在stream上面压了很大的成钱,stream也越来越得到用户的接受,在11gR1中,stream比之前的版本也有较大的改进,比如同步捕获,合并的捕获与应用进程等,以下就简单地列下新增的功能点,感兴趣的可以自己看文档。。。 1 同步捕获 2 支持xmltype类型的字段 3 数据加密 4 分割与合并复制目标 5 跟踪LCRs的被处理过程 6 比较并聚合共享数据库对象 7 当stream异常时OEM自动报警 8 stream性能顾问 9 stream job使用oracle scheduler 10 通知服务改善 11 合并捕获与应用进程的优化 12 新的错误消息代码
11g新特性:DDL锁超时 |
|
在11g中,oracle提供了一个新的可动态调整的参数ddl_lock_timeout,该参数允许存在未提交的事务的表上,执行DDL操作,如果事务在ddl_lock_timeout允许的时间内提交,则DDL操作将会成功,否则就会报ORA-00054错误,如果对该表执行ADD COLUMN操作,则会直接提交表上发生的未提交的事务,所以用11g时,有些东西还是要注意的,当然也不排除这是11g的一个bug哦。。。 11g以前的版本测试如下: SESSION 1: 16:18:34 SQL> delete from tmp_lg_log where rownum < 2; 1 row deleted. SESSION 2: 16:21:10 SQL> alter table tmp_lg_log add rn number; alter table tmp_lg_log add rn number * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified 11g中测试DDL锁超时: SESSION 1: SQL> create table tmp_lg_log (id number,name varchar2(32),rn1 number, rn2 number); Table created. SQL> insert into tmp_lg_log values(1,'abc',1,2); 1 row created. SESSION 2: SQL> show parameter lock NAME_COL_PLUS_SHOW_PARAM TYPE VALUE_COL_PLUS_SHOW_PARAM ------------------------- ----------- --------------------- ddl_lock_timeout integer 0 --修改锁超时时间 SQL> alter system set ddl_lock_timeout=60 scope=both; System altered. --执行ddl(drop column)的操作,事务未在60s内提交,所以报timeout错误 SQL> alter table tmp_lg_log drop column rn2; alter table tmp_lg_log drop column rn2 * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired --执行ddl(add column)的操作,DDL则立即成功 SQL> alter table tmp_lg_log add rn4 number; Table altered. |
|
11g新特性:stream同步捕获 |
|
在测试9iR2,10gR1,10gR2的stream时,非常希望能够有种同步capture的机制,该同步capture机制与log-based real-time capture机制是不同的,它应该是一种内部触发的机制,比如当有活动事务时,DB引擎判断该表配置有stream的同步capture标志,就可以直接把dml打包成LCRs并压入队列... 幸运的是,在10gR1中,已经看到了该功能已经被实现,但通过文档可以看到,oracle建议该功能仅适用于需要复制的表比较少的情况下,也可以理解需要复制的表dml不是很频繁,当然如果是全库进行复制,log-based real-time capture可能更高效一些,毕竟扫描一个500m以上的redo log成本也是很高的. |
|
来自:1.http://book.51cto.com/art/201111/301008.htm 2. http://www.ningoo.net/2007/09/01/oracle_11g_new_feature_flashback_data_archive.htm
闪回数据归档 Flashback data archive
在Oracle 11g中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称为闪回数据归档,本节我们将对闪回数据库归档进行介绍。
22.8.1 闪回数据归档概念
这里我们从Oracle 9i开始引进的Flashback Query开始介绍,这是Oracle第一次引入闪回技术,该技术使得一些逻辑误操作不再需要利用归档日志和数据库备份进行时间点恢复。
而在Oracle10g中,引入了Flashback Version Query、Flashback Transaction Query、Flashback Database、Flashback Table、Flashback Drop等特性,大大简化了Flashback Query的使用。
在上面的诸多闪回技术中,除了Flashback Database(依赖于闪回日志)外,其他闪回技术都是依赖于撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关(该参数决定了撤销数据在数据库中的保存时间),都是从撤销数据中读取信息来构造旧数据的。但是存在一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过undo_retention等参数来延长undo的存活期,但该参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。
Oracle 11g则为Flashback家族又带来一个新的成员:Flashback Data Archive。该技术与上面所说的诸多闪回技术的实现机制不同,通过将变化数据存储到创建的闪回归档区(Flashback Archive)中,以与undo区别开来,这样就可以通过为闪回归档区单独设置存储策略,使得可以闪回到指定时间之前的旧数据而不影响undo策略。并且,可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。
Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,Flashback Data Archive是针对对象的保护,是Flashback Database的有力补充。
通过Flashback Data Archive可以查询指定对象的任何时间点(只要满足保护策略)的数据,而且不需要利用undo,这在有审计需要的环境,或是安全性特别重要的高可用数据库中是一个非常好的特性。缺点是如果该表变化很频繁,那么对空间的要求可能很高。
22.8.2 闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他闪回数据归档区域。
每一个闪回数据归档区都可以有一个唯一的名称,同时,每一个闪回数据归档区都对应了一定的数据保留策略。例如,可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。以后如果将表放到对应的闪回数据归档区,那就按照该归档区的保留策略来保存历史数据。
闪回数据归档区是一个逻辑概念,是从一个或多个表空间中抽出一定的空间,保存表的修改历史,这样就摆脱了对撤销数据的依赖,方便表不必利用undo就可以闪回到归档策略内的任何一个时间点上。
创建闪回数据归档区可以使用CREATE FLASHBACK ARCHIVE …命令完成。
下面我们通过实例演示如何创建闪回数据归档区。
(1)创建一个系统默认的、磁盘限额为100MB、保留策略为1年的闪回数据归档区。
- SQL>create flashback archive default fbar_1 tablespace "USERS" 2 quota 100M
- 2 retention 1 year;
经过在Oracle 11g数据库上运行该语句发现,必须对tablespace关键字后面的表空间名称用" "引起来,否则无法运行成功。
(2)在TBS_DATA1上创建fbar_2闪回数据归档区,保留策略为2天。
- SQL>CREATE FLASHBACK ARCHIVE fbar_2 TABLESPACE "TBS_DATA1"
- 2 RETENTION 2 DAY;
一个归档区可以不仅对应一个表空间,而且可以增加或删除该归档区的表空间的个数,这样也达到了增加或是减少该归档区空间的目的。
(3)给数据归档区fbar_2增加一个表空间。
- SQL>ALTER FLASHBACK ARCHIVE fbar_2 ADD TABLESPACE "TBS_DATA2"
- 2 QUOTA 100M;
也可以从归档区中删除表空间。注意:此删除仅表示从数据归档区删除,并不删除该表空间。
(4)删除数据归档区fbar_2的表空间TBS_DATA2。
- SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";
对已经分配给闪回数据归档区的表空间,可以修改归档区对应的磁盘限额。
(5)修改归档区的磁盘限额。
- SYS>ALTER FLASHBACK ARCHIVE fbar_2 MODIFY TABLESPACE "TBS_DATA2"
- 2 QUOTA 200M;
(6)修改归档区的保留策略。
- SYS>ALTER FLASHBACK ARCHIVE fbar_1 MODIFY RETENTION 1 month;
22.8.3 使用闪回数据归档(1)
闪回数据归档区创建完成后,就可以指定特定的表,使其对应到特定的数据归档区。把表指定到对应的数据归档区有两种方法,一是在创建时直接指定归档区;二是对现有的表指定归档区。
如果不指定归档区的名称,则指定到默认归档区,否则,就属于指定的数据归档区。
下面我们基于上一节所创建的两个闪回数据归档区fbar_1(默认的闪回数据恢复区)和fbar_2,创建3个表,一个指定到默认归档区fbar_1,一个指定到数据归档区fbar_2,另外一个为了作对比,没有指定到任何数据归档区。
(1)创建表。
- SYS@11gR1>connect scott/tiger
- Connected.
- scott@11gR1>create table test1(a int) flashback archive;
- Table created.
- scott@11gR1>create table test2(b int);
- Table created.
- scott@11gR1>alter table test2 flashback archive data_test2;
- Table altered.
- scott@11gR1>create table test3(c int);
- Table created.
(2)在表中插入数据后,进行SELECT查询,显示结果如下:
- 09:33:38 scott@11gR1>select * from test2;
- B
- ----------
- 4
- 5
- 6
-
- 09:33:43 scott@11gR1>select * from test3;
- C
- ----------
- 7
- 8
- 9
- 09:33:46 scott@11gR1>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;
-
- TIME
- ----
- 2007-09-04 09:33:52
可以看到,这些数据是在9:33写进的,最新数据保留策略应当是,表test1对应的是默认的数据归档区fbar_1,数据保留策略是一个月,表test2对应的是数据归档区fbar_2,数据保留策略是2天,而表test3没有数据保留策略。然后,对这三个表再进行操作,如删除现有记录,并插入一些新记录,最后,我们不使用undo数据,查询时间点2007-09-04 09:33:52,看是否能找回原来的数据。
(3)对表进行更新操作,查询显示结果。
- 09:34:19 Piner@11gR1>delete from test1;
- 3 rows deleted.
- 09:34:23 Piner@11gR1>delete from test2;
- 3 rows deleted.
- 09:34:30 Piner@11gR1>delete from test3;
- 3 rows deleted.
- 09:34:35 Piner@11gR1>insert into test1 values(10);
- 1 row created.
- 09:34:47 Piner@11gR1>insert into test2 values(20);
- 1 row created.
- 09:34:53 Piner@11gR1>insert into test3 values(30);
- 1 row created.
- 09:34:58 Piner@11gR1>commit;
- Commit complete.
- 09:36:32 Piner@11gR1>select * from test1;
- A
- ----------
- 10
- 09:36:51 Piner@11gR1>select * from test2;
- B
- ----------
- 20
- 09:36:56 Piner@11gR1>select * from test3;
- C
- ----------
- 30
(4)利用闪回功能查询数据,可以获得正确数据,但是,无法确认这些数据是经过undo获得的还是经过数据归档区获得的。
- 09:43:17 Piner@11gR1>select * from test1 as of timestamp
- 09:43:17 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- A
- ----------
- 1
- 2
- 3
- 09:43:17 Piner@11gR1>select * from test2 as of timestamp
- 09:43:24 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- B
- ----------
- 4
- 5
- 6
- 09:43:25 Piner@11gR1>select * from test3 as of timestamp
- 09:43:30 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- C
- ----------
- 7
- 8
- 9
22.8.3 使用闪回数据归档(2)
(5)为了证明查询使用的是闪回数据归档,创建新的undo表空间,切换undo表空间,为了确保生效,可以重新启动数据库例程。
切换到新的undo表空间,如果没有,则需要新创建。
- SYS@11gR1>ALTER SYSTEM SET undo_tablespace=TBS_UNDO2;
- System altered.
删除原来的undo表空间。
- SYS@11gR1>drop tablespace UNDOTBS1;
- Tablespace dropped.
(6)最后,排除undo查询的可能后,再次执行查询。
- scott@11gR1> select * from test3 as of timestamp
- 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- select * from test3 as of timestamp
- *
- ERROR at line 1:
- ORA-01555: snapshot too old: rollback segment number with name "" too small
-
- scott@11gR1> select * from test1 as of timestamp
- 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- A
- ----------
- 1
- 2
- 3
-
- scott@11gR1> select * from test2 as of timestamp
- 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
- B
- ----------
- 4
- 5
- 6
可以看到,若没有设置数据归档策略的表test3,则查询时会报01555错误,但是,设置过数据归档策略的表test1与表test2,都能正常查询到数据,可以看到,数据归档已生效。
这里是一个简单的实验,时间可能远远没有达到设置的策略期,但是,却可以证明数据不是经过undo查询获得的。
22.8.4 清除闪回数据归档区数据
前面我们介绍过如何给闪回数据归档区增加空间,本节通过一些具体实例为大家介绍如何清除闪回归档区中的数据。
1.清除所有归档区的数据
- SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE ALL;
2.清除一天以前的数据
- SQL>ALTER FLASHBACK ARCHIVE data_test1
- 2 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
3.清除特定SCN之前的数据
- SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE BEFORE SCN 728969;
4.将指定的表不再设置数据归档
- SQL>ALTER TABLE test1 NO FLASHBACK ARCHIVE;
5.删除数据归档区
- SQL>DROP FLASHBACK ARCHIVE data_test2;
注意 如果将表指定了闪回数据归档区,则不能对表进行如下操作。
删除、重令名,或者修改列;
做分区或者子分区操作;
转换long到LOB类型;
ALTER TABLE…UPGRADE TABLE 操作;
DROP、RENAME、TRUNCATE表。
示例:
- scott@11gR1> drop table test1;
- drop table test1
- *
- ERROR at line 1:
- ORA-55610: Invalid DDL statement on history-tracked table
22.8.5 与闪回数据归档有关的视图
可以通过以下视图得到与闪回数据归档有关的信息。
DBA_FLASHBACK_ARCHIVE:DBA视图,闪回归档区信息;
DBA_FLASHBACK_ARCHIVE_TS:DBA视图,闪回归档有关表空间;
DBA_FLASHBACK_ARCHIVE_TABLES:DBA视图,对应表所对应的闪回归档信息;
USER_FLASHBACK_ARCHIVE:用户闪回归档区的创建信息;
USER_FLASHBACK_ARCHIVE_TABLES:用户表对应的闪回归档区域。
一.后台进程 Oracle11g为Flashback data archive特性专门引入了一个新的后台进程FBDA,用于将追踪表(traced table,也就是将指定使用flashback data archive的table)的历史变化数据转存到闪回归档区。 NING@11g>select name,description from v$bgprocess where name=’FBDA’; NAME DESCRIPTION —————————— —————————————- FBDA Flashback Data Archiver Process 二.一些限制条件 1.Flashback data archive只能在ASSM的tablespace上创建 NING@11g>create flashback archive test_archive2 2 tablespace “TEST” 3 quota 1 m 4 retention 1 day; tablespace “TEST” * ERROR at line 2: ORA-55627: Flashback Archive tablespace must be ASSM tablespace 2.Flashback data archive要求必须使用自动undo管理 NING@11g>show parameter undo_management; NAME TYPE VALUE ———————————— ———- —————————— undo_management string MANUAL NING@11g>create flashback archive test_archive2 2 tablespace “TEST” 3 quota 1 m 4 retention 1 day; create flashback archive test_archive2 * ERROR at line 1: ORA-55628: Flashback Archive supports Oracle 11g or higher NING@11g>show parameter compatible NAME TYPE VALUE ———————————— ———- —————————— compatible string 11.1.0.0.0 三.空间配额 磁盘配额由quota子句指定,只能使用整数,单位可以是M/G/T/P。如果省略quota子句,则默认为unlimited,但这样则要求用户对于该tablespace必须有unlimited的空间配额,并且指定的quota必须小于用户在该tablespace上的配额限制,在我的试验中,只有flasback data archive的配额小于tablespace的配额84M以上才可以创建成功,否则失败,至于为什么会是84M,暂时还不清楚,我的系统是Redhat AS5,有兴趣的朋友请帮忙测试这个问题。昨天昏了头了,应该是该用户在该tablespace中已经占用了80多M的空间,所以会出现这个问题。 一个Flashback data archive可以使用多个tablespace作为存储空间,创建时指定的tablespace为第一个tablespace,后续还可以通过alter flashback archive … add tablespace增加新的tablespace进来,也可以通过later flashback archive … remove tablespace移除某个tablespace(不会物理删除该tablespace)。 SYS@11g>revoke unlimited tablespace from ning; Revoke succeeded. SYS@11g>alter user ning quota 85m on users; User altered. NING@11g>create flashback archive test_archive2 2 tablespace “USERS” 3 retention 1 day; tablespace “USERS” * ERROR at line 2: ORA-55621: User quota on tablespace “USERS” is not enough for Flashback Archive NING@11g>create flashback archive test_archive2 2 tablespace “USERS” 3 quota 2 m 4 retention 1 day; tablespace “USERS” * ERROR at line 2: ORA-55621: User quota on tablespace “USERS” is not enough for Flashback Archive NING@11g>create flashback archive test_archive2 2 tablespace “USERS” 3 quota 1 m 4 retention 1 day; Operation 218 succeeded. 但是空间配额可以超过该tablespace本身的物理大小 SYS@11g>drop tablespace test including contents and datafiles; Tablespace dropped. SYS@11g>create tablespace test 2 datafile ‘/oracle/oradata/ning/test01.dbf’ size 10m; Tablespace created. SYS@11g>alter user ning quota unlimited on test; User altered. NING@11g>create flashback archive test_archive3 2 tablespace “TEST” 3 quota 100 m 4 retention 1 month; Operation 218 succeeded. 四.空间不足会导致追踪表上的DML操作失败 NING@11g>create table test as select * from all_objects where 1=2; Table created. NING@11g>alter table test flashback archive test_archive1; Table altered. NING@11g>insert into test select * from all_objects; 11873 rows created. NING@11g>insert into test select * from test; … NING@11g>/ 379936 rows created. NING@11g>/ insert into test select * from test * ERROR at line 1: ORA-01536: space quota exceeded for tablespace ‘USERS’ 五.清除闪回归档区的数据 1.清除所有数据 NING@11g>alter flashback archive test_archive1 purge all; Operation 219 succeeded. 2.清除某个时间点,比如一天前的数据 NING@11g>alter flashback archive test_archive1 2 purge before timestamp (systimestamp – interval ’1′ day); Operation 219 succeeded. 3.清除某个SCN之前的历史数据 NING@11g>alter flashback archive test_archive1 2 purge before scn 8570685767554; Operation 219 succeeded. 六.置于Flashback data archive中的table的一些限制 追踪表(Tracked table),也就是指定将历史数据保存到某个flashback data archive中的table,不能执行DDL操作(add column除外)。 NING@11g>drop table test; drop table test * ERROR at line 1: ORA-55610: Invalid DDL statement on history-tracked table NING@11g>truncate table test; truncate table test * ERROR at line 1: ORA-55610: Invalid DDL statement on history-tracked table NING@11g>alter table test drop column object_id; alter table test drop column object_id * ERROR at line 1: ORA-55610: Invalid DDL statement on history-tracked table NING@11g>alter table test add col_test int; Table altered. 但是可以rename table,这一点和文档上说的不一致 NING@11g>rename test to test1; Table renamed. NING@11g>select table_name,flashback_archive_name from dba_flashback_archive_tables; TABLE_NAME FLASHBACK_ARCHIVE_NAME —————————— —————————— TEST1 TEST_ARCHIVE1 RESULT_CACHE_MODE
RESULT_CACHE_MODE specifies when a ResultCache operator is spliced into a query's execution plan. Values:
-
MANUAL The ResultCache operator is added only when the query is annotated (that is, hints).
-
FORCE The ResultCache operator is added to the root of all SELECT statements (provided that it is valid to do so).
For the FORCE setting, if the statement contains a NO_RESULT_CACHE hint, then the hint takes precedence over the parameter setting. 默认情况下,数据库会为SGA 中共享池(Share Pool)内的结果高速缓存分配内存。分配给结果高速缓存的内存大小取决于SGA的内存大小以及内存管理系统。可以通过设置RESULT_CACHE_MAX_SIZE参数来更改分配给结果高速缓存的内存。 如果要使用查询结果高速缓存并将RESULT_CACHE_MODE初始化参数设置为MANUAL,则必须在查询中显式指定RESULT_CACHE 提示。这会在查询的执行计划中引入ResultCache运算符。执行查询时,ResultCache 运算符将查找结果高速缓存,以检查该查询结果是否存在于高速缓存中。如果存在,则直接从高速缓存检索该结果。如果高速缓存中不存在该查询结果,则执行查询。结果将以输出形式返回,也存储在结果高速缓存中。 如果将RESULT_CACHE_MODE 初始化参数设置为AUTO 或FORCE,并且不希望将查询结果存储在结果高速缓存中,则必须在查询中使用NO_RESULT_CACHE 提示。例如,如果在初始化参数文件中RESULT_CACHE_MODE的值为FORCE,并且不希望对EMPLOYEES表使用结果高速缓存,则需要使用NO_RESULT_CACHE 提示。 |