IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

数据文件的CREATION_TIME来源和算法

惜分飞 2012-11-13 13:50:00 累计浏览 4,514 次
本机暂存

   对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

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. Oracle MTS模式下 进程地址与会话信息 (累计阅读 14,403)
  2. Facebook 网站架构 (累计阅读 11,107)
  3. 腾讯php程序员面试题目答案 (累计阅读 8,970)
  4. 分布式系统的事务处理 (累计阅读 7,382)
  5. 那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼 (累计阅读 6,877)
  6. 如何设计用户登录 (累计阅读 6,642)
  7. PHP Extension开发基础 (累计阅读 6,642)
  8. MySQL 5.6 测试之 Replication(主从复制) (累计阅读 6,267)
  9. 性能测试工具sysbench简介 (累计阅读 6,022)
  10. 大于2GB的Listener.log和运行超过198天的主机上的Oracle实例 (累计阅读 5,858)