当前位置:  数据库>oracle

Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究

    来源: 互联网  发布时间:2017-04-09

    本文导语: 一个朋友说将DB 服务器系统时间往往后修改了3个月(从11年改成10年),启动DB报600的错误。   一. 先做个测试 1.1 关闭DB SQL> shutdown immediate Database closed. Database dismounted. Oracle instance shut down.   1.2 修改系统时间 1.2.1 现在时间 [root@...

一个朋友说将DB 服务器系统时间往往后修改了3个月(从11年改成10年),启动DB报600的错误。

 

一. 先做个测试

1.1 关闭DB

SQL> shutdown immediate

Database closed.

Database dismounted.

Oracle instance shut down.

 

1.2 修改系统时间

1.2.1 现在时间

[root@singledb ~]# date

Tue Jan 25 11:05:32 EST 2011

 

1.2.2 修改时间

将时间往前调整一下:

[root@singledb ~]# date -s  1/1/2011      

Sat Jan  1 00:00:00 EST 2011

[root@singledb ~]# date

Sat Jan  1 00:00:22 EST 2011

 

1.3启动DB

SQL> startup

ORACLE instance started.

Total System Global Area  360710144 bytes

Fixed Size                  1219424 bytes

Variable Size             117441696 bytes

Database Buffers          239075328 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

 

启动并没有问题,也没有遇到网友的600错误。

 

二.  SCN

在这里先对SCN 的知识做下说明。之前的文章里也有说明:

RedoLog Checkpoint 和 SCN关系      

 

SCN是当Oracle数据更新后,由DBMS自动维护去累积递增的一个数字。 当一个事务commit时,LGWR会将log buffer写入redo log file,同时也会将该事务的 SCN同步写入到redo log file内(wait-until-completed)。因此当你commit transaction时, 在成功的讯息返回之前,LGWR必须先完整的完成上述行为之后,否则你是看不到提交成功的响应讯息。

 

系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME。

 

SQL> desc sys.smon_scn_time

 名称                       是否为空? 类型

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

 THREAD                               NUMBER

 TIME_MP                              NUMBER

 TIME_DP                              DATE

 SCN_WRP                             NUMBER

 SCN_BAS                              NUMBER

 NUM_MAPPINGS                       NUMBER

 TIM_SCN_MAP                         RAW(1200)

 SCN                                   NUMBER

 ORIG_THREAD                         NUMBER

 

       每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入SYS.SMON_SCN_TIME 表(由SMON 进程来进行Update操作),该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,即最近5 天内的记录。

 

       对 系统时间标记与scn 的每5 分钟匹配一次 做个说明,比如:

       SCN:339988 对应 2011-01-25 17:00:00

       SCN:339989对应2011-01-25 17:05:00,

       当查询2011-01-25 17:00:00 到2011-01-25 17:04:59 这段时间点内的SCN时,oracle 都会将其匹配为SCN:339988。

 

 

查看SCN 和 timestamp 之间的对应关系:

select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time order by 2;

查询目前系统最新的SCN:

       select dbms_flashback.get_system_change_number from dual;

 

timestamp 与 SCN 互换的2个方法:

select timestamp_to_scn(to_date('2011-01-25 12:10:00','yyyy-mm-dd hh24:mi:ss')) from dual;

 

select scn_to_timestamp(351277605) from dual;

 

 

在Metalink 搜到一篇Timestamp与SCN 之间映射关系的文章,原文参考:

How to map SCN with Timestamp before 10g [ID 365536.1]

 

       However, in earlier releases, while there is a system object - SYS.SMON_SCN_TIME that will provide the SCN to TIME mapping information.   There is no conversion facility provided. 

 

       SYS.SMON_SCN_TIME will have a maximum of 1440 rows and each record will be for a 5 minute period.  Oracle maintains this information for maximum of 5 days after which the records will be recycled.

 

This means that data is stored 12 times per hour * 24 hours * 5 days=1440 rows. 

 

SCN value is stored internally as :

i. SCN_wrap

ii. SCN_base

 

       Whenever the SCN is incremented, the BASE component is incremented first unil it reaches it maximum.  Once the BASE reaches the maximum value allowed, it is initialized to zero again after incrementing the WRAP by 1.

--开始时WRAP 为0,即SCN_WRP=0. 当BASE增长到最大值后,SCN_BAS变为0. 同时SCN_WRP 增长到1

 

Using this logic, we can calculate the timestamp of the SCN as follows:

(SCN_WRP * 4294967296) + SCN_BAS should give us the SCN in the number format

--SCN 的计算公式,这里我们看出SCN 是根据SCN_BAS计算出来的。和系统时间是没有关系的。 只是方便我们来进行操作,如闪回恢复,而将SCN 和 系统时间每隔5分钟进行一次映射。 映射完后,由SMON进程将映射关系写入SMON_SCN_TIME表。 可以把SCN 看成是Oracle 内部的时间。

 

To get the time/date for an SCN value in 9i, use the following example:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

-- (a) Get the current SCN base.

SQL>select max(scn_bas) SCN_BASE from smon_scn_time;

 

1603342197

 

--(b) Get the complete SCN and the timestamp.

SQL> alter session set NLS_DATE_FORMAT='DD-MON-YY HH:MI:SS';

 

SQL> select time_dp TIMESTAMP, scn_wrp*4294967296+SCN_bas SCN from smon_scn_time where scn_bas='1603342197';

 

TIMESTAMP                 SCN

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

28-JUL-06 05:31:08        8252235517813

 

这篇文章将的是10g之前的。 在metalink上搜了半天,只找到一条区别,就是11g下smon_scn_time 存储的记录可以超过1440条。

 

在这里插一句,10g的g 表示Grid.

 

三. 修改系统时间与SCN 关系

       通过前面2节的分析,可以看出修改系统时间和SCN没有直接的关系。在第一节中也做了测试。 对于DB 服务器如何修改时间:

       (1)停止应用

       (2)停止数据库

       (3)修改时间

       不过,如果不是特殊情况,不建议修改。稳定第一。尤其是RAC 环境,对时间要求更严格。

 

       在这里说了,修改系统时间和SCN 没有直接影响,但我在测试中,发现他们是有联系的。

 

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

 

SQL> select sysdate from dual;

SYSDATE

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

2010-01-01 01:21:58

 

SQL> select * from ( select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') time from sys.smon_scn_time order by 2 desc) where rownum  select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

       945394

 

从上面的几个查询结果我们发现二个问题:

(1)smon_scn_time表中的SCN(943223) 小于系统当前的SCN值(945394)。

(2)smon_scn_time表中最后更新时间(2012-01-01 02:43:33)大于系统当前时间(2010-01-01 01:21:58)。

 

       由此我们推出一个结论:当smon_scn_time最后更新时间大于系统时间时,SMON不会将SCN 与TIMESTAMP的映射结果写入到sys.smon_scn_time表中。

 

       如果SCN 与TIMESTAMP的映射不能写入到smon_scn_time表中,我们就不能进行SCN 与TIMESTAMP转换,就不能利用timestamp进行相关的操作,如恢复。参考:

Oracle 不同故障的恢复方案      

 

 

为了验证上面的结论,我们把系统改成大于smon_scn_time最后更新时间。

 

SQL>  select sysdate from dual;

SYSDATE

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

2012-02-01 00:00:16

 

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

  946462

 

SQL> select * from ( select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') time from sys.smon_scn_time order by 2 desc) where rownum


    
 
 

您可能感兴趣的文章:

  • 深入oracle特定信息排序的分析
  • 深入理解Oracle数据库的启动和关闭
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 深入解析Oracle参数及参数文件
  • 深入探讨:Oracle中如何查询正锁表的用户以及释放被锁的表的方法
  • Oracle表连接深入浅出
  • 深入剖析哪些服务是Oracle 11g必须开启的
  • 深入分析关于Oracle数据库的备份策略
  • [Oracle] RAC 之 - 负载均衡深入解析
  • Oracle 9i数据库中动态重配置深入分析
  • 深入ORACLE变量的定义与使用的详解
  • oracle日期时间型timestamp的深入理解
  • Oracle中RAISE异常深入分析
  • 深入Oracle的left join中on和where的区别详解
  • oracle 索引不能使用深入解析
  • oracle的rownum深入解析
  • 深入探讨:oracle中row_number() over()分析函数用法
  • 深入ORACLE迁移到MYSQL的总结分析
  • 深入oracle分区索引的详解
  • 深入sql oracle递归查询
  • 修改oracle用户主目录
  • 修改oracle用户的.bash_profile之后无法正常登陆
  • 修改Oracle默认用户密码有效期时间
  • Linux下修改Oracle用户密码
  • 查询与修改Oracle字符集
  • ORACLE 修改表结构 之ALTER CONSTAINTS的使用
  • 计算机名称修改后Oracle不能正常启动问题分析及解决
  • Oracle中在pl/sql developer修改表的2种方法
  • oracle修改scott密码与解锁的方法详解
  • Oracle10g 控制台启动端口修改
  • Linux操作系统下Oracle数据库多实例启动方式及修改内存
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • oracle 和 jdk 的关系 ?
  • Oracle中的Connect/session和process的区别及关系介绍
  • Oracle中临时文件File#和Db_files关系
  • Oracle索引存储关系到数据库的运行效率
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3