ORACLE Nologging相关知识

1) Nologging跟数据库的运行模式有关,8i和9i的默认安装都是非归档模式,并且自动归档默认是禁用

SQL> archive log list;

Database log mode             No Archive Mode

Automatic archival             Unabled

Archive destination            C:/oracle/ora92/RDBMS

Oldest online log sequence     85

Current log sequence           87

 

2)关闭数据库

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

3)

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

 

Database mounted.

 

4)修改为归档模式

SQL> alter database archivelog;

Database altered.

 

5)打开数据库

SQL> alter database open;

Database altered.

 

6)

SQL> archive log list;

Database log mode             Archive Mode

Automatic archival             Unabled

Archive destination            C:/oracle/ora92/RDBMS

Oldest online log sequence     85

Next online log sequence     87

Current log sequence           87

 

7)由于Automatic archivalà Unabled

SQL> archive log start;

SQL> archive log list;

Database log mode             Archive Mode

Automatic archival             Enabled

Archive destination            C:/oracle/ora92/RDBMS

Oldest online log sequence     85

Next online log sequence     87

Current log sequence           87

 

8)此时推荐关闭数据库,然后进行一下备份

SQL> shutdown immediate

 

9)

SQL> startup

 

10)如果在9i环境中并设置了FORCE LOGGING,则nologging操作是无效的,并不会加快,可以通过如下语句设置为NO FORCE LOGGING。

SQL>Alter database no force logging;

是否开启了FORCE LOGGING,可以用如下语句查看

SQL> select force_logging from v$database;

 

FORCE_

------

NO

11) 一个使用CTAS nologging并比较redo size的例子

SQL> CREATE OR REPLACE VIEW redo_size

  2  AS

  3     SELECT VALUE

  4       FROM v$mystat, v$statname

  5      WHERE v$mystat.statistic# = v$statname.statistic#

  6        AND v$statname.NAME = 'redo size';

 

View created.

 

SQL> connect sys/sys@oratest as sysdba;

 

SQL> create table t nologging as select * from dba_objects;

 

Table created.

 

--T产生的Redo

SQL> select * from redo_size;

 

     VALUE

----------

     48504

 

SQL> create table tt as select * from dba_objects;

 

Table created.

 

SQL> select * from redo_size;

 

     VALUE

----------

   3457796

 

--TT产生的Redo

SQL> select 3457796 - 48504 from dual;

 

3457796-48504

-------------

      3409292

 

SQL> select table_name,logging from dba_tables where table_name in ('T','TT');

 

TABLE_NAME                                               LOGGIN

------------------------------------------------------------ ------

T                                                            NO

TT                                                           YES

  

参考来源:http://www.itpub.net/showthread.php?s=&threadid=609347&perpage=10&pagenumber=2

 

12)index上使用nologging属性的例子

--创建Table T

colm@COLM> create table t as select * from all_objects;

colm@COLM> connect colm/colm@colm

已连接。

--查看一下当前redo size

colm@COLM> @c:/script/mystat "redo size";

colm@COLM> set echo off

NAME     VALUE

--------------------------

redo size     560

--创建一个索引

colm@COLM> create index t_idx on t(object_name);

 

--查看一下此时redo size

colm@COLM> @c:/script/mystat "redo size";

colm@COLM> set echo off

NAME       VALUE

--------------------------------

redo size      1252680

 

--重建该index

colm@COLM> alter index t_idx rebuild;

索引已更改。

 

--与之前的产生的redo size进行比较,V代表目前的redo ,Diff代表重建所产生的redo,可以发现creat index与alter index产生的redol量基本相等

colm@COLM> @c:/script/mystat2

colm@COLM> set echo off

 

NAME-      V            DIFF

---------- ------------------------------------------

redo size    2511720        1,259,040

 

--alter index nologging

colm@COLM> alter index t_idx nologging;

 

索引已更改。

colm@COLM> @c:/script/mystat2;

colm@COLM> set echo off

 

NAME         V             DIFF

---------- ------------------

redo size       2515968        2,124

 

--再一次重建索引,45K的redo size与之前的1.2M相比少了许多

colm@COLM> alter index t_idx rebuild;

 

索引已更改。

 

colm@COLM> @c:/script/mystat2;

colm@COLM> set echo off

 

NAME              V                DIFF

---------- ------------------

redo size            2559308           45,464

 

附:上面用到的2个脚本

--mystat.sql

set echo off

set verify off

column value new_val V

define S="&1"

 

set autotrace off

select a.name, b.value

from v$statname a, v$mystat b

where a.statistic# = b.statistic#

and lower(a.name) like '%' || lower('&S')||'%'

/

set echo on

 

--mystat2.sql

set echo off

set verify off

column diff format a18

select a.name, b.value V, to_char(b.value-&V,'999,999,999,999') diff

from v$statname a, v$mystat b

where a.statistic# = b.statistic#

and lower(a.name) like '%' || lower('&S')||'%'

/

set echo on

 

13)关于Direct insert append产生redo量的问题, eygle有做过测试

a). 数据库运行在非归档模式下:

create table test as select * from dba_objects where 1=0;

 

insert into test select * from dba_objects;

 

insert

/*+ append */

into test select * from dba_objects;

在Noarchivelog模式下,对于常规表的Direct insert append只产生少量redo

 

create table test nologging as select * from dba_objects where 1=0;

 

insert into test select * from dba_objects;

 

insert

/*+ append */

into test select * from dba_objects;

在Noarchivelog模式下,对于nologging表的Direct insert append也只产生少量redo

 

b).在归档模式下:

create table test as select * from dba_objects where 1=0;

 

insert into test select * from dba_objects;

 

insert

/*+ append */

into test select * from dba_objects;

在归档模式下,对于常规表的insert append产生和insert同样的redo

此时的insert append实际上并不会有性能提高.

但是此时的append是生效了的

 

create table test nologging as select * from dba_objects where 1=0;

 

insert into test select * from dba_objects;

 

insert

/*+ append */

into test select * from dba_objects;

在archivelog模式下,对于nologging表的Direct insert append只产生少量redo,

在这种情况下等价于在Noarchivelog模式下Direct insert append

参考信息:http://www.itpub.net/showthread.php?s=&postid=1618916

 

 

14)关于nologging,direct insert,UNDO三者之间的关系,biti_rainy有过这样的解释

不管表是否在nologging 下,只要是 direct insert,就不会对数据内容生成undo,也就是不会为insert而记录 rowid

在 direct insert 后回滚数据,实际上并没有进行数据的 删除操作

而是仅仅对空间进行了回收。若是删除,不可能只产生这么少的 redo,这里从另一个侧面证明

即使 logging 下的 direct insert 对于回滚信息,也是不会对数据产生 undo 而仅仅产生空间变化的 undo

参考信息http://www.itpub.net/showthread.php?threadid=217094

 

 

小结:

Nologging模式可以使用的操作

1.   CTAS创建表

2.   Index的创建和重建

3.  

Insert

/*+ append */ into tes

t

select

直接路径插入

4.   Alter Table操作,如remove,split

 

更多信息http://search.itpub.net/search.php?s=5ee7a3ad7109a32ae7033f52d68be149&action=showresults&searchid=399212&sortby=lastpost&sortorder=descending

 

另外在自己测试时可能觉得需要把buffer cache清空一下,可以参考。

 

 

 

=======================NOLOGGING&&FORCE LOGGING=================================

 

关于nologging:

 

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

 

查询数据库当前FORCE_LOGGING的设置

SQL> select force_logging from v$database;

FOR
---
NO

SQL>

你可能感兴趣的:(oracle,table,database,insert,logging,archive)