Oracle的SCN可以說是一個遞增的無窮大的數字。
系統 SCN:系統SCN是一個全局的,比如日志切換時,一般會在三秒更新一個SCN(因为LGWR每隔3秒写一次),文件級別的變化不會影響到系統SCN的改變,比如將表空間設置為只讀狀態。
Start SCN:數據文件頭SCN,除了這個存放在數據文件中,其他的SCN都存放在控制文件中,儅發生系統級別和文件級別的檢查點后,這時的SCN不僅要記錄在控制文件中,也要記錄在數據文件中。
Stop SCN:每一個數據文件都有一個結束SCN,只要數據文件是在綫的而且是可讀寫的,數據文件的SCN都爲null,所以說這也是爲什麽關閉中的數據庫都有結束SCN,因爲此時的數據文件都不可寫。
數據文件SCN:數據文件SCN包括全局範圍的,比如日志切換,和文件級別的,比如將表空間設置為只讀狀態,將數據文件設置爲離綫狀態,或者begin backup的時候都會影響到數據文件SCN的變化。在控制文件中,記錄著每一個數據文件的數據文件SCN和結束SCN。
儅將數據文件設置為offline,這個時候會產生一個stopSCN,然而在數據文件離綫期間,如果更新,或者插入,刪除了數據,系統還是會產生新的SCN,儅將數據文件設置為online狀態后,數據庫會根據stop scn和最新next scn去恢復數據文件的内容,以此來做到同步更新。但是如果長時間離綫,數據文件可能不會恢復,因爲重做日志文件的記錄會被覆蓋。
在數據文件離綫期間,對數據庫所作的更改會記錄到其他的數據文件。但是如果在此時數據文件中還有沒有提交的事務,那麽在online后會根據stopSCN更新的。
備份表空間的時候會產生檢查點,被設置begin backup設置成備份狀態的表空間是只讀的,不能進行寫操作。但是,可以進行讀操作。這是因為在備份期間,數據庫需要保護數據的完整性,因此只允許讀取操作,而不允許寫入操作。一旦備份完成,表空間將恢復為正常的讀寫狀態。
首先有一個LGWR進程,這個進程就是把每一個提交的事務記錄在重做日志文件。每一個事務都有一個唯一的SCN。在事務commit時重做日志緩衝區中記錄的所有對事務的更改都会被写进redo log,所以每提交一笔redo log都会记录事务的SCN。
如果在事务提交时發生了一次日志切換,那么这个事务的SCN就會是被切換日志的last SCN,也是當前日志的next SCN。
如果事务还没提交的时候就发生了日志切换,因为此时事务还没提交,所以next SCN还是记录的上一个提交的事务的SCN。当前正在更改的事务还没有提交,但是已经写到数据文件中去了。
如果此时我发现我对事务的更改写错了,想要回滚,那该怎么办呢?
因为undo 段里面记录了事务更改前的数据,每一个事务都有一个SCN,就可以从undo段中找到事务的SCN,然后找到redo log中的next SCN,此时这两个SCN肯定时对不上的,以redo log的SCN为标准进行回滚。
redo log中记录了系统的最新SCN, 如果現在實習崩潰需要進行恢復。首先需要查看一下系統當前的SCN,然後再查看一下當前日志文件的next SCN。需要恢復的就是這一段數據。
当日志切换或发生checkpoint时,从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中(这里说明以下,因为redo log记录的是对数据的更改,所以自然在脏数据被写入数据文件的同时也就说明这些数据的更改部分也就被永久保存),而CKPT进程则将所有数据文件的文件头上记录的Start SCN更新为Next SCN,同时将控制文件中的System Checkpoint SCN、每个数据文件对应的Datafile Checkpoint也更新为Next SCN。但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。所以这也就说明检查点事件发生,除了stop SCN,其他的SCN都会变成一样。
什么是实例恢复:oracle会自动恢复
实例恢复的两个步骤:
- 利用redo log前滚,不管事务有没有提交,都把里面做的步骤都做一遍
- 利用 undo 进行回滚,把没有提交的事务回滚
实例恢复开始点:最近一次检查点发生之后,直到redo log的最后一条记录。
根据需要来设定检查点发生的时间,如果要求实例恢复的时间是10分钟,那么需要将这个参数的值设定为10分钟。检查点是大型的操作,如果检查点发生得太频繁,数据库性能的波动就会比较大。
FAST_START_MTTR_TARGET=600设定检查点每10分钟发生一次
什么叫做检查点?检查点和实例恢复有什么关系?
检查点就是定期的保存数据更改的结果,给DBWR一个信号,促使oracle将藏块中的信息写到数据文件。
检查点发生的间隔决定了实例恢复的时间。检查点发生的目的就是阶段性的保存数据更改的结果。
数据块是由哪个事务修改的需要被记录下来,由redo log 完成。
事务commit LGWR就会去写。每隔三秒要写,达到三分之一要写,在DBWR写之前要写,数据库正常关闭要写。