是否该清除in_memory_undo?
【IT168 技术文档】
Oracle闪回查询的优点是有文档记录的,但对于那些仅有一点差别的参数,如_in_memory_undo,你应该花多少钱购买它们呢?让我们来深入地研究一下_in_memory_undo参数以及它是如何影响闪回查询的。Oracle的闪回查询技术确实设计得很独特,它让我们可以在犯错后进行恢复。使用SHOW PARAMETER undo命令可以查看_in_memory_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了
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行数据,然后查询校验现有的数据行:
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查询需要一个闪回的时间点,因此我们查询一下系统的时间戳:
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子句,我们得到了在插入数据前表的镜像,相当简单,由于某些文档没有清楚地说明闪回查询是否需要开启归档日志模式,通过实践表明,没有归档日志模式一样可以进行闪回查询。
COL1
----------
1
2
3
4
5
在前面的测试中,我发现Oracle在隐藏、存储和重建闪回查询方面做得非常巧妙,当我清洗了共享池和缓冲区后,通过闪回查询任然能够得到想要的结果。
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_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