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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle中的"append nologging"是一种数据插入方式,它可以在插入数据时不写入日志文件,从而提高数据插入的效率。但是,这种方式也会带来一定的风险,因为如果系统崩溃或出现故障,这些未记录的数据将无法恢复。因此,在使用"append nologging"时需要谨慎考虑,并根据具体情况进行选择。 ### 回答2: 在Oracle数据库中,"append nologging"是一个用于插入数据的选项。当我们使用这个选项时,会告知Oracle不要将数据更改记录的日志信息写入日志文件中。 使用"append nologging"选项有以下几个优点: 1. 提高插入性能:由于不需要将每个插入操作的详细信息写入日志文件,可以大大减少写操作对性能的影响。这对于大批量数据插入操作特别有效,可以显著提高插入速度。 2. 减少日志文件大小:由于没有记录每个插入操作的日志,可以减少日志文件的大小。这对于需要保留日志一段时间的数据库来说,可以显著减少存储空间的使用。 3. 简化恢复过程:由于没有详细的插入操作日志,恢复过程可以更简单。在某些情况下,可以通过简单的回滚操作来还原数据。 然而,使用"append nologging"选项也存在一些风险和限制: 1. 不能进行点恢复:由于没有详细的插入操作日志,当发生故障时无法进行点恢复。如果需要恢复到插入操作之前的状态,只能进行完全恢复。 2. 必须小心使用:"append nologging"选项要谨慎使用,必须仔细评估数据的重要性和对插入操作的恢复需求。如果数据丢失将会造成严重问题,应该避免使用此选项。 3. 仅适用于插入操作:"append nologging"选项只适用于插入操作,对其他数据操作(如更新和删除)无效。 总之,"append nologging"选项是Oracle数据库中一个能够提高插入性能和减少存储空间使用的选项,但使用时需要注意数据的重要性和对插入操作的恢复需求。 ### 回答3: 在Oracle数据库中,"append nologging"是一种表级别的选项,用于指定在数据插入操作中不生成任何日志信息。通过使用"append nologging"选项,可以提高数据插入的性能。 当我们执行插入操作时,默认情况下,Oracle会将插入的数据写入日志文件中,以确保数据的持久性和安全性。然而,对于一些大规模的数据插入操作,特别是对于临时或者不重要的数据,生成日志文件可能会成为性能瓶颈。这时,我们可以选择使用"append nologging"选项,该选项会禁止生成日志文件,从而提高插入操作的性能。 使用"append nologging"选项需要谨慎,因为它可能会导致数据丢失的风险。由于没有生成日志文件,一旦系统发生故障或者崩溃,这些没有被记录的数据将无法恢复。因此,在使用"append nologging"选项时,需要确保数据的重要性和可恢复性,并做好相应的数据备份和恢复策略。 可以通过以下语法在Oracle中使用"append nologging"选项: ``` INSERT /*+ APPEND NOLOGGING */ INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` 在上述语句中,通过在INSERT语句中添加"/*+ APPEND NOLOGGING */"注释来启用"append nologging"选项。然后,我们可以指定要插入的表名和对应的列和值。 需要注意的是,使用"append nologging"选项并不会对查询和更新操作产生影响。它只适用于插入操作,并且仅在一些特定的情况下才建议使用,例如临时表、快速数据装载等。 总之,"append nologging"是Oracle数据库中的一个选项,用于指定在数据插入操作中不生成任何日志信息,从而提高插入操作的性能。但是,需要谨慎使用,并做好相应的数据备份和恢复策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值