技术开发 频道

是否该清除in_memory_undo?

  【IT168 技术文档】

  Oracle闪回查询的优点是有文档记录的,但对于那些仅有一点差别的参数,如_in_memory_undo,你应该花多少钱购买它们呢?让我们来深入地研究一下_in_memory_undo参数以及它是如何影响闪回查询的。Oracle的闪回查询技术确实设计得很独特,它让我们可以在犯错后进行恢复。使用SHOW PARAMETER undo命令可以查看_in_memory_undo参数的设置情况。

SQL> show parameter undo

  NAME TYPE VALUE

  
------------------------------------ ----------- -----------------------------

  _in_memory_undo boolean TRUE

  undo_management string AUTO

  undo_retention
integer 900

  undo_tablespace string UNDOTBS1

  对这个参数我不想做过多的讨论。我冒险进入Oracle的闪回查询功能,最后发现现在它已经变得非常简单易用了,如果你对Oracle的闪回查询还不熟悉,那么我告诉你,它是一种允许用户查询过去时间点的数据,着意味着数据可能已经被删除或被修改,但仍然可以查询。本文将进行一些有趣的测试以加深你对这个参数的理解。

  _in_memory_undo=true

  在Oracle 11g中_in_memory_undo默认被设置为true,因此,下面的情景如果你没有开启归档日志的话,可能是希望看到的。

  =================================================

  _in_memory_undo=true

  =================================================

  只需要校验默认配置,可以使用 ARCHIVE LOG LIST或SHOW PARAMETER UNDO命令,很明显这个实例没有工作在归档日志模式下,并且_in_memory_undo参数被设置为true了

 SQL> archive log list

  
Database log mode No Archive Mode

  Automatic archival Disabled

  Archive destination
/opt/app/oracle/product/11.1.0/db_1/dbs/arch

  Oldest online
log sequence 300

  
Current log sequence 309

  SQL
> show parameter undo

  NAME TYPE VALUE

  
------------------------------------ ----------- -----------------------------

  _in_memory_undo boolean TRUE

  undo_management string AUTO

  undo_retention
integer 900

  undo_tablespace string UNDOTBS1

  
=================================================

  Test : Normal processing

  : _in_memory_undo
=true

  
=================================================

  对于这个测试后后面的测试, _in_memory_undo被设置为false,我们将创建一个非常简单的测试表FLASH_TEST,它只有一列,我们最初尝试闪回的结果集只有5行数据,下面是创建表,插入5行数据,然后查询校验现有的数据行:

create table flash_test (col1 number);

  
insert into flash_test values (1);

  
insert into flash_test values (2);

  
insert into flash_test values (3);

  
insert into flash_test values (4);

  
insert into flash_test values (5);

  
commit;

  SQL
> select * from flash_test;

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  闪回SQL查询需要一个闪回的时间点,因此我们查询一下系统的时间戳:

SQL> ho date

  Wed May
27 07:13:16 MDT 2009

  在这个时间点之后插入一些数据,然后再查询当前的数据行:

  
insert into flash_test values (6);

  
insert into flash_test values (7);

  
insert into flash_test values (8);

  
insert into flash_test values (9);

  
insert into flash_test values (10);

  
commit;

  SQL
> select * from flash_test;

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  
6

  
7

  
8

  
9

  
10

  
10 rows selected.

  在这里我们只验证闪回查询是否在工作,在select语句中增加一个AS OF TIMESTAMP子句,我们得到了在插入数据前表的镜像,相当简单,由于某些文档没有清楚地说明闪回查询是否需要开启归档日志模式,通过实践表明,没有归档日志模式一样可以进行闪回查询。

 SQL> SELECT * FROM flash_test AS OF TIMESTAMP TO_TIMESTAMP ('05272009:07:13:16','MMDDYYYY:HH24:MI:SS');

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  在前面的测试中,我发现Oracle在隐藏、存储和重建闪回查询方面做得非常巧妙,当我清洗了共享池和缓冲区后,通过闪回查询任然能够得到想要的结果。

alter system flush shared_pool;

  SQL
> SELECT * FROM flash_test AS OF TIMESTAMP TO_TIMESTAMP ('05272009:07:13:16','MMDDYYYY:HH24:MI:SS');

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  
alter system flush buffer_cache;

  SQL
> SELECT * FROM flash_test AS OF TIMESTAMP TO_TIMESTAMP ('05272009:07:13:16','MMDDYYYY:HH24:MI:SS');

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  通过第一个测试,我们发现了即使没有开启归档日志模式,闪回查询也是可用的,并发现闪回查询实际上是针对物理结构的,如undo和重做日志。

  =================================================

  Test : Normal processing

  : Bounce the database

  : _in_memory_undo=true

  =================================================

  现在有个问题是:“实例关闭和启动后闪回查询还有效吗?”,很快你就会看到,和清除共享池和缓冲区命令一道还有dbshut和dbstart命令,最终,闪回查询正如手册描述那样不能正常工作了。

  现在要理解两个东西,一个就是闪回查询不能跨实例关闭和实例启动而正常工作,但值得注意的是这里没有必要清除共享池和缓冲区,如果忽略掉这两个清洗操作,闪回查询仍然不能正常工作,在这里可以和另一个情景,即 _in_memory_undo设置为flase进行对比,因此继续阅读.......

[oracle@ludwig ~]$ dbshut

  ORACLE_HOME_LISTNER
is not SET, unable to auto-stop Oracle Net Listener

  Usage:
/opt/app/oracle/product/11.1.0/db_1/bin/dbshut ORACLE_HOME

  Processing
Database instance "db11FS": log file /opt/app/oracle/product/11.1.0/db_1/shutdown.log

  
[oracle@ludwig ~]$ dbstart

  ORACLE_HOME_LISTNER
is not SET, unable to auto-start Oracle Net Listener

  Usage:
/opt/app/oracle/product/11.1.0/db_1/bin/dbstart ORACLE_HOME

  Processing
Database instance "db11FS": log file /opt/app/oracle/product/11.1.0/db_1/startup.log

  
alter system flush shared_pool;

  
alter system flush buffer_cache;

  SQL
> select * from flash_test;

  COL1

  
----------

  
1

  
2

  
3

  
4

  
5

  
6

  
7

  
8

  
9

  
10

  
10 rows selected.

  SQL
> SELECT * FROM flash_test AS OF TIMESTAMP TO_TIMESTAMP ('05272009:07:13:16','MMDDYYYY:HH24:MI:SS');

  
SELECT * FROM flash_test AS OF TIMESTAMP TO_TIMESTAMP ('05272009:07:13:16','MMDDYYYY:HH24:MI:SS')

  
*

  ERROR at line
1:

  ORA
-01466: unable to read data - table definition has changed
0
相关文章