oracle的.dcp文件,【学习笔记】深入理解数据文件的CREATION_TIME来源和算法

天萃荷净

数据文件的CREATION_TIME来源和算法,运维DBA反映Oracle数据库的数据文件与数据文件头的创建时间的来源和算法

对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

1.v$datafile.CREATION_TIME值

SQL> select to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss') oracleplus

2 from v$datafile where file#=1;

oracleplus

-------------------

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进制)

2.通过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

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】深入理解数据文件的CREATION_TIME来源和算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值