ITPub博客

首页 > Linux操作系统 > Linux操作系统 > force_logging参数

force_logging参数

原创 Linux操作系统 作者:tianjusanren 时间:2011-03-23 10:31:05 0 删除 编辑
force logging什么意思

在做data guard的时候
alter database force logging;
这里force logging的作用是什么?

用于忽略nologging选项不记录redo的请求,一般用于dataguard以及安全要求较高的数据库,
要求所有的事务都可以通过归档进行回滚。。。

什么是Force Logging?

想必大家知道有一些DDL语句可以通过指定NOLOGGING子句的方式避免写REDO(目的是提高 速度,某些时候确实有效)。指定数据库为Force Logging模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作,而忽略类似NOLOGGING之类的指定参数。如果在执行Force Logging时有NOLOGGING之类的语句在执行,那么Force Logging会等待,直到这类语句全部执行。

Force Logging是作为固定参数保存在控制文件中,因此其不受重启之类操作的影响(只执行一次即可),如果想取消,可以通过ALTER DATABASE NO FORCE LOGGING语句关闭强制记录。


强制日志模式,就是所有的操作都会记入日志。

就是你想再nologging,Oracle也不会理你的

====================================================
如果force_logging=no 则
对于普通表:
noarchive: append
archvie: nologging + append

临时表:
noarchive: append
archvie: append

如果force_logging=yes
对于普通表:
noarchive: 无法减少日志量
archvie: 无法减少日志量

临时表:
noarchive: append
archvie: append


由于临时表只保存临时数据,就算恢复不了也没问题,所以尽量不让它产生日志。

===============================================================

其实nologging与表模式,插入模式,数据库运行模式(archived/unarchived)都有很大的关系:

  总结如下:

  注意append是一种hint;

  一般我们可以这样来使用

  insert /*+append+/ into mytable values(1,"alan");

  数据库在归档模式下

 当表模式为logging状态时,无论是append模式还是no append模式,redo都会生成。

  当表模式为nologging状态时,只有append模式,不会生成redo.

  数据库在非归档模式下

  无论是在logging还是nologing的模式下,append的模式都不会生成redo,而noappend模式下都会生成redo。

  如果我想看一张表是否是logging状态,可以这样

  select table_name,logging from dba_tableswheretable_name="tablename";

  那么在Oracle内部还存在一个内部参数:_disable_logging 默认是false

  通过更改为true可以让Oracle在修改表中的记录的时候完全不记录redo,这个参数要甚用。平时,我们只作为性能测试用。

  force logging(强制日志)模式:

  通过命令:

  alter database force logging来使得Oracle无论什么操作都进行redo的写入。

  通过select force_logging from v$database可以看到当前数据库强制日志模式的状态。

============================================================================

关于nologging,logging,force logging
2008-09-17 16:24

最近在工作中正好用到了lob对象,发现网上很多lob相关表创建语句里都有nologging的,自然都是不写redo log的,这必然给备份恢复带来了问题。

顺便多看了看这方面的东西

这里整理出了官方文档的说明:

关于nologging:


Oracle? Database Backup and Recovery Advanced User's Guide
10g Release 2 (10.2)
Part Number B14191-02

You can create tables and indexes with the CREATE TABLE AS SELECT statement. You can also specify that the database
create them with the NOLOGGING option. When you create a table or index as NOLOGGING, the database does not generate
redo log records for the operation. Thus, you cannot recover objects created with NOLOGGING, even if you are
running in ARCHIVELOG mode.

Be aware that when you perform. media recovery, and some tables or indexes are created normally whereas others are created
with the NOLOGGING option, the NOLOGGING objects are marked logically corrupt by the RECOVER operation.
Any attempt to access the unrecoverable objects returns an ORA-01578 error message. Drop the NOLOGGING objects and re-create
them if needed.


关于Force logging
Specifying FORCE LOGGING Mode
Some data definition language statements (such as CREATE TABLE) allow the NOLOGGING clause, which causes some database operations not to generate redo records in the database redo log. The NOLOGGING setting can speed up operations that can be easily recovered outside of the database recovery mechanisms, but it can negatively affect media recovery and standby databases.

Oracle Database lets you force the writing of redo records even when NOLOGGING has been specified in DDL statements. The database never generates redo records for temporary tablespaces and temporary segments, so forced logging has no affect for objects.

nologging,logging,force logging分为对象级(DDL创建表或索引的时候使用了nologging或其他),表空间级,数据库级。force logging会比nologging“权利” 更大

force logging就是:忽略nologging

其他:

查询数据库中nologging的表(索引)
SQL> select table_name,tablespace_name,logging from user_tables where logging='NO';

TABLE_NAME                     TABLESPACE_NAME      LOG
------------------------------ -------------------- ---
PAGERESULTS                    USERS                NO
EXTENDEDPAGERESULTS            USERS                NO

检查数据库表空间的logging和force logging设定
SQL> select tablespace_name,logging,force_logging from dba_tablespaces;

TABLESPACE_NAME      LOGGING   FOR
-------------------- --------- ---
SYSTEM               LOGGING   NO
UNDOTBS1             LOGGING   NO
SYSAUX               LOGGING   NO
TEMP                 NOLOGGING NO
BLOBS                NOLOGGING NO
INDX                 LOGGING   NO
USERS                LOGGING   NO
WCAUDIT              LOGGING   NO

检查整个数据库的force_logging设定
SQL> select force_logging from v$database;

FOR
---
NO

修改表空间的(修改database,table,index也类似)
alter tablespace blobs force logging;
alter tablespace users force logging;
alter tablespace blobs logging;

SQL> select tablespace_name,LOGGING,FORCE_LOGGING FROM DBA_TABLESPACES;

TABLESPACE_NAME                LOGGING   FOR
------------------------------ --------- ---
SYSTEM                         LOGGING   NO
UNDOTBS1                       LOGGING   NO
SYSAUX                         LOGGING   NO
TEMP                           NOLOGGING NO
BLOBS                          LOGGING   YES
INDX                           LOGGING   NO
USERS                          LOGGING   YES
WCAUDIT                        LOGGING   NO

再附送几个查询lob和logging状态的sql:

计算所有LOB的大小:
SELECT SUM(BYTES)/1024/1024/1024 FROM user_segments
where segment_type='LOBSEGMENT';

计算所有nologging的大小
SELECT SUM(s.BYTES)/1024/1024/1024
FROM user_segments s,user_lobs l
where s.segment_type='LOBSEGMENT'
and l.LOGGING='NO' and l.SEGMENT_NAME=s.SEGMENT_NAME;

列出所有nologging/logging 的lobs和对应的表空间及其大小:
select s.segment_name,s.bytes,s.TABLESPACE_NAME
FROM user_segments s,user_lobs l
where s.segment_type='LOBSEGMENT'
and l.LOGGING='NO' and l.SEGMENT_NAME=s.SEGMENT_NAME;

select s.segment_name,s.bytes,s.TABLESPACE_NAME
FROM user_segments s,user_lobs l
where s.segment_type='LOBSEGMENT'
and l.LOGGING='YES' and l.SEGMENT_NAME=s.SEGMENT_NAME;

计算数量

select count(*) from user_lobs where logging='NO';

select count(*) from user_lobs where logging='YES';

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20695384/viewspace-690234/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-02-12

  • 博文量
    17
  • 访问量
    24084