数据文件的CREATION_TIME来源和算法
浏览:3963次 出处信息
对ORACLE比较熟悉的人都知道v$datafile.CREATION_TIME和v$datafile_header.CREATION_TIME这两个列都是表示数据文件的创建时间,而根据我们的经验可以知道几点:
1.当v$datafile.CREATION_TIME与v$datafile_header.CREATION_TIME不一致时数据库不能正常启动
2.v$datafile.CREATION_TIME的值来源于v$datafile_header.CREATION_TIME
3.而v$datafile_header.CREATION_TIME的值来源于数据文件头的块中的信息
现在就出现一个问题,数据块中的kcvfhcrt是一个16进制的数,如何实现在v$datafile和v$datafile_header中转为为了数据文件创建的日期
数据文件中存储创建数据文件日期内容
ub4 kcvfhcrt @108 0x2c67319c
v$datafile.CREATION_TIME值
SQL> select to_char(CREATION_TIME,\'yyyy-mm-dd hh24:mi:ss\') xifenfei 2 from v$datafile where file#=1; XIFENFEI ------------------- 2011-03-05 05:26:52
如何通过kcvfhcrt值推算出来CREATION_TIME或者通过CREATION_TIME推断出来kcvfhcrt的值规则:
熟悉数据库SCN计数原理的人都知道,我们现在使用的数据库是从1988/01/01 00:00:00开始记录SCN,也就是说我们的数据库的使用最早时间只能是从1988年元旦凌晨开始,那么也就是说数据库记录的创建时间可以采用这个时间点为起点,然后每增加一秒,数据库的kcvfhcrt就增加1,但是ORACLE为了计算简便,每个月按照31天计算
通过时间推算出来kcvfhcrt值
--数据库记录时间起点 1988/01/01 00:00:00 --当前数据文件创建日志 2011/03/05 05:26:52 --两者相差时间 23年02月04日05时26分52秒 --计算相差秒 23*12*31*24*60*60+2*31*24*60*60+4*24*60*60+5*60*60+26*60+52=744960412 --kcvfhcrt值转换 2c67319c(16进制)=744960412(10进制)
通过kcvfhcrt计算CREATION_TIME值
SQL> select to_number('2c67319c','xxxxxxxxxxx') from dual; TO_NUMBER('2C67319C','XXXXXXXXXXX') ----------------------------------- 744960412 SQL> select 744960412/(12*31*24*60*60) from dual; 744960412/(12*31*24*60*60) -------------------------- 23.1780295 SQL> select mod(744960412,(12*31*24*60*60)) from dual; MOD(744960412,(12*31*24*60*60)) ------------------------------- 5722012 SQL> select 5722012/(31*24*60*60) from dual; 5722012/(31*24*60*60) --------------------- 2.13635454 SQL> select mod(5722012,(31*24*60*60)) from dual; MOD(5722012,(31*24*60*60)) -------------------------- 365212 SQL> select 365212/(24*60*60) from dual; 365212/(24*60*60) ----------------- 4.22699074 SQL> select mod(365212,(24*60*60)) from dual; MOD(365212,(24*60*60)) ---------------------- 19612 SQL> select 19612/(60*60) from dual; 19612/(60*60) ------------- 5.44777778 SQL> select mod(19612,(60*60)) from dual; MOD(19612,(60*60)) ------------------ 1612 SQL> select 1612/60 from dual; 1612/60 ---------- 26.8666667 SQL> select mod(1612,60) from dual; MOD(1612,60) ------------ 52 从这里可以得出23年2月4天5时26分52秒,与1988年01月01日00时00分00秒相加得到 2011年03月05日 5:26:52 SQL> select to_char(CREATION_TIME,\'yyyy-mm-dd hh24:mi:ss\') from v$datafile where file#=1; TO_CHAR(CREATION_TI ------------------- 2011-03-05 05:26:52
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:ORACEL RAC 字符集
后一篇:如何验证SQL PROFILE的性能? >>
文章信息
- 作者:惜分飞 来源: 惜分飞
- 标签: CREATION_TIME
- 发布时间:2012-11-13 13:50:00
近3天十大热文
- [56] Oracle MTS模式下 进程地址与会话信
- [56] IOS安全–浅谈关于IOS加固的几种方法
- [55] 如何拿下简短的域名
- [54] 图书馆的世界纪录
- [52] Go Reflect 性能
- [52] android 开发入门
- [50] 读书笔记-壹百度:百度十年千倍的29条法则
- [49] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑