暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,SCN与时间如何相互转换?

DB宝 2020-04-14
3840


题目部分

在Oracle中,SCN与时间如何相互转换?


     

答案部分


一个SCN值总是发生在某一个特定的时刻,只不过由于粒度的不一样,通常会存在多个SCN对应同一个时间戳的情况。Oracle 10g提供了两个新函数用于SCN和时间戳进行相互转换,这两个函数分别是SCN_TO_TIMESTAMPTIMESTAMP_TO_SCN,通过对SCN和时间戳进行转换,极大地方便了Oracle很多备份和恢复过程:

SCN_TO_TIMESTAMP(scn_number):将SCN转换成时间戳。

TIMESTAMP_TO_SCN(timestamp):将时间戳转换成SCN

通过以上这两个函数,最终OracleSCN和时间的关系建立起来,在Oracle 10g之前,是没有办法通过函数转换得到SCN和时间的对应关系的,一般可以通过LogMiner分析日志获得。但是这两种函数转换要依赖于数据库内部表SMON_SCN_TIME,对于久远的SCN则不能转换。请看以下示例:

 1SYS@lhrdb> SELECT MIN(SCNFROM SMON_SCN_TIME;
2  MIN(SCN)
3----------
4   8622517
5SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8622517TIMESTAMP FROM DUAL;
6TIMESTAMP
7---------------------------------------------------------------------------
808-OCT-16 04.30.26.000000000 AM
9SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8622516TIMESTAMP FROM DUAL;
10 SELECT SCN_TO_TIMESTAMP(8622516TIMESTAMP FROM DUAL
11        *
12ERROR at line 1:
13ORA-08181: specified number is not a valid system change number
14ORA-06512at "SYS.SCN_TO_TIMESTAMP", line 1

从上面的例子可以看出,Oracle能够转换的最小SCN也就是SMON_SCN_TIMESCN列的最小值。

 1SYS@lhrdb> SELECT SCN_TO_TIMESTAMP(8763206SCN 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:40','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
10       SCN
11----------
12   8763206
13SYS@lhrdb> SELECT TO_CHAR(SCN_TO_TIMESTAMP(8763206), 'YYYY-MM-DD HH24:MI:SS') CHR_DATE,TIMESTAMP_TO_SCN(SCN_TO_TIMESTAMP(8763206)) DT FROM DUAL;
14CHR_DATE                    DT
15------------------- ----------
162016-10-10 17:22:40    8763206

对于时间到SCN的转换,Oracle只能定位到3秒以内,3秒内的时间都被转换成同一个SCN

 1SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:40','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
2       SCN
3----------
4   8763206
5SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:41','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
6       SCN
7----------
8   8763206
9SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:42','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
10       SCN
11----------
12   8763206
13SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:43','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
14       SCN
15----------
16   8763213
17SYS@lhrdb> SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2016-10-10 17:22:39','YYYY-MM-DD HH24:MI:SS')) SCN FROM DUAL;
18       SCN
19----------
20   8763205

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗



---------------优质麦课------------

详细内容可以添加麦老师微信或QQ私聊。



About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

DBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。


文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论