1 Redo Internals Julian Dyke Independent Consultant Web Version © 2005 Julian Dyke juliandyke.com.

56
1 Redo Internals Julian Dyke Independent Consultant Web Version © 2005 Julian Dyke juliandyke.co

Transcript of 1 Redo Internals Julian Dyke Independent Consultant Web Version © 2005 Julian Dyke juliandyke.com.

1

RedoInternals

Julian Dyke

Independent Consultant

Web Version

© 2005 Julian Dykejuliandyke.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