REDO-LESS Operations (NOLOGGING option) in Oracle

by , under Oracle

REDO-LESS Operations (NOLOGGING option) in Oracle

It is possible not to generate redo data at some operations. The examples would be a direct loader, CREATE TABLE AS SELECT(CTAS), and CREATE INDEX with NOLOGGING option. However, even in these cases, a little redo will be generated when the operation changes data dictionary block and when the delayed block cleanout execute for a source object.

The NOLOGGING option can be used for the following SQL statements from Oracle 8.

Direct-load INSERT
ALTER TABLE … MOVE PARTITION
ALTER TABLE … SPLIT PARTITION
ALTER INDEX … SPLIT PARTITION
ALTER INDEX … REBUILD
ALTER INDEX … REBUILD PARTITION
From the Oracle8 Reference Manual:

With the NOLOGGING option, data is updated with minimal logging which means that it makes newly allocated extent invalid and it generates only logs to change its dictionary information. So in case of media recovery, the extent invalidation record shows some block is logically corrupt status because there no redo log for the recovery.

So, the data in the table should be kept, the backup should be done after the work with NOLOGGING.

The following is the example;
REDO RECORD – Thread:1 RBA: 0x0000cf.0000002a.01c0 LEN: 0x0028 VLD: 0x01
SCN scn: 0x04e2.0023a5da 10/07/98 09:54:20
CHANGE #1 INVLD AFN:8 DBA:0x02007277 BLKS:0x001f SCN:0x04e2.0023a5da SEQ: 1 OP:19.2

When the redo record is applied to this block, the ORA-273 error would be occurred on it.

ORA-00273 “media recovery of direct load data that was not logged”
Cause: A media recovery session encountered a table that was loaded by the direct loader without logging any redo information. Some or all of the blocks in this table are now marked as corrupt.
Action: The table must be dropped or truncated so that the corrupted blocks can be reused. If a more recent backup of the file is available, try to recover this file to eliminate this error.

When any operation try to read the block, the ORA-1578 error would be occurred.

Reference Ducumment : DSI305

 

 

 

 

일부 operation의 경우 redo를 생성시키지 않는 것이 가능하다. 예를 들어 direct loader나, CREATE TABLE AS SELECT 나 CREATE INDEX에 NOLOGGING 옵션을 사용하는 경우를 들 수 있다. 이 경우 redo 생성이 되지 않는다. 주의해야 할 것은 이 경우에도 data dictionary에 대한 변동 사항에 대해서는 operation에 의해 영향을 받는 block들에 대해 여전히 redo 가 생성이 된다는 것이다. 또한 source object에 대해 delayed block cleanout 이 수행될 경우에도 redo가 생성된다.

오라클 8 부터는 다음 SQL 문장들에 NOLOGGING 옵션을 사용 할 수 있는 기능이 추가 되었다.

Direct-load INSERT
ALTER TABLE … MOVE PARTITION
ALTER TABLE … SPLIT PARTITION
ALTER INDEX … SPLIT PARTITION
ALTER INDEX … REBUILD
ALTER INDEX … REBUILD PARTITION
From the Oracle8 Reference Manual:

NOLOGGING 모드에서는, 데이터는 최소한의 logging으로 수정이 된다 ( 최소한의 logging이란, 새로 할당된 extent를 invalid 상태로 만들고, dictionary 정보를 변경하는데 필요한 log 정보를 말한다 ). Media recovery중에는 extent invalidation record는 일정 범위의 block이 논리적으로 corrupt 상태임을 나타내는데, 이것은 복구에 필요한 완전한 redo log가 남아 있지 않기 때문이다.

따라서, 테이블의 내용이 유실되어서는 않되는 상황이라면, NOLOGGING 작업 후 BACKUP을 수행하여야 한다.

LOGGING 옵션을 사용했을 경우와 비교해 NOLOGGING 모드에서는 훨씬 적은 양의 redo log가 생성된다. Redo log에 invalidation record는 일정 범위의 block이 software corrupt상태임을 나타내기 위한 것이다. 이 경우 change vector의 type은 INVALID로 지정이 되며, 범위는 최초 시작 지점인 DBA에 의해 결정된 후, 연속된 block의 개수도 지정이 된다.

다음은 예이다.
REDO RECORD – Thread:1 RBA: 0x0000cf.0000002a.01c0 LEN: 0x0028 VLD: 0x01
SCN scn: 0x04e2.0023a5da 10/07/98 09:54:20
CHANGE #1 INVLD AFN:8 DBA:0x02007277 BLKS:0x001f SCN:0x04e2.0023a5da SEQ: 1 OP:19.2
Redo record가 적용될 경우, 이 블록에 대해서는 ORA-273 에러가 발생한다.

ORA-00273 “media recovery of direct load data that was not logged”
Cause: A media recovery session encountered a table that was loaded by the direct loader without logging any redo information. Some or all of the blocks in this table are now marked as corrupt.
Action: The table must be dropped or truncated so that the corrupted blocks can be reused. If a more recent backup of the file is available, try to recover this file to eliminate this error.

해당 block을 읽으려는 operation 역시 alert log에 ORA-1578이 남는다.

Reference Ducumment : DSI305

Leave a Reply