Home Oracle Commands Oracle Syntax
Redo, Rollback and Undo

Redo
In addition to datafiles for storing database data, every Oracle database has a set of (two or more) redo log files.
The redo log records all changes made to data, including both uncommitted and committed changes.

Changes are saved to redo (by the log writer process) before being permanently written to the datafiles.

The redo log can consist of two parts: the online redo log and the archived redo log.
To avoid losing the database due to a single point of failure, Oracle can maintain multiple sets of online redo log files.

Assuming the database operates in ARCHIVELOG mode, Oracle will create an archived redo log at every checkpoint - these can be used to recover from a disk failure.

Archived redo logs should be backed up and deleted regularly.

Online redo logs should not be backed up.

The size of a redo log file directly influences checkpoint frequency and performance. Checkpoint frequency can vary widely but two or three per hour is typical.

Rollback
Rolling back means undoing changes to data that have been performed within an uncommitted SQL transaction.

If at any time an SQL statement causes an error, all effects of the statement are rolled back.
The user can also request a statement-level rollback by issuing a ROLLBACK statement.

Rollback segments store the data as it was before changes were made. This is in contrast to the redo log which is a record of the insert/update/deletes.

Commit
After a commit, the log writer process (LGWR) will write redo log entries from the SGA (Log Buffer) into the online redo log file. The background process DBWr will then copy the 'new' data from the redo log file into the datafile.

If a user disconnects from Oracle the current transaction is committed.
Applications should always explicitly commit or rollback transactions before program termination.

Rollback and Undo Records
Undo records can be stored in either rollback segments or undo tablespaces.

Rollback Segment Undo
Rollback segments have traditionally stored undo information used by several functions of Oracle. During database recovery, after all changes recorded in the redo log have been applied, Oracle uses rollback segment information to undo any uncommitted transactions. Because rollback segments are stored in the database buffers, this important recovery information is automatically protected by the redo log.

Automatic Undo
Automatic undo management enables a DBA to exert control over how long undo records are retained before being overwritten. Automatic undo management mode is more efficient, and less complex to implement and manage than rollback segment undo.

The UNDO_POOL directive enables DBAs to control runaway transactions by grouping users into consumer groups, with each group assigned a maximum undo space limit.

Whenever the total undo space consumed by a group exceeds the limit, its users are not allowed to make any further updates, until undo space is freed up by other members (after their transactions commit or abort).

In addition to space management, a DBA can specify an UNDO_RETENTION period to minimise occurences of the "snapshot too old" error. You can set this at startup or with the ALTER SYSTEM statement.

e.g. set retention to 20 minutes (1200 seconds):
ALTER SYSTEM SET UNDO_RETENTION = 1200;

The default value of UNDO_POOL is UNLIMITED.
The default value of UNDO_RETENTION is a small value that should be adequate for most OLTP systems.
A 20% buffer of undo space is recommended to avoid excessive movement of space between undo segments.

Two-Phase Commit
In a distributed environment Oracle ensures data consistency using the transaction model and a two-phase commit mechanism. As in nondistributed systems, transactions should be carefully planned to include a logical set of SQL statements that should all succeed or fail as a unit. Oracle's two-phase commit mechanism guarantees that, a distributed transaction will either commit on all involved nodes or roll back on all involved nodes across the global distributed database.

Flashback Query
Flashback Query, lets you view and repair historical data i.e perform queries on the database as of a certain wall clock time (or SCN)
This capability uses Oracle's multiversion read-consistency to restore data by applying undo as needed. Administrators can configure undo retention by specifying how long undo should be kept in the database.

The speed of this operation depends only on the amount of data being queried and the number of changes to the data that need to be backed out.
You set the date and time you want to view. Then any SQL query you execute operates on data as it existed at that time. You can correct errors and back out the restored data.

Flashback Query does NOT undo anything. It is only a query mechanism. You can take the output from a flashback query and perform an Undo yourself in many circumstances.
- Flashback Query does NOT tell you what changed. LogMiner does that.
- Flashback Query can be used to undo changes and can be very efficient if you know the rows that need to be moved back in time. You can in theory use it to move a full table back in time but this is very expensive if the table is large since it involves a full table copy.

"The difference between eggs and bacon: the chicken is involved, the pig is committed." - Anon

See also
COMMIT
ROLLBACK



Back to the Top

Simon Sheppard
SS64.com