oracle10个提供了这两个函数,用于SCN与时间之间的转换:
现在来看看用法:
1.获取当前数据文件检查点的SCN:
-
select file#,to_char(creation_time,'yyyy-mm-dd hh24:mi:ss') creat_time,CHECKPOINT_CHANGE#,to_char(CHECKPOINT_TIME,'yyyy-mm-dd hh24:mi:ss') "检查点时间" from v$datafile;;
FILE#|CREAT_TIME |CHECKPOINT_CHANGE#|检查点时间
----------|-------------------|------------------|-------------------
1|2013-02-06 17:15:16| 4385180|2013-05-04 17:52:20
2|2013-02-06 17:15:38| 4385180|2013-05-04 17:52:20
3|2013-02-06 17:15:54| 4385180|2013-05-04 17:52:20
4|2013-02-06 17:16:17| 4385180|2013-05-04 17:52:20
5|2013-02-13 08:36:03| 4385180|2013-05-04 17:52:20
6|2013-02-13 12:13:07| 4385180|2013-05-04 17:52:20
7|2013-02-13 12:53:08| 4385180|2013-05-04 17:52:20
8|2013-02-15 15:58:03| 4385180|2013-05-04 17:52:20
9|2013-02-15 16:17:37| 4385180|2013-05-04 17:52:20
10|2013-04-20 21:32:43| 4385180|2013-05-04 17:52:20
实际上面的
CHECKPOINT_TIME就已经是检查点的时间了,但是它只是记录了检查点scn的时间,scn_to_timestamp与 timestamp_to_scn函数则可以对不是检查点的scn和时间进行转换
2. 把scn转换为时间:
-
SYS AS SYSDBA >select (scn_to_timestamp(4385182)) scn from dual;
-
-
SCN
-
---------------------------------------------------------------------------
-
04-5月 -13 05.52.23.000000000 下午
3. 现在把时间转换为scn:
-
SYS AS SYSDBA >select timestamp_to_scn('04-5月 -13 05.52.23.000000000 下午') scn from dual;
-
-
SCN
-
----------
-
4385182
-
-
Elapsed: 00:00:00.01
需要注意的是,转换的时间和scn都必须要在oracle系统的scn记录范围内,否则报错:
SYS AS SYSDBA >select (scn_to_timestamp(438518)) scn from dual;
select (scn_to_timestamp(438518)) scn from dual
*
ERROR at line 1:
ORA-08181: 指定的编号不是有效的系统更改号
ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1
4. 看看系统可以转换的scn:
看看最大的scn
-
SYS AS SYSDBA >select current_scn from v$database;
CURRENT_SCN
-----------
4389007
每查询一次,这个值都在涨,那么实际的可以转换的scn应该是可以比这个大一些的(dbms_flashback.get_system_change_number也可以查询)。
看看最小的SCN,网上说可以从视图sys.smon_scn_time获取,但是我发现获取的也会报上面的错。求解!!
阅读(3917) | 评论(0) | 转发(0) |