從 Oracle 日誌解析學習資料庫核心原理
前言
不管現階段美國和中國對峙到何種程度,不管桀傲不馴拉里.埃裡森如何不看好中國,Oracle 仍是資料庫中的一枝獨秀。然而,他山之石可以攻玉,多個國產資料庫在關鍵技術攻關方面的整體水平也已達到國際先進。
國內越來越多的 Oracle 資料庫開始下線,遷移到開源或者國產資料上,o2k 支援實時增量的將 Oracle 資料庫增量變化抽取出來,助力國產化資料庫無縫接管 Oracle。
筆者作為資料庫核心的負責人參與實現了 o2k 來解析 Oracle 日誌,並於 2022 年 2 月 15 號把它開放出來給社群免費使用,期間經歷了各種迷茫,獲得了眾多大佬的指導,最終總算是交出了一份還算不錯的試卷。
作為一個 DBA 兼開發人員,在整個 o2k 的實現過程中,對於 Oracle 資料庫的資料庫理論和工程能力學習了很多,也進一步對資料庫原理有了進一步瞭解。
藉助 Oracle 的設計理念和實現,我們也看看是否能對新一代的資料庫從業者有一定的幫助和借鑑作用。
國內軟體由於美國的打壓,資料庫作為基礎軟體贏來了一個難得的蓬勃發展期。
曾幾何時,資料庫從業人員只是公司 IT 團隊->運維團隊裡的一個小小部門,而今一個能指導開發正確使用資料庫,選擇資料庫來適配業務來適應業務的資料架構師供不應求。
如果能掌握著資料庫原理,甚至能主動改造資料庫適配相關應用場景的人才年薪至少百萬。
作為計算機系統中的其中一粒明珠,資料庫上承業務線上離線之責,下接硬體核心之妙,看到越來越多的人才加入資料庫及資料庫核心隊伍,不勝欣慰!
本系列文章中我們將由淺入深以 Oracle 日誌解析遇到的重重阻塞為例,來介紹在資料庫中常見,而又關鍵的概念,瞭解資料庫設計思路及工程實現中需要注意的事項。
本文以淺為主,我們先簡單介紹一下資料庫的背景和 Oracle 日誌解析的基礎知識
前置知識瞭解
資料庫日誌
類似於銀行賬戶系統一樣,張三存入 100 塊錢會'先'被記錄為'張三增加 100'的流水賬,然後再把張三的賬戶從 1000 塊修改為 1100 塊。
資料庫為了保證原子性和持久化,也會'先'在 redo 日誌中記錄一筆或者多筆 redo record,然後再修改資料庫實際的行記錄
注意,這裡的“修改賬戶/修改行記錄”都是在“寫流水賬/寫日誌”之後完成的。也就是說 redo 先於“資料寫入”,這也就是著名的資料庫 write-ahead logging (WAL) 。
Oracle 寫資料庫日誌採用的是物理日誌方式,記錄的是內部資料塊的變化;MySQL 在 Server 層的 binlog 是邏輯日誌,記錄的是邏輯行資料的變化。所以對 Oracle 的日誌解析不僅需要理解日誌本身 filespace、redo record,change vector 的變化,還需要理解 Oracle 內部資料儲存的格式。
怎麼檢視 Oracle 日誌中記錄的內容
Oracle 中有專門的命令,支援將指定的二進位制 redo 日誌解析為邏輯的文字檔案,類似於 MySQL 提供的 mysqlbinlog 工具,方便使用者檢視和診斷資料庫問題。
ALTER SYSTEM DUMP LOGFILE '/opt/oracle/oradata/master1/redo01.log';
當然,這個解析出來的文字檔案也並不是那麼容易理解,下文中我們會對關鍵資訊進行解讀。
另外,這個邏輯的文字檔案也並不是把所有的二進位制 redo 日誌中的資訊都解析並輸出出來,例如 supplement log 這種,就沒有輸出
supplemental log
Oracle 預設只記錄變化的資訊,類似於 MySQL 中 binlog_row_image=minimal 的情況。
也就是說,你執行了 update t1 set c2=3 where id=2,它只會記錄 c2=3 的後映象資料和 c2=2 修改之前的前映象資料。
對於主備物理塊同步,這些資訊已經足夠了,但是對於資料倉儲或者大資料平臺,不知道到底更新的是 哪一行(id=2)的資料,是無法保持跟 Oracle 的資料一致的。
透過 alter database add supplemental log data (primary key) columns;可以讓 Oracle 在記錄日誌的時候順便把 primary key 主鍵也記錄下來,方便同步工具將變化對應到具體哪一行,這些額外增加的日誌稱為 supplemental log。
OGG,O2K 等同步工具都會要求源端 Oracle 開啟 supplemental log。
日誌組織形式
WAL 日誌是邏輯的日誌表現形式,一個 update 的事務更新了 5 行資料,會產生多個 redo record(begin,5 行記錄的前映象和後映象,commit),而這些日誌記錄到日誌檔案中是以一個 block 一個 block(預設為 512 位元組)寫到檔案中的
邏輯上,資料庫日誌是由一個一個的 redo record 組成的;
物理上,資料庫日誌檔案中每個 block 都有 Header 和 Tail,邏輯的 redo record 記錄到物理檔案中對應關係如下:
redo 和 undo
日誌記錄內容
說了這麼多理論的、務虛的東西,我們來點乾貨。
首先,我們看看我們做一個 update 一行資料到底會生成哪些日誌資訊,為了排除其他的干擾,我們在做 update 之前和之後都 switch logfile,保證我們查詢的 redo log 中只有 update 一個變更
在 Oracle 上執行的語句如下
## 這裡新建一個表用於測試 create table test1 (id number primary key, name varchar2(15) not null, hiredate date default(sysdate) ); insert into test1 (id, name) values (1, 'o2k1'); insert into test1 (id, name, hiredate) values (2, 'o2k2', sysdate); commit ## 為了排除其他的干擾,我們在做update之前和之後都switch logfile,保證我們查詢的redo log中只有update一個變更 ALTER SYSTEM SWITCH LOGFILE; update test1 set name='o2k3' where id=2; commit; ALTER SYSTEM SWITCH LOGFILE; ## 查詢到底應該從那個歸檔日誌中獲取update的變更 select * from v$archived_log; ## 將二進位制日誌反解析出來 ALTER SYSTEM DUMP LOGFILE '+SSDDG1/chenmm/archivelog/2022_05_12/thread_2_seq_114.1017.1104513037'; ## 檢視日誌被匯入到哪個trace檔案了 select value from v$diag_info where name='Default Trace File'; # 返回ora_6130.trc
這裡我們得到兩個檔案:
-
二進位制的 redo 日誌檔案"thread_2_seq_114.1017.1104513037"
-
根據這個二進位制日誌解析出來的文字檔案 ora_6130.trc
相關的內容我都放到了文末的附錄中了,大家可以自行檢視。
redo 邏輯結構
我們先從文字檔案 ora_6130.trc 入手檢視一下 redo 檔案的邏輯形式。參考 redo 邏輯格式(見附錄),可以看到
-
FILE HEADER:日誌檔案有日誌檔案的頭,記錄了 Db Id,Db Name 的資料庫資訊,也記錄了檔案大小、檔案型別以及 Blksiz=512(也就是說,redo 物理塊大小為 512 位元組),對比 redo 物理格式(見附錄)FILE HEADER 是放到第一個 512 位元組的 BLOCK 中。這裡的檔案號對應的就是日誌序號 Seq#
FILE HEADER:File Number=3, Blksiz=512, File Type=2 LOG
-
REDO HEADER:另外這裡還記錄了這是 RAC 的哪個節點,是那個序號的 redo 日誌,scn 的範圍,"Thread 0002, Seq# 0000000114, SCN 0x0000004f1aa1-0x0000004f1aa8"。對比 redo 物理格式 REDO HEADER 是放到第二個 512 位元組的 BLOCK 中
descrip:"Thread 0002, Seq# 0000000114, SCN 0x0000004f1aa1-0x0000004f1aa8" thread: 2 nab: 0x4 seq: 0x00000072 hws: 0x2 eot: 0 dis: 0
-
REDO Record:redo record 是 redo 邏輯日誌的最重要的組成部分,資料庫的更新都會記錄到一個一個的 Redo Record 中,我們執行的 update 和 commit 就被記錄成了兩個 Redo Record。一個長度為 0x0244,一個長度 0x00a4
REDO RECORD - Thread:2 RBA: 0x000072.00000002.0010 LEN: 0x0244 VLD: 0x05 ... REDO RECORD - Thread:2 RBA: 0x000072.00000003.0064 LEN: 0x00a4 VLD: 0x01
redo record
進一步分解 redo record,可以看到 redo record 又是由一個 redo header 和多個 change vector('CHANGE #?')組成
-
Redo Header:記錄了 Redo 的長度 LEN: 0x0244,redo record 的地址 RBA: 0x000072.00000002.0010,SCN:0x0000.004f1aa1 等資訊
REDO RECORD - Thread:2 RBA: 0x000072.00000002.0010 LEN: 0x0244 VLD: 0x05 SCN: 0x0000.004f1aa1 SUBSCN: 1 05/12/2022 17:10:35 (LWN RBA: 0x000072.00000002.0010 LEN: 0002 NST: 0001 SCN: 0x0000.004f1aa1)
-
Change Vector:它是資料變化的原子結構,觀察第一個 Redo Record,我們可以看到 CHANGE #1 記錄了事務開始;CHANGE #2 記錄了 update 的 undo 前映象;CHANGE #3 記錄了 update 的 redo 後映象;CHANGE #4 記錄了 session 資訊;而第二個 Redo Record 的 CHANGE #1 記錄了事務提交的資訊
CHANGE #1 TYP:0 CLS:17 AFN:3 DBA:0x00c00080 OBJ:4294967295 SCN:0x0000.004f1121 SEQ:1 OP:5.2 ENC:0 RBL:0 ktudh redo: slt: 0x0013 sqn: 0x00000648 flg: 0x0012 siz: 200 fbi: 0 uba: 0x00c00e4c.0209.23 pxid: 0x0000.000.00000000
change vector
在進一步分解 change vector,它也是有 Change Vector 的 header 和可變資料組成,在 Lewis《oracle core》中被稱為“唯一最重要的特性”。header 和可變資料的具體資訊我們在以後的文章中再詳細介紹。
這裡僅介紹幾個最關鍵的資訊:
-
opcode:OP:5.2 記錄的是事務開始,OP:5.4 記錄的是事務結束,OP:5.1 記錄的是前映象,OP:11.5 記錄的是 update 的後映象,有興趣的同學可以參考 詳細列表。
-
xid:事務號,Oracle 事務管理起始於 undo 段,並依此為中心。這也是你看到為什麼事務開始 5.2、事務結束 5.4 和 undo 記錄 5.1 都是對 Layer 5 : Transaction Undo 的操作的原因。xid 記錄的資訊從某種程度上來說記錄的就是在 undo 上佔據了哪個 slot。阿里巴巴的 GalaxyEngine 使用的 lizard 事務最佳化跟 Oracle 的事務異曲同工
CHANGE #1 TYP:0 CLS:17 AFN:3 DBA:0x00c00080 OBJ:4294967295 SCN:0x0000.004f1121 SEQ:1 OP:5.2 ENC:0 RBL:0 CHANGE #2 TYP:0 CLS:18 AFN:3 DBA:0x00c00e4c OBJ:4294967295 SCN:0x0000.004f1120 SEQ:1 OP:5.1 ENC:0 RBL:0 xid: 0x0001.013.00000648 CHANGE #3 TYP:2 CLS:1 AFN:4 DBA:0x010000ad OBJ:98733 SCN:0x0000.004f1a8c SEQ:1 OP:11.5 ENC:0 RBL:0 CHANGE #1 TYP:0 CLS:17 AFN:3 DBA:0x00c00080 OBJ:4294967295 SCN:0x0000.004f1aa1 SEQ:1 OP:5.4 ENC:0 RBL:0
undo 和 redo
這裡要專門說一下 undo 和 redo,由於 MVCC 多版本的設計:
-
對所有資料的修改,都需要記錄這個資料修改前的值,即在 undo 裡面記錄前映象。對於我們的 update 就是要記錄 name='o2k2'
-
同時,對所有資料的修改又必須先以 Redo 的方式記錄到 WAL 日誌中,也出現了在 redo 中記錄 undo 資訊的情況,即第一個 Redo Record 的 CHANGE #2 記錄了 update 的 undo 前映象。
-
如果在資料庫做恢復前滾的時候,undo 跟表資料一樣也需要恢復
也就是說,張三存了 100 塊錢,流水賬裡面記錄的不是"張三 +100",而是“ 前映象:張三 1000;後映象:張三 1100”,修改一行資料,可能只是幾個位元組的變化,但是資料庫為了保證資料恢復、讀一致性多寫了這麼多日誌,多做了這麼多事情。而如果你深入做資料庫核心,你會發現這個是一個天才的設計。由於文章篇幅問題,這裡不細講。
表和行
進一步細看的話,你可以看到前映象和後映象裡面具體改的資料,例如,前映象資料如下:
ncol: 3 nnew: 1 size: 0 col 1: [ 4] 6f 32 6b 32
這裡表示這個表有 3 列,修改了一個列,大小變化為 0,修改的是 col1,對應的四個位元組為 6f 32 6b 32,也就是 o2k2 6f 32 6b 32 是 Oracle 的資料儲存格式,跟 redo 的儲存結構關係不大。
小結
從上面的邏輯日誌可以看出來,Oracle 想要對錶更新:
-
首先要在程式中構建一個 Redo Record
-
然後構建幾個 Change Vector,包括事務開始、修改資料的前映象、修改事務的後映象等等
-
將 Redo Record 和 Change Vector 序列化到 Redo Buffer (Oracle 有專門的 LGWR 來重新整理 Redo Buffer 到日誌檔案中)
-
最後才是將 Change Vector 應用到資料塊上去,這裡來說,應用的是表還是 undo,並沒有太大區別
redo 物理結構
上面主要介紹的是 redo 的邏輯結構,是 Oracle 幫我們解析出來的,一般的疑難問題排查到這一步應該夠了,但是如果你要做日誌解析或者想要進一步深入排查,你可能會關注到底他在二進位制層面是怎麼落地的。
這個章節僅面向 1%的讀者,如果你對這塊不感興趣,可以直接跳過這個章節:)
參考附錄 redo 物理格式,這裡是將 redo 檔案複製出來以後用 Hexdump 以十六進位制格式輸出的 Oracle redo 日誌
redo file & block header
首先看第一個 block,是 file header 的 block 第一行,是 block header,每個 block 的開頭 16 個位元組記錄的都是這個 block 的 header。
對比下面的普通 block,可以看到 0x0022 是 logfile header, 0x0122 是 logfile block 第二行開始是 redo 檔案頭 file header,這裡記錄了幾個比較關鍵的資訊:“00 02 00 00”表示 0x00 00 02 00 = 512 即這個 redo log 一個 block 到底有多大(在 oracle 11.2 以後 BLOCKSIZE 可以設定為 512,1024 或者 4096), “03 00 00 00”表示 0x00 00 00 03 = 3 表示一共有 3 個 block。
00000000 00 22 00 00 00 00 c0 ff 00 00 00 00 00 00 00 00 |."....��........| 00000010 65 58 00 00 00 02 00 00 03 00 00 00 7d 7c 7b 7a |eX..........}|{z|
注意:由於我們的 Oracle 是安裝在 little endian 小端 x86 的 linux 伺服器上的,所以“00 02 00 00”表示 0x00 00 02 00 = 512 需要倒過來一下,如果你的 Oracle 跑在 Big Endian 大端的 IBM AIX 上的時候,“00 02 00 00”表示 0x00 02 00 00 = 131072 就不用倒過來了
redo record & redo block
既然知道了一個 block 的大小為 0x00000200,那第一個真正的 redo block 的起始位置開始的 block 就是 00000000+00000200=00000200,第二個就是 00000400,第三個就是 00000600
00000200 01 22 00 00 01 00 00 00 72 00 00 00 00 80 25 cd |."......r.....%�| 00000400 01 22 00 00 02 00 00 00 72 00 00 00 10 80 66 66 |."......r.....ff| 00000600 01 22 00 00 03 00 00 00 72 00 00 00 64 80 1b 9a |."......r...d...|
這裡“01 00 00 00”, “02 00 00 00” 和“03 00 00 00”就是 block 序號,表示這是第幾個塊;"72 00 00 00"=0x00000072=114 是日誌序號,對應的就是 redo 日誌空間中的 Seq#號;而"00 80", "10 80", "64 80"對應的是該 block 中第一個 redo record 相對 block 起始地址的偏移量。
00000400 起始的 redo block 的 redo record 是從“10 80”=0x8010-0x8000=0x10=16 即從 00000410"44 02 00 00..."開始就是 redo record 的位元組資訊了。
00000400 01 22 00 00 02 00 00 00 72 00 00 00 10 80 66 66 |."......r.....ff| 00000410 44 02 00 00 05 6e 00 00 a1 1a 4f 00 01 00 00 23 |D....n..�.O....#|
00000600 起始的 redo block 的 redo record 是從“64 80”=0x8064-0x8000=0x64=100 即從 00000664"a4 00 00 00..."開始就是 redo record 的位元組資訊了。
00000600 01 22 00 00 03 00 00 00 72 00 00 00 64 80 1b 9a |."......r...d...| 00000610 01 00 03 01 00 00 00 00 00 1a 4f 00 01 00 70 72 |..........O...pr| 00000620 6f 32 6b 33 05 14 00 00 00 00 00 00 00 00 00 00 |o2k3............| 00000630 00 00 00 00 00 00 00 00 00 06 00 00 12 00 04 00 |................| 00000640 00 00 02 00 04 00 04 00 00 00 00 00 03 00 4f f0 |..............O�| 00000650 2a 00 37 00 00 00 00 00 00 04 20 0b ff ff ff ff |*.7....... .����| 00000660 53 59 53 00 a4 00 00 00 01 06 00 00 a2 1a 4f 00 |SYS.�.......�.O.|
我們可以明顯看到一個 redo record 是可以跨兩個 block 的。也就是前面我們介紹的邏輯的 redo record 是可能包含在一個物理 redo block 中的,也有可能跨多個物理 redo block。
log redo header
第一個 redo block 比較特殊,"00 80"的起始 redo record 為 0。起始這個 redo block 中並沒有 redo record。而是包含了這個 redo file 的所屬例項資訊,起止 SCN 等資訊,甚至部分資訊是以純文字來記錄的“Thread 0002, Seq# 0000000114, SCN 0x0000004f1aa1-0x0000004f1aa8”
總結
綜上所述,本文簡略的介紹了 Oracle redo 的物理和邏輯格式。
一條 update 語句實際執行時,在 Oracle 上經歷的寫 undo、記錄 WAL,修改資料塊的過程;介紹了 Oracle 在二進位制 redo 日誌中把邏輯的 redo record 對應記錄到 redo block 中的。
文末一張圖,簡要總結一下他們的關係:
|附錄
redo 邏輯格式 = redo 的 trace 檔案
DUMP OF REDO FROM FILE '+SSDDG1/chenmm/archivelog/2022_05_12/thread_2_seq_114.1017.1104513037' Opcodes *.* RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff Times: creation thru eternity FILE HEADER: Compatibility Vsn = 186647552=0xb200400 Db ID=2935349816=0xaef5e238, Db Name='CHENMM' Activation ID=2935307061=0xaef53b35 Control Seq=18659=0x48e3, File size=102400=0x19000 File Number=3, Blksiz=512, File Type=2 LOG descrip:"Thread 0002, Seq# 0000000114, SCN 0x0000004f1aa1-0x0000004f1aa8" thread: 2 nab: 0x4 seq: 0x00000072 hws: 0x2 eot: 0 dis: 0 resetlogs count: 0x41a5ccfa scn: 0x0000.000e2006 (925702) prev resetlogs count: 0x3121c97a scn: 0x0000.00000001 (1) Low scn: 0x0000.004f1aa1 (5184161) 05/12/2022 17:10:35 Next scn: 0x0000.004f1aa8 (5184168) 05/12/2022 17:10:36 Enabled scn: 0x0000.001f0753 (2033491) 04/07/2022 12:21:09 Thread closed scn: 0x0000.004f1aa1 (5184161) 05/12/2022 17:10:35 Disk cksum: 0xcd25 Calc cksum: 0xcd25 Terminal recovery stop scn: 0x0000.00000000 Terminal recovery 01/01/1988 00:00:00 Most recent redo scn: 0x0000.00000000 Largest LWN: 2 blocks End-of-redo stream : No Unprotected mode Miscellaneous flags: 0x800011 Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000 Zero blocks: 8 Format ID is 2 redo log key is 5732c0d413f33575933d9e64c4ff5c6 redo log key flag is 5 Enabled redo threads: 1 2 REDO RECORD - Thread:2 RBA: 0x000072.00000002.0010 LEN: 0x0244 VLD: 0x05 SCN: 0x0000.004f1aa1 SUBSCN: 1 05/12/2022 17:10:35 (LWN RBA: 0x000072.00000002.0010 LEN: 0002 NST: 0001 SCN: 0x0000.004f1aa1) CHANGE #1 TYP:0 CLS:17 AFN:3 DBA:0x00c00080 OBJ:4294967295 SCN:0x0000.004f1121 SEQ:1 OP:5.2 ENC:0 RBL:0 ktudh redo: slt: 0x0013 sqn: 0x00000648 flg: 0x0012 siz: 200 fbi: 0 uba: 0x00c00e4c.0209.23 pxid: 0x0000.000.00000000 CHANGE #2 TYP:0 CLS:18 AFN:3 DBA:0x00c00e4c OBJ:4294967295 SCN:0x0000.004f1120 SEQ:1 OP:5.1 ENC:0 RBL:0 ktudb redo: siz: 200 spc: 2574 flg: 0x0012 seq: 0x0209 rec: 0x23 xid: 0x0001.013.00000648 ktubl redo: slt: 19 rci: 0 opc: 11.1 [objn: 98733 objd: 98733 tsn: 4] Undo type: Regular undo Begin trans Last buffer split: No Temp Object: No Tablespace Undo: No 0x00000000 prev ctl uba: 0x00c00e4c.0209.20 prev ctl max cmt scn: 0x0000.004ebaab prev tx cmt scn: 0x0000.004ebaea txn start scn: 0xffff.ffffffff logon user: 0 prev brb: 12586531 prev bcl: 0 BuExt idx: 0 flg2: 0 KDO undo record: KTB Redo op: 0x04 ver: 0x01 compat bit: 4 (post-11) padding: 1 op: L itl: xid: 0x000a.013.00006307 uba: 0x00c0025b.072e.0b flg: C--- lkc: 0 scn: 0x0000.004f1a39 KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x010000ad hdba: 0x010000aa itli: 2 ispac: 0 maxfr: 4858 tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 0 ncol: 3 nnew: 1 size: 0 col 1: [ 4] 6f 32 6b 32 CHANGE #3 TYP:2 CLS:1 AFN:4 DBA:0x010000ad OBJ:98733 SCN:0x0000.004f1a8c SEQ:1 OP:11.5 ENC:0 RBL:0 KTB Redo op: 0x11 ver: 0x01 compat bit: 4 (post-11) padding: 1 op: F xid: 0x0001.013.00000648 uba: 0x00c00e4c.0209.23 Block cleanout record, scn: 0x0000.004f1aa1 ver: 0x01 opt: 0x02, entries follow... itli: 1 flg: 2 scn: 0x0000.004f1a8c KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x010000ad hdba: 0x010000aa itli: 2 ispac: 0 maxfr: 4858 tabn: 0 slot: 1(0x1) flag: 0x2c lock: 2 ckix: 0 ncol: 3 nnew: 1 size: 0 col 1: [ 4] 6f 32 6b 33 CHANGE #4 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:0 OP:5.20 ENC:0 session number = 42 serial number = 55 transaction name = version 186647552 audit sessionid 4294967295 Client Id = login username = SYS REDO RECORD - Thread:2 RBA: 0x000072.00000003.0064 LEN: 0x00a4 VLD: 0x01 SCN: 0x0000.004f1aa2 SUBSCN: 1 05/12/2022 17:10:35 CHANGE #1 TYP:0 CLS:17 AFN:3 DBA:0x00c00080 OBJ:4294967295 SCN:0x0000.004f1aa1 SEQ:1 OP:5.4 ENC:0 RBL:0 ktucm redo: slt: 0x0013 sqn: 0x00000648 srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x00c00e4c.0209.23 ext: 2 spc: 2372 fbi: 0 CHANGE #2 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:0 OP:24.4 ENC:0 END OF REDO DUMP
redo 物理格式 = hexdump -C redo 檔案
(base) pickupli@pickupli1 ~ % hexdump -C ~/Downloads/114.redo 00000000 00 22 00 00 00 00 c0 ff 00 00 00 00 00 00 00 00 |."....��........| 00000010 65 58 00 00 00 02 00 00 03 00 00 00 7d 7c 7b 7a |eX..........}|{z| 00000020 a0 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |�...............| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200 01 22 00 00 01 00 00 00 72 00 00 00 00 80 25 cd |."......r.....%�| 00000210 00 00 00 00 00 04 20 0b 38 e2 f5 ae 43 48 45 4e |...... .8��CHEN| 00000220 4d 4d 00 00 e3 48 00 00 00 90 01 00 00 02 00 00 |MM..�H..........| 00000230 03 00 02 00 35 3b f5 ae 00 00 00 00 00 00 00 00 |....5;�........| 00000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000250 00 00 00 00 00 00 00 00 00 00 00 00 54 68 72 65 |............Thre| 00000260 61 64 20 30 30 30 32 2c 20 53 65 71 23 20 30 30 |ad 0002, Seq# 00| 00000270 30 30 30 30 30 31 31 34 2c 20 53 43 4e 20 30 78 |00000114, SCN 0x| 00000280 30 30 30 30 30 30 34 66 31 61 61 31 2d 30 78 30 |0000004f1aa1-0x0| 00000290 30 30 30 30 30 34 66 31 61 61 38 00 04 00 00 00 |000004f1aa8.....| 000002a0 fa cc a5 41 06 20 0e 00 00 00 00 00 02 00 00 00 |�̥A. ..........| 000002b0 02 00 00 00 a1 1a 4f 00 00 00 00 00 0b 88 d5 41 |....�.O.......�A| 000002c0 a8 1a 4f 00 00 00 00 00 0c 88 d5 41 00 00 08 02 |�.O.......�A....| 000002d0 53 07 1f 00 00 00 00 00 35 ce a5 41 a1 1a 4f 00 |S.......5ΥA�.O.| 000002e0 00 00 00 00 0b 88 d5 41 00 00 00 00 11 00 80 00 |......�A........| 000002f0 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 |................| 00000300 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 |................| 00000310 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................| 00000320 00 00 00 00 7a c9 21 31 00 00 00 00 00 00 00 00 |....z�!1........| 00000330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000003c0 57 32 c0 0d 41 3f 33 57 59 33 d9 e6 4c 4f f5 c6 |W2�.A?3WY3��LO��| 000003d0 27 f7 6c 1f 74 8a 40 20 48 9c 47 0b 46 31 76 e0 |'�l.t.@ H.G.F1v�| 000003e0 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000003f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000400 01 22 00 00 02 00 00 00 72 00 00 00 10 80 66 66 |."......r.....ff| 00000410 44 02 00 00 05 6e 00 00 a1 1a 4f 00 01 00 00 23 |D....n..�.O....#| 00000420 06 c5 1e 24 23 63 11 03 00 00 01 00 02 00 00 00 |.�.$#c..........| 00000430 02 00 00 00 0a 65 6c 5f a1 1a 4f 00 00 00 72 76 |.....el_�.O...rv| 00000440 65 72 73 00 00 00 80 f4 a3 1a 4f 00 00 00 00 00 |ers....�.O.....| 00000450 0b 88 d5 41 05 02 11 00 03 00 ff ff 80 00 c0 00 |..�A......��..�.| 00000460 21 11 4f 00 00 00 7c 99 01 00 ff ff 04 00 20 00 |!.O...|...��.. .| 00000470 13 00 00 00 48 06 00 00 4c 0e c0 00 09 02 23 00 |....H...L.�...#.| 00000480 12 00 c8 00 00 63 82 41 00 00 00 00 00 00 00 00 |..�..c.A........| 00000490 05 01 12 00 03 00 ff ff 4c 0e c0 00 20 11 4f 00 |......��L.�. .O.| 000004a0 00 00 00 00 01 00 ff ff 16 00 14 00 4c 00 20 00 |......��....L. .| 000004b0 1d 00 02 00 04 00 14 00 02 00 02 00 02 00 00 00 |................| 000004c0 c8 00 0e 0a 12 00 00 00 01 00 13 00 48 06 00 00 |�...........H...| 000004d0 09 02 23 00 ad 81 01 00 ad 81 01 00 04 00 00 00 |..#.�...�.......| 000004e0 00 00 00 00 0b 01 13 00 08 0c 01 00 00 00 00 00 |................| 000004f0 4c 0e c0 00 09 02 20 00 ab ba 4e 00 00 00 00 00 |L.�... .��N.....| 00000500 ea ba 4e 00 00 00 41 bc 40 08 00 00 ff ff ff ff |�N...A�@...����| 00000510 ff ff 00 00 23 0e c0 00 00 00 00 00 00 00 00 00 |��..#.�.........| 00000520 04 0d 00 00 00 00 00 00 0a 00 13 00 07 63 00 00 |.............c..| 00000530 5b 02 c0 00 2e 07 0b 00 00 80 00 00 39 1a 4f 00 |[.�.........9.O.| 00000540 ad 00 00 01 aa 00 00 01 fa 12 25 01 02 00 00 00 |�...�...�.%.....| 00000550 2c 00 00 00 01 00 03 01 00 00 00 00 00 00 00 00 |,...............| 00000560 01 00 00 00 6f 32 6b 32 01 1c 01 00 01 00 02 00 |....o2k2........| 00000570 02 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 |................| 00000580 02 00 00 00 c1 03 00 00 0b 05 01 00 04 00 01 00 |....�...........| 00000590 ad 00 00 01 8c 1a 4f 00 00 00 00 00 01 02 ad 81 |�.....O.......�.| 000005a0 0a 00 40 00 1d 00 02 00 04 00 00 00 11 0d 00 00 |..@.............| 000005b0 00 00 00 00 01 00 13 00 48 06 00 00 4c 0e c0 00 |........H...L.�.| 000005c0 09 02 23 00 00 00 00 00 00 00 00 00 00 00 00 00 |..#.............| 000005d0 00 00 00 00 ad 81 01 00 02 01 01 00 a1 1a 4f 00 |....�.......�.O.| 000005e0 00 00 00 00 01 02 00 00 8c 1a 4f 00 ad 00 00 01 |..........O.�...| 000005f0 aa 00 00 01 fa 12 05 01 02 00 00 00 2c 02 00 00 |�...�.......,...| 00000600 01 22 00 00 03 00 00 00 72 00 00 00 64 80 1b 9a |."......r...d...| 00000610 01 00 03 01 00 00 00 00 00 1a 4f 00 01 00 70 72 |..........O...pr| 00000620 6f 32 6b 33 05 14 00 00 00 00 00 00 00 00 00 00 |o2k3............| 00000630 00 00 00 00 00 00 00 00 00 06 00 00 12 00 04 00 |................| 00000640 00 00 02 00 04 00 04 00 00 00 00 00 03 00 4f f0 |..............O�| 00000650 2a 00 37 00 00 00 00 00 00 04 20 0b ff ff ff ff |*.7....... .����| 00000660 53 59 53 00 a4 00 00 00 01 06 00 00 a2 1a 4f 00 |SYS.�.......�.O.| 00000670 01 00 00 00 00 00 00 00 00 00 00 00 05 04 11 00 |................| 00000680 03 00 ff ff 80 00 c0 00 a1 1a 4f 00 00 00 00 00 |..��..�.�.O.....| 00000690 01 00 ff ff 08 00 14 00 10 00 04 00 13 00 00 00 |..��............| 000006a0 48 06 00 00 00 00 00 00 09 00 00 00 02 00 00 00 |H...............| 000006b0 4c 0e c0 00 09 02 23 00 02 00 44 09 00 7f 00 00 |L.�...#...D.....| 000006c0 0b cf 7c 62 18 04 00 00 00 00 00 00 00 00 00 00 |.�|b............| 000006d0 00 00 00 00 00 00 00 00 00 06 00 00 0a 00 10 00 |................| 000006e0 04 00 02 00 08 00 00 00 28 23 00 00 01 00 13 00 |........(#......| 000006f0 48 06 00 00 ff 00 0e 00 01 0a 09 00 00 00 00 00 |H...�...........| 00000700 a1 1a 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 |�.O.............| 00000710 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000800
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2897865/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫重做日誌及歸檔日誌的工作原理說明Oracle資料庫
- oracle資料庫mmnl日誌很大Oracle資料庫
- Vipper日誌庫的學習
- 分析Oracle資料庫日誌檔案(1)Oracle資料庫
- 分析Oracle資料庫日誌檔案(2)Oracle資料庫
- 分析Oracle資料庫日誌檔案(3)Oracle資料庫
- oracle資料庫歸檔日誌量陡增分析Oracle資料庫
- 分析Oracle資料庫日誌檔案(三)EPOracle資料庫
- 分析Oracle資料庫日誌檔案(二)DOOracle資料庫
- 分析Oracle資料庫日誌檔案(一)HBOracle資料庫
- 開啟關閉oracle資料庫附加日誌Oracle資料庫
- 分析Oracle資料庫日誌檔案(1)(轉)Oracle資料庫
- 分析Oracle資料庫日誌檔案(1) [轉]Oracle資料庫
- 【從零開始學習Oracle資料庫】(2)函式Oracle資料庫函式
- 資料庫原理學習筆記——引言資料庫筆記
- Oracle資料庫減少redo日誌產生方式Oracle資料庫
- Oracle11g清理資料庫歷史日誌Oracle資料庫
- 學習日誌
- Oracle實驗6--掌握Oracle資料庫的日誌操作Oracle資料庫
- Oracle資料庫遷移到國產資料庫核心難點解析 | 聯盟釋出Oracle資料庫
- 使用fn_dblog解析SQL SERVER 資料庫日誌方法SQLServer資料庫
- Oracle 監聽器日誌解析Oracle
- ORACLE RAC 日誌結構解析Oracle
- 【LOG】Oracle資料庫清理日誌、跟蹤檔案利器Oracle資料庫
- Oracle叢集資料庫中恢復歸檔日誌Oracle資料庫
- 分析資料庫日誌(LogMiner)資料庫
- 清除SQL Server資料庫日誌SQLServer資料庫
- 日誌框架學習框架
- mysql學習8:第四章:資料庫檔案--日誌檔案MySql資料庫
- 複習資料庫原理資料庫
- oracle學習(4) -資料庫檔案Oracle資料庫
- oracle歸檔日誌丟失後的資料庫恢復Oracle資料庫
- 【聽海日誌】之Oracle 10g閃回資料庫Oracle 10g資料庫
- Oracle 監聽器日誌解析(續)Oracle
- MySQL 從庫日誌比主庫多MySql
- 瀚高資料庫日誌挖掘方法資料庫
- 資料庫映象和日誌傳送資料庫
- SQL Server 檢視資料庫日誌SQLServer資料庫