a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 44|回复: 0

[综合] SQLcodeoracle日期函数集锦2

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
SQLcodeoracle日期函数集锦2
) S5 l- ]0 J/ V6 E# t0 o1 `, VSCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上述功能。8 Z4 J/ e  n: `( I# ?7 W4 v, p! t" E" g
在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的:1、事务开始;2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。# k' x" A  i! k( T. K! |
经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DG、streams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。
  ?% d: p  Q! F6 X2 C; WSCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。
$ M. x" @1 `! ~8 D7 q5 ^这四个分别是:1.System Checkpoint SCN当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:select checkpoint_change# from v$database;2.Datafile Checkpoint SCN当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。* x8 g* r* Z8 B) W
select name,checkpoint_change# from v$datafile;3.Start SCN号ORACLE将Start SCN号存放在数据文件头中。
7 c4 k! x7 P) z- l$ T这个SCN用于检查数据库启动过程是否需要做Media Recovery.我们可以通过以下SQL语句查询:select name,checkpoint_change# from v$datafile_header;4.End SCN (Stop SCN)号ORACLE将End SCN号存放在控制文件中。
: ^  D2 O/ ]! A0 h4 D. L9 Y. I- ?这个SCN号用于检查数据库启动过程是否需要做Instance Recovery.我们可以通过以下SQL语句查询:select name,last_change# from v$datafile;在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL. SCN号与数据库启动在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有一个不同时,则需要做media recovery.如果在启动的过程中,End SCN号为NULL,则需要做instance recovery.ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery. SCN号与数据库关闭如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。
2 P$ h; e: ^6 e- t$ x当数据库启动时,发现它们是一致的,则不需要做instance recovery.在数据库正常启动后,ORACLE会将END SCN号设置为NULL.如果数据库异常关闭的话,则END SCN号将为NULL.为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN号?5 n: ?( B9 p% p$ L5 A
原因有二:1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。
, E% {- A3 l+ ~2 s+ w! K这三个SCN在表空间处于只读期间都将被冻结。3 a- u- s6 K, U! f4 i
2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。/ u! v) B/ j% ~( g9 t* q+ p
Recovery database using backup controlfile当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile.这是为什么需要记录SystemCheckpoint SCN的原因之一。
% y" s* E6 j. a' I" a) h2 i这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN.根据上述的描述,此时需要采用using backup controlfile做recovery.那系统是如何产生一个最新的SCN的?实际上,这个数字是由当时的timestamp转换过来的。每当需要产生一个最新的SCN到redo记录时,系统获取当时的timestamp,将其转换为数字作为SCN.可以通过函数SCN_TO_TIMESTAMP(10g以后)将其转换回timestamp:select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;也可以用函数timestamp_to_scn将一个timestamp转换为SCN:select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;如果你想把DATE类型转换成TIMESTAMP类型,就使用CAST函数。
7 {5 N! P& G& o6 w6 ^6 \select cast(sysdate as timestamp) from dual;
4 s. i; r! o8 Y2 f6 p$ ]9 IOracle SCN 实现机制总结author:润明 2012-2-4 QQ:226399587 http://blog.csdn.net/runming918 SCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上述功能。9 @3 D3 r* u' X4 Y4 _9 M. O
在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的:1、事务开始;2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。
! p% R7 y8 X6 ]" j. g经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DG、streams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。
! N4 z+ M. U! ]6 eSCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。
  X) H$ w$ I( s$ R. M2 l' G5 y1 u这四个分别是:1.System Checkpoint SCN当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:select checkpoint_change# from v$database;2.Datafile Checkpoint SCN当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。+ n" \: ~1 t: `: S) \$ L' b5 `  V1 D
select name,checkpoint_change# from v$datafile;3.Start SCN号ORACLE将Start SCN号存放在数据文件头中。1 P' p  `+ x- _8 L! P, k
这个SCN用于检查数据库启动过程是否需要做Media Recovery.我们可以通过以下SQL语句查询:select name,checkpoint_change# from v$datafile_header;4.End SCN (Stop SCN)号ORACLE将End SCN号存放在控制文件中。, Z) N' ^% d  U4 E# [0 x' r4 Q
这个SCN号用于检查数据库启动过程是否需要做Instance Recovery.我们可以通过以下SQL语句查询:select name,last_change# from v$datafile;在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL. SCN号与数据库启动在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有一个不同时,则需要做media recovery.如果在启动的过程中,End SCN号为NULL,则需要做instance recovery.ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery. SCN号与数据库关闭如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。0 D' L- K7 w6 V1 }
当数据库启动时,发现它们是一致的,则不需要做instance recovery.在数据库正常启动后,ORACLE会将END SCN号设置为NULL.如果数据库异常关闭的话,则END SCN号将为NULL.为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN号?
3 s! n! R0 c, y' z原因有二:1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。
+ y! @$ V% [/ y  V  ~6 e# }这三个SCN在表空间处于只读期间都将被冻结。! Q) l* |( T- n
2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。8 w) \- Q0 q3 c' I0 j8 s  S0 Z
Recovery database using backup controlfile当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile.这是为什么需要记录SystemCheckpoint SCN的原因之一。* N, m  D7 ]6 O7 \
这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN.根据上述的描述,此时需要采用using backup controlfile做recovery.那系统是如何产生一个最新的SCN的?实际上,这个数字是由当时的timestamp转换过来的。每当需要产生一个最新的SCN到redo记录时,系统获取当时的timestamp,将其转换为数字作为SCN.可以通过函数SCN_TO_TIMESTAMP(10g以后)将其转换回timestamp:select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;也可以用函数timestamp_to_scn将一个timestamp转换为SCN:select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;如果你想把DATE类型转换成TIMESTAMP类型,就使用CAST函数。
+ L4 L, c( O; @; x- Wselect cast(sysdate as timestamp) from dual;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 02:45 , Processed in 0.236813 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表