1 Redo Internals Julian Dyke Independent Consultant Web Version © 2005 Julian Dyke juliandyke.com.
-
Upload
johan-slatter -
Category
Documents
-
view
226 -
download
5
Transcript of 1 Redo Internals Julian Dyke Independent Consultant Web Version © 2005 Julian Dyke juliandyke.com.
2
© 2005 Julian Dykejuliandyke.com
Agenda
1. What is Redo?
2. Redo Records
3. Change Vectors
4. Row Operations
5. Index Operations
6. Other Redo Operations
7. Direct Loads / NOLOGGING
8. Transaction Auditing
9. Supplemental Logging
3
© 2005 Julian Dykejuliandyke.com
What is Redo? Redo logs contain a history of all changes made to the
database
Redo log files are used by Recovery (instance and media) Log Miner Oracle Streams
Every change made to the database is written to the redo log buffer before it is written to the data
block buffer written to the redo log file before it is written to the data file
The redo log buffer is flushed to the redo log file when a COMMIT is issued
4
© 2005 Julian Dykejuliandyke.com
What is Redo? Redo log files
Include all changes made by DML statements INSERT UPDATE DELETE SELECT FOR UPDATE
Do not include DML statement text Include all changes made to dictionary objects by DDL
statements Include DDL statement text (9.0.1 and above) Include all changes made by recursive statements
5
© 2005 Julian Dykejuliandyke.com
Buffers and Writers
Redo LogBuffer
Redo Log File
Data FileData Block
Buffer
LGWR
DBWR
6
© 2005 Julian Dykejuliandyke.com
Arch 1
Logging and Archiving
Archive Log FilesRedo Log Files
Arch 2
Arch 3
Arch 4
Arch 5
Arch 6
LGWR
Group 1
Group 3
Group 2 ARCH
7
© 2005 Julian Dykejuliandyke.com
Redo Log Files Redo log uses operating system block size
usually 512 bytes format dependent on
operating system Oracle version
Each redo log consists of header redo records
Redo log is written sequentially
Block 0 Block 1 Block 2
RedoRecord
1
FileHeader
RedoHeader
Block 3
RedoRecords
2 & 3
Block 4
RedoRecords
3 & 4
Block M
RedoRecord
N
...
8
© 2005 Julian Dykejuliandyke.com
Redo Records A redo record consists of
redo record header one or more change vectors
Each redo record contains undo and redo for an atomic change
Some changes do not require undo
RedoRecordHeader
Change#1
Change#2
Change#3
Change#N
.....
9
© 2005 Julian Dykejuliandyke.com
Redo Record Header Every redo record has a header
REDO RECORD - Thread:1 RBA: 0x003666.000000cf.0010 LEN: 0x019c VLD: 0x01SCN: 0x0000.00eb1279 SUBSCN: 1 05/08/2003 15:44:12
Fields include
Thread Thread Number
RBA Redo Byte Address
LEN Length of record in bytes
SCN System Change Number
Date and Time of Change
10
© 2005 Julian Dykejuliandyke.com
Redo Byte Address (RBA) Every redo record has a Redo Byte Address (RBA) e.g.
RBA: 0x003666.000000cf.0010
RBA is 10 bytes in length
RBA identifies start of redo record Fields are
Log sequence number (0x3666) Block number within redo log (0xcf) Byte number within block (0x10)
11
© 2005 Julian Dykejuliandyke.com
System Change Number (SCN) Also called System Commit Number Defines committed version of database SCN is 6 bytes in length
Contains Wrap (2 bytes) e.g 0000 Base (4 bytes) e.g 0ac67cc3
Base is incremented for each new SCN Saved in redo record header
RAC databases maintain a global SCN Distributed transactions use highest SCN
SCN:0x0000.0ac67cc3
12
© 2005 Julian Dykejuliandyke.com
Change Vector Describes a change to a single data block
Can apply to undo headers undo blocks data segment headers data blocks
Is created in PGA before the data block buffer is modified
Consists of header array of change record lengths array of change records
13
© 2005 Julian Dykejuliandyke.com
Change Vector For example
10
20
48
2
2
29
28
16
Change Record 1
Change Record 2
Change Record 3
Change Record 4
Change Record 5
Change Record 6
Change Record 7
Length Vector
Change Header
14
© 2005 Julian Dykejuliandyke.com
Change Vector Header Every change vector has a header e.g.
CHANGE #2 TYP:0 CLS: 1 AFN:5 DBA:0x0144d023 SCN:0x0000.0ac67cce SEQ: 4 OP:11.5
Fields include
CHANGE Change number
TYP Change type
CLS Class
AFN Absolute File Number
DBA Relative Database Block Address
SCN System Change Number
SEQ Sequence Number (relative to SCN)
OP Operation Code
15
© 2005 Julian Dykejuliandyke.com
Block Classes Class in change header is equivalent to X$BH.CLASS
Class Description
1 Data Block
2 Sort Block
3 Deferred Undo Segment Blocks
4 Segment Header Block (Table)
5 Deferred Undo Segment Header Blocks
6 Free List Blocks
7 Extent Map Blocks
8 Space Management Bitmap Blocks
9 Space Management Index Blocks
10 Unused
11 + 2r Segment Header for Undo Segment r
12 + 2r Data Blocks for Undo Segment r
e.g. 11 is System Rollback Segment Header
16
© 2005 Julian Dykejuliandyke.com
Database Block Address (DBA) Every database block has a Database Block Address (DBA)
e.g.DBA:0x0144d023
DBA is 4 bytes in length Fields are
Upper 10 bits represent relative file number Lower 22 bits represent block number
For example
DECLAREl_dba NUMBER := TO_NUMBER ('0144D023','XXXXXXXX');l_file NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGINDBMS_OUTPUT.PUT_LINE ('File : '||l_file);DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
END;
17
© 2005 Julian Dykejuliandyke.com
Operation Codes Each change is represented by an operation in the redo log There are over 150 different operations Each operation has an layer code and a sub code e.g. 11.2
Layers include
Layer Description
4 Block Cleanout
5 Transaction Management
10 Index Operations
11 Row Operations
13 Segment Management
14 Extent Management
17 Tablespace Management
Layer Description
18 Block Image (Hot backups)
19 Direct Loader
20 Compatibility Segment
22 Locally Managed Tablespaces
23 Block Writes
24 DDL Statements
18
© 2005 Julian Dykejuliandyke.com
Transactions The first DML statement in a session creates a transaction
Allocates an undo segment Creates a 5.2 change to update transaction table in undo
segment header
CHANGE #1 TYP:0 CLS:25 AFN:3 DBA:0x00c0012e SCN:0x0000.0ac86eb8 SEQ: 1 OP:5.2ktudh redo: slt: 0x0010 sqn: 0x0000475a flg: 0x0012 siz: 96 fbi: 0 uba: 0x00c04d20.234b.0e pxid: 0x0000.000.00000000
A commit (or rollback) ends the transaction A 5.4 change is created for a commit
Rollbacks apply all undo for the transaction followed by a commit
CHANGE #1 TYP:0 CLS:25 AFN:3 DBA:0x00c0012e SCN:0x0000.0ac86ebf SEQ: 1 OP:5.4ktucm redo: slt: 0x0010 sqn: 0x0000475a srt: 0 sta: 9 flg: 0x0
19
© 2005 Julian Dykejuliandyke.com
Transaction ID (XID) Every transaction has an XID
xid: 0x0004.00e.0000449b
XID is 8 bytes in length
Contains Undo segment number (USN) of transaction (0x0004) Undo segment header transaction table slot (0x00e) Sequence number (wrap) (0x0000449b)
20
© 2005 Julian Dykejuliandyke.com
Undo Block Address (UBA) Address of change in undo block
uba: 0x00c01f17.2758.04
UBA is 7 bytes in length
Contains DBA of undo block (0x00c01f17) Sequence number (2758) Record number in block (4)
21
© 2005 Julian Dykejuliandyke.com
UPDATE t1 SET c2 = 101WHERE c1 = 1;
UPDATE t1 SET c2 = 201WHERE c1 = 2;
COMMIT;
Transactions
Statements Undo Header
Undo Block
Data Block
SLOT C1 C2
0 1 100
1 2 200
SLOT
0
Undo Slot 0 c2 = 100
Undo Slot 1 c2 = 200
STATUS
101
10
201
9
Redo Logs
Undo Header 5.2
Undo Slot 0 c2 = 100
5.1
Redo Slot 0 c2 = 101
11.5
Undo Slot 1 c2 = 200
5.1
Redo Slot 1 c2 = 201
11.5
Commit 5.4
22
© 2005 Julian Dykejuliandyke.com
Physiological Logging Oracle normally uses physiological logging Only changes made to each block are recorded
Statement Undo Redo
INSERT INTO t1VALUES (1, 'ABC');
Delete row 1 Row 1c1 := 1c2 := 'ABC'
UPDATE t1 SET c2 = 'DEF'WHERE c1 = 1;
Row 1c2 := 'ABC'
Row 1c2 := 'DEF'
DELETE FROM t1WHERE c1 = 1;
Row 1c1 := 1c2 := 'DEF'
Delete row 1
SELECT c2 FROM t1WHERE c1 = 1FOR UPDATE;
Unlock row 1 Lock row 1
Note that INSERT statements generate minimal undo
23
© 2005 Julian Dykejuliandyke.com
Redo Record Example This is an example of a redo log dump for a single row update
UPDATE t1 SET c2 = 20 WHERE c1 = 1;
The previous value of column c2 for this row was 10
The redo record starts with a header
REDO RECORD - Thread:1 RBA: 0x003e12.00000004.01cc LEN: 0x00f8 VLD: 0x01SCN: 0x0000.0ac73691 SUBSCN: 1 06/26/2003 14:40:14
This redo record is 248 (0xF8) bytes in length
24
© 2005 Julian Dykejuliandyke.com
Redo Record Example (Continued) Change 1 updates the undo block
CHANGE #1 TYP:0 CLS:26 AFN:3 DBA:0x00c04ab7 SCN:0x0000.0ac73690 SEQ: 2 OP:5.1ktudb redo: siz: 104 spc: 1860 flg: 0x0022 seq: 0x233f rec: 0x02 xid: 0x0005.00b.0000460b ktubu redo: slt: 11 rci: 1 opc: 11.1 objn: 19378 objd: 19378 tsn: 4Undo type: Regular undo Undo type: Last buffer split: No Tablespace Undo: No 0x00000000KDO undo record:KTB Redo op: 0x02 ver: 0x01 op: C uba: 0x00c04ab7.233f.01KDO Op code: URP row dependencies Disabled xtype: XA bdba: 0x0144d022 hdba: 0x0144d021itli: 1 ispac: 0 maxfr: 1177tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 0ncol: 2 nnew: 1 size: 0col 1: [ 2] c1 0b
25
© 2005 Julian Dykejuliandyke.com
Redo Record Example (Continued) Change 2 updates the data block
CHANGE #2 TYP:0 CLS: 1 AFN:5 DBA:0x0144d022 SCN:0x0000.0ac73690 SEQ: 1 OP:11.5KTB Redo op: 0x02 ver: 0x01 op: C uba: 0x00c04ab7.233f.02KDO Op code: URP row dependencies Disabled xtype: XA bdba: 0x0144d022 hdba: 0x0144d021itli: 1 ispac: 0 maxfr: 1177tabn: 0 slot: 2(0x2) flag: 0x2c lock: 1 ckix: 0ncol: 2 nnew: 1 size: 0col 1: [ 2] c1 15
26
© 2005 Julian Dykejuliandyke.com
Row Operations Row operations generate layer 11 redo Opcodes include
Opcode Mnemonic Description
11.2 IRP Insert Single Row
11.3 DRP Delete Single Row
11.4 LKR Lock Row
11.5 URP Update Row
11.6 ORP Chained Row
11.9 CKI Cluster key index
11.10 SKL Set cluster key pointers
11.11 QMI Insert Multiple Rows
11.12 QMD Delete Multiple Rows
27
© 2005 Julian Dykejuliandyke.com
Single Row Insert
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.2
5.1
UNDO #2
REDO #2
5.1
11.2
REDO #1
UNDO #1
HEADER
11.2
5.1
5.2
COMMIT;
-- Statement #1INSERT INTO t1 VALUES (1);
-- Statement #2INSERT INTO t1 VALUES (2);
-- Statement #3INSERT INTO t1 VALUES (3);
28
© 2005 Julian Dykejuliandyke.com
Multi Row Insert
RedoStatements
COMMIT 5.4
UNDO #1
HEADER
5.1
5.2
COMMIT;
-- Statement #1INSERT INTO t1SELECT * FROM t2;
REDO #1 11.11
29
© 2005 Julian Dykejuliandyke.com
Single Row Update
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.5
5.1
UNDO #2
REDO #2
5.1
11.5
REDO #1
UNDO #1
HEADER
11.5
5.1
5.2
COMMIT;
-- Statement #1UPDATE t1 SET c2 = c2 + 1WHERE c1 = 1;
-- Statement #2UPDATE t1 SET c2 = c2 + 1WHERE c1 = 2;
-- Statement #3UPDATE t1 SET c2 = c2 + 1WHERE c1 = 3;
30
© 2005 Julian Dykejuliandyke.com
Multi Row Update
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.5
5.1
UNDO #2
REDO #2
5.1
11.5
REDO #1
UNDO #1
HEADER
11.5
5.1
5.2-- T1 contains 3 rowsUPDATE t1 SET c2 = c2 + 1;
COMMIT;
31
© 2005 Julian Dykejuliandyke.com
Single Row Delete
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.3
5.1
UNDO #2
REDO #2
5.1
11.3
REDO #1
UNDO #1
HEADER
11.3
5.1
5.2
COMMIT;
-- Statement #1DELETE FROM t1WHERE c1 = 1;
-- Statement #2DELETE FROM t1WHERE c1 = 2;
-- Statement #3DELETE FROM t1WHERE c1 = 3;
32
© 2005 Julian Dykejuliandyke.com
Multi Row Delete
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.3
5.1
UNDO #2
REDO #2
5.1
11.3
REDO #1
UNDO #1
HEADER
11.3
5.1
5.2
COMMIT;
-- T1 contains 3 rowsDELETE FROM t1;
33
© 2005 Julian Dykejuliandyke.com
Single Row Select For Update
RedoStatements
COMMIT 5.4
UNDO #2
REDO #2
5.1
11.5
REDO #1
UNDO #1
HEADER
11.4
5.1
5.2
COMMIT;
-- Statement #1SELECT c2 FROM t1WHERE c1 = 1FOR UPDATE;
-- Statement #2UPDATE t1SET c2 = c2 + 1WHERE c1 = 1;
34
© 2005 Julian Dykejuliandyke.com
Multi Row Select For Update
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.4
5.1
UNDO #2
REDO #2
5.1
11.4
REDO #1
UNDO #1
HEADER
11.4
5.1
5.2
COMMIT;
-- T1 contains 3 rowsSELECT c2 FROM t1FOR UPDATE;
35
© 2005 Julian Dykejuliandyke.com
Rollback
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
5.6
11.3
UNDO #2
REDO #2
5.1
11.2
REDO #1
UNDO #1
HEADER
11.2
5.1
5.2-- Statement #1INSERT INTO t1 VALUES (1);
ROLLBACK;
-- Statement #2INSERT INTO t1 VALUES (2);
REDO #4
UNDO #4
5.11
11.3
36
© 2005 Julian Dykejuliandyke.com
Global Temporary Tables
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
11.2
5.1
UNDO #2
REDO #2
5.1
11.2
UNDO #1
HEADER
REDO #1 11.2
5.1
5.2
COMMIT;
-- Statement #1INSERT INTO t1 VALUES (1);
-- Statement #2INSERT INTO t1 VALUES (2);
-- Statement #3INSERT INTO t1 VALUES (3);
37
© 2005 Julian Dykejuliandyke.com
Index Operations Index operations generate layer 10 redo Opcodes include
Opcode Description
10.2 Insert Leaf Row
10.3 Purge Leaf Row
10.4 Delete Leaf Row
10.5 Restore Leaf Log
10.6 Lock block
10.7 Clear block opcode on commit
10.8 Initialise header
10.9 Apply XAT do to ITL 1
10.10 Set leaf block next pointer
10.11 Set leaf block previous pointer
10.12 Initialize root block after split
Opcode Description
10.13 Make leaf block empty
10.15 Insert branch row
10.16 Purge branch row
10.18 Update key data in row
10.19 Clear split flag
10.21 Undo branch operation
10.22 Undo leaf operation
10.24 Shrink ITL
10.30 Update nonkey value
10.31 Create/Load Index
10.34 Make leaf block empty
38
© 2005 Julian Dykejuliandyke.com
Index Insert
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
10.2
5.1
UNDO #2
REDO #2
5.1
10.2
REDO #1
UNDO #1
HEADER
11.2
5.1
5.2-- Insert into table t1INSERT INTO t1 VALUES (1,10);
COMMIT;
-- Insert into index i1
-- Insert into index i2
39
© 2005 Julian Dykejuliandyke.com
Index Updates
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
10.2
5.1
UNDO #2
REDO #2
5.1
10.4
REDO #1
UNDO #1
HEADER
11.5
5.1
5.2-- Update table t1UPDATE t1SET c1 = 2WHERE c1 = 1;
COMMIT;
-- Delete from index i1
-- Insert into index i1
40
© 2005 Julian Dykejuliandyke.com
Index Deletes
RedoStatements
COMMIT 5.4
REDO #3
UNDO #3
10.4
5.1
UNDO #2
REDO #2
5.1
10.4
REDO #1
UNDO #1
HEADER
11.3
5.1
5.2-- Delete from table t1DELETE FROM t1WHERE c1 = 1;
COMMIT;
-- Delete from index i1
-- Delete from index i2
41
© 2005 Julian Dykejuliandyke.com
Conditional Index Updates
Update table row
UNDO #1 5.1
REDO #1 11.5
UNDO #2 5.1
REDO #2 10.4
UNDO #3 5.1
REDO #3 10.2
UNDO #1 5.1
REDO #1 11.5
UNDO #1 5.1
REDO #1 11.5
UNDO #2 5.1
REDO #2 10.4
UNDO #1 5.1
REDO #1 11.5
UNDO #3 5.1
REDO #3 10.2
Deleteindexrow
Insertindexrow
UPDATE t1 SET c1 = 2WHERE c1 = 1;
UPDATE t1 SET c1 = NULLWHERE c1 = 1;
UPDATE t1 SET c1 = 1WHERE c1 IS NULL
UPDATE t1 SET c1 = 1WHERE c1 = 1
Before 1After 2
Before 1After 1
Before 1After NULL
Before NULLAfter 1
42
© 2005 Julian Dykejuliandyke.com
Block Cleanout Occurs when ITL on data block has not been updated when
changes were committed
REDO RECORD - Thread:1 RBA: 0x003669.00000002.01ac LEN: 0x003c VLD: 0x01SCN: 0x0000.00eb3219 SUBSCN: 1 05/08/2003 17:53:41CHANGE #1 TYP:2 CLS: 1 AFN:5 DBA:0x0142fca2 SCN:0x0000.00eb3201 SEQ: 1 OP:4.1Block cleanout record, scn: 0x0000.00eb3219 ver: 0x01 opt: 0x02, entries follow... itli: 2 flg: 2 scn: 0x0000.00eb3201
Block Cleanout redo Can be generated by SELECT statements Opcode 4.1 requires 60 byte redo record for each block
43
© 2005 Julian Dykejuliandyke.com
Backups If hot backups are in use, when backup mode is enabled
REDO RECORD - Thread:1 RBA: 0x003e3b.00000005.0010 LEN: 0x0818 VLD: 0x01SCN: 0x0000.0ac84345 SUBSCN: 1 06/27/2003 15:06:06CHANGE #1 TYP:3 CLS: 1 AFN:5 DBA:0x014343c2 SCN:0x0000.0ac8433d SEQ: 1 OP:18.1Log block image redo entry
ALTER TABLESPACE <tablespace_name> BEGIN BACKUP;
A block image is written to the redo log for each block that is modified (opcode 18.1)
When backup mode is disabled
REDO RECORD - Thread:1 RBA: 0x003e3b.0000000c.0010 LEN: 0x0038 VLD: 0x01SCN: 0x0000.0ac84347 SUBSCN: 1 06/27/2003 15:06:09CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:17.1End backup marker - file:5 scn: 0x0000.0ac84341
ALTER TABLESPACE <tablespace_name> END BACKUP;
an end backup marker is written to redo log (17.1)
44
© 2005 Julian Dykejuliandyke.com
Block Writes In Oracle 9.0.1 and above blocks written from buffer cache to
disk by DBWR are recorded in redo logs Supports fast recovery
REDO RECORD - Thread:1 RBA: 0x003e34.00000012.0010 LEN: 0x2948 VLD: 0x02SCN: 0x0000.0ac8289c SUBSCN: 1 06/27/2003 13:19:44CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:23.1 Block Written - afn: 5 rdba: 0x014238ad(5,145581) scn: 0x0000.0ac82889 seq: 0x07 flg:0x04 Block Written - afn: 5 rdba: 0x014238ac(5,145580) scn: 0x0000.0ac82889 seq: 0x08 flg:0x04 Block Written - afn: 5 rdba: 0x014238ab(5,145579) scn: 0x0000.0ac82889 seq: 0x07 flg:0x04 Block Written - afn: 5 rdba: 0x014238aa(5,145578) scn: 0x0000.0ac82889 seq: 0x07 flg:0x04
Each block record is 32 bytes in length (OS dependent)
45
© 2005 Julian Dykejuliandyke.com
Direct Loads If archiving is enabled then direct load blocks are written to
redo In Oracle 9.2 each block requires a 19.1 and 24.2 change
REDO RECORD - Thread:1 RBA: 0x003e37.00000007.0014 LEN: 0x0848 VLD: 0x01SCN: 0x0000.0ac83828 SUBSCN: 1 06/27/2003 14:21:50CHANGE #1 TYP:1 CLS: 1 AFN:5 DBA:0x0142b962 SCN:0x0000.0ac83826 SEQ: 1 OP:19.1Direct Loader block redo entryBlock header dump: 0x0e5c0000 Object id on Block? Y seg/obj: 0x4bd9 csc: 0x00.ac83825 itc: 3 flg: - typ: 1 – DATA fsl: 0 fnx: 0x0 ver: 0x01 Itl Xid Uba Flag Lck Scn/Fsc#0x01 0x0003.003.00004540 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
-- Block dump follows
CHANGE #2 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:24.2
46
© 2005 Julian Dykejuliandyke.com
NOLOGGING Redo generation can be disabled for some operations using
UNRECOVERABLE (Oracle 7) NOLOGGING (Oracle 8.0 and above)
Can be enabled for specific tables and indexes at object level statement level
The following redo log entry indicates a range of blocks which cannot be recovered
REDO RECORD - Thread:1 RBA: 0x003674.00000006.01e0 LEN: 0x0028 VLD: 0x01SCN: 0x0000.00ebaeec SUBSCN: 1 05/09/2003 11:16:07CHANGE #1 INVLD AFN:5 DBA:0x0142ff03 BLKS:0x001f SCN:0x0000.00ebaeecSEQ: 1 OP:19.2Direct Loader invalidate block range redo entry
47
© 2005 Julian Dykejuliandyke.com
NOLOGGING These tests were performed on an ARCHIVELOG database
using a 100000 row table
Operation LOGGING NOLOGGING
CREATE TABLE AS SELECT 14238844 39548
ALTER TABLE MOVE 14227236 45340
INSERT /*+ APPEND */ 14221904 42452
CREATE MATERIALIZED VIEW 20726784 3784532
CREATE INDEX 2042532 24548
ALTER INDEX REBUILD 2056440 32192
ALTER INDEX REBUILD ONLINE 2083832 67840
SQL*Loader (Direct) 14248116 56712
Online Reorganization 21330788 7169472
Redo size in bytes Median size from 3 runs
48
© 2005 Julian Dykejuliandyke.com
FORCE NOLOGGING Objects created using NOLOGGING cannot be recovered Backup should be taken immediately affect using
NOLOGGING In Oracle 9.2 and above NOLOGGING can be disabled using
STARTUP MOUNTALTER DATABASE FORCE LOGGING;
or
ALTER TABLESPACE <tablespace_name>FORCE LOGGING;
49
© 2005 Julian Dykejuliandyke.com
Transaction Auditing Introduced in Oracle 8.1.5 to support Log Miner Enabled by default Each session includes 5.19 change vector
CHANGE #4 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:5.19session number = 9serial number = 5current username = US01login username = US01client info = OS username = BMC.COM\jdykeMachine name = BMC.COM\JDYKE-ABI-EUOS terminal = JDYKE-ABI-EUOS process id = 1784:1724OS program name = sqlplusw.exetransaction name =
Last change of first redo record in session Record length is variable
50
© 2005 Julian Dykejuliandyke.com
Transaction Auditing Each subsequent transaction includes 5.20 change vector
CHANGE #4 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ: 0 OP:5.20session number = 9serial number = 5transaction name =
Last change of second and subsequent redo records in session
Record length is variable
If LogMiner is not in use, transaction auditing can be disabled by setting initialisation parameter
TRANSACTION_AUDITING = FALSE;
51
© 2005 Julian Dykejuliandyke.com
Supplemental Logging Introduced in Oracle 9.0.1 to enable LogMiner to support
Chained rows Cluster keys
Extended in Oracle 9.2 to support Oracle Streams Used with logical standby databases ROWIDs may differ therefore cannot be used Allows updated rows to be identified logically
Can be specified at Database level Table level
Enabled by default in 9.0.1; disabled by default in 9.2.0
52
© 2005 Julian Dykejuliandyke.com
Supplemental Logging At database level can enable
minimal supplemental logging
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(UNIQUE KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY, UNIQUE INDEX) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
Disabled using
Oracle selects a subset of columns to include in the redo log Not necessarily unique
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
identification key supplemental logging
53
© 2005 Julian Dykejuliandyke.com
Supplemental Logging At table level columns must be specified If ALWAYS keyword is specified, all specified columns will be
logged for every update
ALTER TABLE table1 ADD SUPPLEMENTAL LOG GROUP group1 (c2,c3) ALWAYS;
ALTER TABLE table1 DROP SUPPLEMENTAL LOG GROUP group1;
Disabled using
Otherwise specified columns are only logged if one of them is updated
ALTER TABLE table1 ADD SUPPLEMENTAL LOG GROUP group1 (c2,c3);
See data dictionary views DBA_LOG_GROUPS DBA_LOG_GROUP_COLUMNS
54
© 2005 Julian Dykejuliandyke.com
Supplemental Logging Additional columns are appended to undo data
CREATE TABLE t1 (c1 NUMBER,c2 NUMBER,c3 NUMBER);INSERT INTO t1 VALUES (100, 200, 300);
ALTER TABLE table1 ADD SUPPLEMENTAL LOG GROUP group1 (c1,c2,c3) ALWAYS;
HEADER 5.2
Statements
-- Statement #1 UPDATE t1 SET c3 = 400WHERE c1 = 100;
HEADER 5.2
REDO #1 11.5
c3 = 400
UNDO #1 5.1
c3 = 300
c2 = 200
c1 = 100
Redo
55
© 2005 Julian Dykejuliandyke.com
Dumping Logfiles To dump the contents of a logfile use
ALTER SYSTEM DUMP LOGFILE 'pathname';
A range of data file blocks can be specified
ALTER SYSTEM DUMP LOGFILE 'pathname';DBA MIN <fileno> . <blockno>DBA MAX <fileno> . <blockno>
A range of redo byte addresses can be specified
ALTER SYSTEM DUMP LOGFILE 'pathname';RBA MIN <logfile> . <sequenceno>RBA MAX <logfile> . <sequenceno>
A layer and (optional) opcode can be specified
ALTER SYSTEM DUMP LOGFILE 'pathname';LAYER <integer>OPCODE <integer>
56
© 2005 Julian Dykejuliandyke.com
Thank you for your interest
For more information and to provide feedback
please contact me
My e-mail address is:[email protected]
My website address is:
www.juliandyke.com