一个
SCN
值总是发生在某一个特定的时刻,只不过由于粒度的不一样,通常会存
在多个
SCN
对应同一个时间戳的情况。
Oracle 10g
提供了两个新函数用于
SCN
和时
间 戳 进 行 相 互 转 换 , 这 两 个 函 数 分 别 是
SCN_TO_TIMESTAMP
和
TIMESTAMP_TO_SCN
,通过对
SCN
和时间戳进行转换,极大地方便了
Oracle
的很多
备份和恢复过程:
SCN_TO_TIMESTAMP(scn_number)
:将
SCN
转换成时间戳。
TIMESTAMP_TO_SCN(timestamp)
:将时间戳转换成
SCN
。
通过以上这两个函数,最终
Oracle
将
SCN
和时间的关系建立起来,在
Oracle
10g
之前,是没有办法通过函数转换得到
SCN
和时间的对应关系的,一般可以通过
LogMiner
分 析 日 志 获 得 。 但 是 这 两 种 函 数 转 换 要 依 赖 于 数 据 库 内 部 表
SMON_SCN_TIME
,对于久远的
SCN
则不能转换。请看以下示例:
1SYS@lhrdb> SELECT MIN(SCN) FROM SMON_SCN_TIME;
2 MIN(SCN)
3----------
4 8622517
5SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8622517) TIMESTAMP FROM DUAL;
6TIMESTAMP
7--------------------------------------------------------------------
-------
808-OCT-16 04.30.26.000000000 AM
9SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8622516) TIMESTAMP FROM DUAL;
10 SELECT SCN_TO_TIMESTAMP(8622516) TIMESTAMP FROM DUAL
11 *
12ERROR at line 1:
13ORA-08181: specified number is not a valid system change number
14ORA-06512: at "SYS.SCN_TO_TIMESTAMP", line 1
从上面的例子可以看出,
Oracle
能够转换的最小
SCN
也就是
SMON_SCN_TIME
的
SCN
列的最小值。
1SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8763206) SCN FROM DUAL;
2SCN
3--------------------------------------------------------------------
-------
410-OCT-16 05.22.40.000000000 PM
5SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('10-OCT-16 05.22.40
.000000000 PM','DD-Mon-RR HH:MI:SS.FF AM')) SCN FROM DUAL;
6 SCN
7----------
8 8763206
9SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:4
0','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
10 SCN
11----------
评论