日期:2014-05-16  浏览次数:20435 次

GoldenGate 是否需要 force logging:Oracle Force logging 和 Nologging 模式详解
FORCE LOGGING 模式


在 Oracle 中,某些 DDL 语句(如 create database)允许指定 nologging 子句,这会导致某些数据库操作不会在
数据库 redo log 中产生 redo 记录。NOLOGGING 设置可以加快一些可以轻易地在数据库恢复机制之外进行恢复的操作,
但是该设置可能会对介质恢复和standby数据库产生不利影响。


Oracle 数据库支持即使在 DDL 语句中指定了 NOLOGGING 子句也会强制产生 redo 记录。对于临时表空间和临时段对象,
数据库永远不会产生redo记录,因此 force logging 模式对于这些对象不会产生任何影响。


Oracle 中允许指定 NOLOGGING 模式的操作如下:


CREATE TABLE 和 ALTER TABLE
CREATE INDEX 和 ALTER INDEX
CREATE MATERIALIZED VIEW 和 ALTER MATERIALIZED VIEW
CREATE TABLESPACE 和 ALTER TABLESPACE 
CREATE INDEX ... REBUILD
ALTER TABLE ... MOVE


注意:
对 LOB 列指定 logging 设置可能有别于在表级指定 logging 设置。如果在表级指定 logging 设置的同时对 LOB 列指定
NOLOGGING 设置,则对基表行记录的 DML 更改会记录 redo 记录,但是对 LOB 数据的 DML 更改则不会记录 redo 记录。


有关指定 logging 子句的详细信息,请参阅 《Oracle Database SQL Language Reference》


将数据库置于 FORCE LOGGING 模式,有两种方法:
1、在 CREATE DATABASE 语句中指定 FORCE LOGGING 子句
2、在 ALTER DATABASE 语句中指定 FORCE LOGGING 子句


数据库创建后可用 ALTER DATABASE 语句将数据库置于 FORCE LOGGING 模式,该语句可能需要相当长的时间才能执行完成
因为它会等待所有未记录redo的直接写入完成。


取消 FORCE LOGGING 模式:
ALTER DATABASE NO FORCE LOGGING;


除了可以对数据库指定 FORCE LOGGING 模式外,还可以在表空间级别指定 FORCE LOGGING 或 NO FORCE LOGGING。
但是如果在FORCE LOGGING模式在数据库级别生效,该设置将优先于表空间级别的设置。如果该设置未在数据库级别生效,
则各个表空间级别的设置就会生效。Oracle 推荐既可以将整个数据库置于 FORCE LOGGING 模式,也可以将各个表空间置
于 FORCE LOGGING 模式,但是不推荐将二者同时置于 FORCE LOGGING 模式;


FORCE LOGGING 模式是数据库的永久属性。也就是说,数据库在关闭重启后,仍旧会处于同样的 LOGGING 模式。但是在重
建控制文件后,数据库不会以 FORCE LOGGING 模式重启,除非在 CREATE CONTROL FILE 语句中指定 FORCE LOGGING 子句。


控制 redo 记录的产生


对于某些数据库操作,可以控制数据库是否产生 redo 记录。众所周知,没有 redo,则不能进行介质恢复。但是,减少redo
生成可以提高性能,对于那些能够轻松恢复的操作更是如此。例如 CREATE TABLE AS SELECT 语句,在数据库或实例产生故障
后该语句仍然可以重新执行。


如果在 CREATE TABLESPACE 语句中指定 NOLOGGING 子句,则针对该表空间中数据库对象执行的操作会抑制 REDO 的产生。
如果未指定 NOLOGGING 子句,或者指定的是 LOGGING 子句,则每当对表空间中的对象执行更改时数据库都会产生 REDO 记录。
无论指定哪种 LOGGING 属性,对于临时段或者临时表空间来说都不会产生 REDO 记录。


表空间级别指定的 logging 属性是在该表空间中创建的对象的默认属性。可以通过在 SCHEMA 对象级别(例如,CREATE TABLE)
指定 LOGGING 或 NOLOGGING 设置覆盖这种默认的 logging 属性。


如果配置了 standby 数据库,则NOLOGGING模式会给 standby 数据库的高可用性和准确性带来问题。为了客服该问题,可以指定
 FORCE LOGGING 模式。如果在 CREATE TABLESOACE 语句中指定 FORCE LOGGING 子句,则针对该表空间中对象所做的所有操作及
更改,都会强制产生 redo 记录。该设置将覆盖所有对象级别的设置。


如果将处于 FORCE LOGGING 模式的表空间传输至其他数据库,则新表空间将不会保持 FORCE LOGGING 模式。


GoldenGate 同步是否需要配置 FORCE LOGGING 模式


关于 GoldenGate 同步是否需要配置 FORCE LOGGING ,网上有许多人认为,GoldenGate 只是强制要求开启 supplemental log
并未强制要求开启 FORCE LOGGING,但是 xiangsir 认为开启 FORCE LOGGING 是必须的,理由如下:


首先我们先弄清除与 FORCE LOGGING 模式相对应的 NOLOGGING 模式的含义:


《Oracle Data Guard Concepts and Administration》 for information about the effect of NOLOGGING on a database


In some SQL statements, the user has the option of specifying the NOLOGGING clause, which indicates that the 
database operation is not logged in the online redo log file. Even though the user specifies the clause, a 
redo record is still written to the online redo log file. However, there is no data associated with this record.
 This can result in log application or data access errors at the standby site and manual recovery might be 
 required to resume applying log files.
 
数据库设置了 NOLLOGING 模式,并不意味着相关的操作不会产生 redo,只是会抑制该操作产生日志,最小化日志产生的数量。






To create a table most efficiently use the NOLOGGING clause in the CREATE TABLE...AS SELECT statement. The NOLOGGING 
clause causes minimal redo information to be generated during the table creation. This has the following benefits:


Space is saved in the redo log files.
 
The time it takes to create the table is decreased.