[20170310]关于在线日志与归档3.txt
--//当日志写满了,或者执行手工了切换,再或者rman备份时有时也会触发日志切换:
alter system switch logfile ;
alter system archive log current ;
--//前面已经探究日志文件的OS块(第0块)以及日志文件头块(第1块).剩下日志记录了
--//本文简单探究日志归档是如何保存的.探查日志文件的记录.
1.环境:
--//启动到mount状态.
SYS@book> @ &r/ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SYS@book> @ &r/logfile
GROUP# STATUS TYPE MEMBER IS_ GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
------ ---------- ---------- ------------------------------- --- ------ ------- --------- ----------- --------- ------- --- ---------- ------------- ------------------- ------------ -------------------
1 ONLINE /mnt/ramdisk/book/redo01.log NO 1 1 695 52428800 512 1 YES INACTIVE 13276910949 2017-02-28 14:40:12 13276931102 2017-03-09 10:01:48
2 ONLINE /mnt/ramdisk/book/redo02.log NO 2 1 696 52428800 512 1 YES INACTIVE 13276931102 2017-03-09 10:01:48 13276931986 2017-03-09 10:02:36
3 ONLINE /mnt/ramdisk/book/redo03.log NO 3 1 697 52428800 512 1 NO CURRENT 13276931986 2017-03-09 10:02:36 2.814750E+14
4 STANDBY /mnt/ramdisk/book/redostb01.log NO
5 STANDBY /mnt/ramdisk/book/redostb02.log NO
6 STANDBY /mnt/ramdisk/book/redostb03.log NO
7 STANDBY /mnt/ramdisk/book/redostb04.log NO
7 rows selected.
--//仅仅拿seq#=696 来研究.
$ ls -l /mnt/ramdisk/book/redo02.log /u01/app/oracle/archivelog/book/1_696_896605872.dbf
-rw-r----- 1 oracle oinstall 52429312 2017-03-09 10:02:36 /mnt/ramdisk/book/redo02.log
-rw-r----- 1 oracle oinstall 1626112 2017-03-09 10:02:38 /u01/app/oracle/archivelog/book/1_696_896605872.dbf
--//前面我们探查了日志文件的OS块.下面将继续探究日志的记录从第2块开始.
2.先取第2块看看:
$ dd if=/u01/app/oracle/archivelog/book/1_696_896605872.dbf bs=512 count=1 skip=2 2>/dev/null | md5sum
d8c6fc00e84b8eff93ecad9ff87627c7 -
$ dd if=/mnt/ramdisk/book/redo02.log bs=512 count=1 skip=2 2>/dev/null | md5sum
d8c6fc00e84b8eff93ecad9ff87627c7 -
--//md5一样,哈哈下面就基本就是原始的拷贝了.也就是不做任何修改.
--//1626112/512=3176,跳过前面2块,就是3174块.
$ dd if=/u01/app/oracle/archivelog/book/1_696_896605872.dbf bs=512 skip=2 2>/dev/null | md5sum
62f6d618e02ed3e7ba50ed68138fe440 -
$ dd if=/u01/app/oracle/archivelog/book/1_696_896605872.dbf bs=512 count=3174 skip=2 2>/dev/null | md5sum
62f6d618e02ed3e7ba50ed68138fe440 -
$ dd if=/mnt/ramdisk/book/redo02.log bs=512 count=3174 skip=2 2>/dev/null| md5sum
62f6d618e02ed3e7ba50ed68138fe440 -
--//可以看出第2块的redo记录开始就是简单的拷贝.
3.这样就可以产生一个恢复思路,假设redo损坏,我该日志已经归档日志文件,可以利用这个文件重新构造在线日志:
--//A.第0块修改就是记录块数量. 偏移0x18~0x1B处.
实际上只要大小一样,文件头可以使用别的好的文件头文件替换.
$ dd if=/mnt/ramdisk/book/redo01.log bs=512 count=1 2>/dev/null| md5sum
1e958fb94196354fc1d7a650b43d728b -
$ dd if=/mnt/ramdisk/book/redo02.log bs=512 count=1 2>/dev/null| md5sum
1e958fb94196354fc1d7a650b43d728b -
$ dd if=/mnt/ramdisk/book/redo03.log bs=512 count=1 2>/dev/null| md5sum
1e958fb94196354fc1d7a650b43d728b -
$ dd if=/mnt/ramdisk/book/redostb01.log bs=512 count=1 2>/dev/null| md5sum
1e958fb94196354fc1d7a650b43d728b -
--//你可以发现os块,md5都是一样(因为日志文件大小一样)
B.第1块我感觉不改也可以通过.
C.日志记录就是简单拷贝,根本不需要改动.剩下就是空白块如何填充.
$ ls -l /mnt/ramdisk/book/redo02.log /u01/app/oracle/archivelog/book/1_696_896605872.dbf
-rw-r----- 1 oracle oinstall 52429312 2017-03-09 10:02:36 /mnt/ramdisk/book/redo02.log
-rw-r----- 1 oracle oinstall 1626112 2017-03-09 10:02:38 /u01/app/oracle/archivelog/book/1_696_896605872.dbf
--//52429312 - 1626112=50803200,还有50803200/512=99225块需要 补充.主要这个如何实现.
--//直接使用空白是否可行,留下下次测试....