技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Oracle --> 数据文件的CREATION_TIME来源和算法

数据文件的CREATION_TIME来源和算法

浏览:3860次  出处信息

   对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技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1