1.首先了解什么是SCN?
时间换算过来的一个递增数字;保证了数据的一致性!不用时间省去比较的麻烦所以用scn!
当前scn号和时间的对应关系:
sys@WENCHAOD> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)------------------------ --------------------------------------------------------------------------- 1387175 12-MAR-14 11.35.56.000000000 AMsys@WENCHAOD>
查询当前scn:
sys@WENCHAOD> select CURRENT_SCN from v$database;CURRENT_SCN----------- 1386439
但实际上,Oracle 在内部并不是用数字来存储SCN的。
在Oracle内部,SCN分为两部分存储,分别称之为scn wrap和scn base。实际上SCN长度为48位,即它其实就是一个48位的整数。只不过可能是由于在早些年通常只能处理32位甚至是16位的数据,所以人为地分成了低32位(scnbase)和高16位(scn wrap)。
为什么不设计成64位,这个或许是觉得48位已经足够长了并且为了节省两个字节的空间:)。那么SCN这个48位长的整数,最大就是2^48(2的48次方, 281万亿,281474976710656),很大的一个数字了。
这里有一个重要的公式:
SCN= (SCN_WRAP* 4294967296) + SCN_BAS
根据上面的公式,可以计算出SCN的数据值。
在很多与我们事务相关的记录中都是记录SCN WRAP 和 SCN BASE.
sys@WENCHAOD> select START_SCNB,START_SCNW from v$transaction;START_SCNB START_SCNW---------- ---------- 0 0sys@WENCHAOD> desc smon_scn_time; Name Null? Type ----------------------------------------------------- -------- ------------------------------------ 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 NUMBERsys@WENCHAOD>在数据库中那些地方用了scn号:
控制文件中针对每一个dbf文件有一个scn号(fscn)和一个结束scn(escn )号,在dbf文件头部有个start scn号 ---->为了保证文件的一致性!
开始时fscn=start scn,end scn为空!
sys@WENCHAOD> select checkpoint_change# from v$database;CHECKPOINT_CHANGE#------------------ 1360194sys@WENCHAOD> select name ,checkpoint_change# from v$datafile;NAME----------------------------------------------------------------------------------------------------CHECKPOINT_CHANGE#------------------/u01/app/oracle/oradata/wenchaodb/system01.dbf 1360194/u01/app/oracle/oradata/wenchaodb/sysaux01.dbf 1360194/u01/app/oracle/oradata/wenchaodb/undotbs01.dbf 1360194/u01/app/oracle/oradata/wenchaodb/users01.dbf 1360194/u01/app/oracle/oradata/wenchaodb/example01.dbf 1360194sys@WENCHAOD> select name,last_change# from v$datafile;NAME----------------------------------------------------------------------------------------------------LAST_CHANGE#------------/u01/app/oracle/oradata/wenchaodb/system01.dbf/u01/app/oracle/oradata/wenchaodb/sysaux01.dbf/u01/app/oracle/oradata/wenchaodb/undotbs01.dbf/u01/app/oracle/oradata/wenchaodb/users01.dbf/u01/app/oracle/oradata/wenchaodb/example01.dbfsys@WENCHAOD>
--数据文件头部scn号(其实和上面的scn应该相等,但是我查的时候不一样)
sys@WENCHAOD> select name ,checkpoint_change# from v$datafile_header;NAME----------------------------------------------------------------------------------------------------CHECKPOINT_CHANGE#------------------/u01/app/oracle/oradata/wenchaodb/system01.dbf 1394461/u01/app/oracle/oradata/wenchaodb/sysaux01.dbf 1394461/u01/app/oracle/oradata/wenchaodb/undotbs01.dbf 1394461/u01/app/oracle/oradata/wenchaodb/users01.dbf 1394461/u01/app/oracle/oradata/wenchaodb/example01.dbf 1394461sys@WENCHAOD>
数据库正常关闭时,buffer cache写到磁盘上,同时更新系统scn,fscn,start scn,用关闭的时间点去更新!同时将escn设为和其他的一样,,即正常关闭后四个scn一样
非正常关闭,escn为空----->需要实例恢复,,,,其他三个一样,,
1.需要redo log部分,不要归档log
如果把其中一个文件删除,换了一个备份文件,Oracle启动时发现scn不一致,使用日志去跑成一样
跑日志:---------->提升scn:----->需要归档日志和redo合起来泡成新的
全部换成是旧的会怎么样??
备份的时候,控制文件,数据文件,日志文件全部备份了------------------->不会跑日志
日志文件scn
每条日志都有scn
每个日志文件都有两个scn :firsr scn ,next scn;
sys@WENCHAOD> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE#---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- -------------FIRST_TIME NEXT_CHANGE# NEXT_TIME------------ ------------ ------------ 1 1 22 52428800 512 1 NO CURRENT 139446112-MAR-14 2.8147E+14 2 1 20 52428800 512 1 NO INACTIVE 134079911-MAR-14 1360194 12-MAR-14 3 1 21 52428800 512 1 NO INACTIVE 136019412-MAR-14 1394461 12-MAR-14sys@WENCHAOD>
下一个first就是上一个日志的next;;;可以看作first是该日志文件的第一条日志的scn号,next认为是最后一条scn!!!!
数据库正常期间:
current日志的first scn ====数据文件的scn ===比如1234567
数据库突然崩了,需要1234567后的日志去恢复,而他的日志在current里面,所有只需要current日志!!!
alter system switch_logfile ---执行两次(切换时系统及数据文件scn号不改变,他们主要的作用是表示文件的新旧程度和一致程度)
需要三个日志恢复 --------记住:需要几个根据first scn号和(系统scn号或者是数据文件scn号比较)
日志文件的三种状态:
file csn ,数据文件头部scn,系统scn===日志文件current或者是active scn号
注意:如果等于current的话,其他两个一定是inactive状态
文件 系统的scn====最老的active的scn
跑日志的时候(实例恢复)先定位到日志文件(根据文件、系统、数据文件头部的scn),再根据control文件中记录的LRBA定位到具体的日志条目!
所以检查点进程发生的时候没有更新 文件、系统、数据文件头部的scn
总结一下:
检查点进程发生的时候没有更新 文件、系统、数据文件头部的scn,只有当日志文件从active变为inactive时才会更新,end scn只有当数据库关闭的时候才会更新
以往的first ,next
sys@WENCHAOD> select * from v$log_history where rownum<6; RECID STAMP THREAD# SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE#---------- ---------- ---------- ---------- ------------- ------------ ------------RESETLOGS_CHANGE# RESETLOGS_TI----------------- ------------ 1 839953789 1 1 945184 19-FEB-14 979310 945184 19-FEB-14 2 839953822 1 2 979310 19-FEB-14 985045 945184 19-FEB-14 3 839953958 1 3 985045 19-FEB-14 994949 945184 19-FEB-14 4 839954066 1 4 994949 19-FEB-14 1011501 945184 19-FEB-14 5 839954709 1 5 1011501 19-FEB-14 1020035 945184 19-FEB-14sys@WENCHAOD> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE#---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- -------------FIRST_TIME NEXT_CHANGE# NEXT_TIME------------ ------------ ------------ 1 1 22 52428800 512 1 NO CURRENT 139446112-MAR-14 2.8147E+14 2 1 20 52428800 512 1 NO INACTIVE 134079911-MAR-14 1360194 12-MAR-14 3 1 21 52428800 512 1 NO INACTIVE 136019412-MAR-14 1394461 12-MAR-14sys@WENCHAOD> select * from v$archived_log;no rows selectedsys@WENCHAOD>
2.什么是检查点队列
buffer cache ,里面单独有块区域存放链(chain),把buffer链起来!LRU,,LRUW(脏块的访问频率,冷端,热端),CBC。(Google)。。,,为了组织管理小buffer !还有一种链叫检查点队列链,check point chain(按照块第一次脏的时间)!该链上,脏块!
CKPT两种工作方式:1:完全检查点:ckpt触发dbwr将所有的脏块写到磁盘上!!!!关闭数据库时触发
2:增量检查点:ckpt将检查点队列链上的第一块的LRBA地址记录到控制文件中!!!!每隔3秒触发!!如果发现脏块太多,IO不是很忙,结合这两个因素触发dbwr,缩短chain!
select cpdrt,cplrba_seq||'.'||cplrba_bno||'.'||cplrba_bof "low RBA",cpodr_seq||'.'||cpodr_bno||'.'||cpodr_bof "on disk RBA",cpods,cpodt,cphbt from x$kcccp ;
--cpdrt:检查点队列中脏块的数目
--cpods:on disk rba的scn
--cpodt:on disk rba的时间戳
--cphbt:心跳
sys@WENCHAOD> alter system flush buffer_cache; --清除所有脏块
3.实例恢复
4.事务,回滚详解
事务开始:
undo表空间
sys@WENCHAOD> show parameter undo_tableNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_tablespace string UNDOTBS1sys@WENCHAOD>undo表空间占用空间情况以及数据文件存放位置
sys@WENCHAOD> select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like '%UNDO%';FILE_NAME----------------------------------------------------------------------------------------------------BYTES/1024/1024---------------/u01/app/oracle/oradata/wenchaodb/undotbs01.dbf 90sys@WENCHAOD>undo段:
sys@WENCHAOD> select * from v$rollname; USN NAME---------- ------------------------------ 0 SYSTEM 1 _SYSSMU1_3780397527$ 2 _SYSSMU2_2232571081$ 3 _SYSSMU3_2097677531$ 4 _SYSSMU4_1152005954$ 5 _SYSSMU5_1527469038$ 6 _SYSSMU6_2443381498$ 7 _SYSSMU7_3286610060$ 8 _SYSSMU8_2012382730$ 9 _SYSSMU9_1424341975$ 10 _SYSSMU10_3550978943$11 rows selected.sys@WENCHAOD>1到10在undo表空间里面,0 在系统表空间里面!!
sys@WENCHAOD> show parameter undoNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_tablespace string UNDOTBS1sys@WENCHAOD>
undo作用,如何使用?undo表空间该设多大??
sys@WENCHAOD> select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; USN XACTS RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024 SHRINKS---------- ---------- --------------------- ---------------------- ---------- 0 0 .000358582 .000358582 0 1 0 .001091003 .002067566 1 5 0 .001091003 .002067566 2 9 0 .001091003 .004997253 1 6 0 .001091003 .002067566 1 10 0 .001091003 .003044128 1 8 0 .002067566 .023551941 6 7 0 .002067566 .003044128 1 4 0 .002067566 .005973816 2 3 0 .002067566 .002067566 1 2 0 .002067566 .002128601 111 rows selected.sys@WENCHAOD>显示undo区的状态信息
sys@WENCHAOD> select extent_id,bytes,status from dba_undo_extents where segment_name like '%SYSSMU%'; EXTENT_ID BYTES STATUS---------- ---------- --------- 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 EXPIRED 3 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 3 1048576 EXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 3 1048576 EXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 3 1048576 EXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 EXPIRED 3 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 UNEXPIRED35 rows selected.sys@WENCHAOD>