oracle nologging用法

一、oracle日志模式分为(logging,force logging,nologging)

默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志。FORCE LOGGING可以在数据库级别、表空间级别进行设定、而LOGGING与NOLOGGING可以在表级别设定。

注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLOGGING将破坏DATAGUARD的可恢复性.FORCE LOGGING强制数据库在任何状态下必须记录日志。

logging,force logging和nologging是只记录到redo日志中,归档不归档是另外的设置,但是如果用nologging了,那么显然就算归档的话,归档日志就少了,但是可能不能用于介质回复了,因为有些根本没有记录。

二、使用情况

1.logging模式

这是日志记录的缺省模式,无论数据库是否处于归档模式,这并不改变表空间与对象级别上的缺省的日志记录模式。对于临时表空间将不记录日志到联机重做日志文件。

2.nologing模式

此模式不是不记录日志,而是最小化日志产生的数量,通常在下列情况下使用NOLOGGING

nologing模式通常和append联合使用。

append介绍:

/*+append*/ 

(1)  append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo

使用append,一是减少对空间的搜索;二是有可能减少redolog的产生。所以append方式会快很多,一般用于大数据量的处理。建议不要经常使用append,这样表空间会一直在高水位上,除非你这个表只插不删
论坛append解释:
请教一下,oracle中append是做什么用的。
  insert /*+append*/ into table1 select * from table2
在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。使用append会增加数据插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo
不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
 
查redo大小语句:
select name,value,class from v$sysstat where name='redo size';
显示的好方法:
select (1745704-582728) redo1,(1839872-1745704) redo2 from dual;//注意,括号里其实就是两个数减法,然后写进去显示出来而已
 
(2)NOLOGGING与表模式,插入模式,数据库运行模式(archived/unarchived)的关系:
下面仅说明使用append方式插入数据时日志产生的情况,如使用下面的方式进行插入(这里是表是否事先设置成nologging)

            insert/*+append+*/into tb_name select colnam1,colname2 from table_name;    

        数据库处于归档模式

            当表模式为logging状态时,无论是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo。

        数据库处于非归档模式

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

alter table aa nologging

 

alter table aa logging

 

insert /*+append*/ into ...nologing
select * from ...

 

insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;

 

但这样不行:整个表可以插入,但要某一个字段则不能加入nologging
insert /*+ append, parallel */ into ods_list_t(a,b) nologging
select a,b from ods_list;

 

但可以这样:
insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
select a,b from ods_list;

 

create table ods_list_t nologging as select * from ods_list;

 

insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;


insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging
select * from ods_list;

tablename: 表名
number: 并行度

 

使用批量拷贝方法
set arraysize 20
set copycommit 5000
copy from username/password@oracle_name append table_name1
using select * from table_name2;

 

用EXP/IMP 处理大量数据

(1)给当前的两个表分别改名
alter   table   tab1   rename   to   tab11;
alter   table   tab2   rename   to   tab1;
(2)导出改名前的tab2
exp   user/pwd@...   file=...   log=...   tables=(tab1)
(3)把名字改回来
alter   table   tab1   rename   to   tab2;
alter   table   tab11   rename   to   tab1;
(4)导入数据
imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1)

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

(3)真正总结(有用的):

可以看出(这是insert /*+ append */ into ddddd  nologging as select ...... from ...)

1. 不管哪种模式下append要与nologging方式联用才能达到很好的效果。

2. 非归档与归档方式,只用NOLOGGING是不起效果的。

3. 非归档下append已达到不错的效果,但不及与nologging的联用方式。

4. 归档下单append起不到效果。

另外,如果库处在FORCELOGGING模式下,此时的nologging方式是无效的,这个我也测试过
5.非归档模式下:
没有优化前    (1281372  redo size)
(1)、单一的使用nologging参数,对redo的产生没有什么影响。  (1214836  redo size)
(2)、单一的使用append提示,redo的减少很显著              (43872  redo size)
(3)、nologging+append,更显著                             (1108  redo size)

6.归档模式下:
没有优化前:             
(1)、单独使用nologging参数,(1231904  redo size)
(2)、单独使用append提示,  (1245804  redo size)
(3)、nologging + append,     (3748  redo size)

a、使用nologging参数并不代表在dml操作中,oracle不产生redo,只是对于指定表的更新数据不产生redo,但是 oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。
b、单独使用nologging参数,对redo size没有多少影响,只有和append配合时,才能产生效果。
c、单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?
d、归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。

三、查询总结

1.查看不同级别的日志模式

        查看数据库级别日志的归档模式、记录模式  

        SQL>select log_mode,force_logging from v$database; 

        LOG_MODE     FORCE_LOGGING

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

        ARCHIVELOG   NO

        查看表空间级别的日志记录模式

        SQL>select tablespace_name,logging,force_logging from dba_tablespaces;      

        TABLESPACE_NAME LOGGING   FORCE_LOGGING

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

        SYSTEM          LOGGING   NO

        UNDOTBS1        LOGGING   NO

        SYSAUX          LOGGING   NO

        TEMP            NOLOGGING NO

        USERS           LOGGING   NO    

        查看对象级别的日志记录模式

        scott@ORCL>select table_name,logging from user_tables;

        TABLE_NAME                     LOG

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

        TB_A                           YES

        TB_B                           YES

2.日志记录模式的转换

        a.数据库从非强制日子模式切换到强制日志模式

            sys@ORCL>alterdatabase force logging;      

        b.数据库从强制日志模式切换到非强制日志模式

            sys@ORCL>alterdatabaseno force logging;

        c.表空间级别从强制日志模式切换到非强制日志模式

            sys@ORCL>alterdatabaseno force logging;

        d.表空间级别从非强制日志模式切换到强制日志模式

            sys@ORCL>alterdatabaseno force logging;

        e.对象级别日志记录模式

            sys@ORCL>altertable tb_a nologging;     --不记录日志模式

            sys@ORCL>altertable tb_a logging;       --采用日志记录模式

注意:

(1)表是否是nologging模式,还需要查user_tables.logging字段才行。
我刚才在oracle 10g中测试,create table xxx nologging as select *....产生的表并不是nologging方式,还得手工改一下:
alter table xxxx nologging.
改完后,在归档模式,insert /*+append*/确实日志很少。

(2)在使用append 快速加载数据完成后,需要commit or roll ,才能进行进行对该表进程操作否则会报错:ORA-12838: cannot read/modify an object after modifying it in parallel错误。insert和append insert的原理上是完全不同的,insert append可以实现直接路径加载,速度比常规加载方式快很多。但有一点需要注意: insert append时在表上加“6”类型的Exclusive锁,即排它锁,为表级锁,会阻塞表上的所有DML语句。因此在有业务运行的上传环境下要慎重使用。

 

转载于:https://www.cnblogs.com/zmlctt/p/3747443.html

<think>好的,用户现在问的是Oracle中的shrink操作如何结合nologging来写。我需要先回顾一下shrink space和nologging的相关知识。 首先,shrink space是用来重组表数据,减少碎片,释放空间的操作。通常在启用了行移动的情况下才能执行。而nologging选项通常用于减少redo日志的生成,加快操作速度,但可能会影响恢复能力。 用户可能想知道在执行shrink时如何应用nologging,但根据之前的了解,shrink操作本身是否支持nologging呢?可能需要查证一下官方文档或者实际测试。假设用户可能混淆了某些操作,比如表重建时使用nologging,而shrink本身可能不支持直接指定nologging。 然后,我需要检查用户的历史提问,之前他询问过如何查找用户下注释为空的对象,现在转向shrink和nologging,可能是在进行空间优化,或者维护数据库性能。用户可能是一位DBA,或者是开发人员,负责数据库维护,需要优化存储空间,同时减少日志开销。 可能存在的误区是认为shrink操作可以使用nologging,但实际上Oracle的shrink命令是否允许nologging参数?根据记忆,ALTER TABLE ... SHRINK SPACE并没有直接提供nologging的选项。nologging通常用于直接路径操作,比如CTAS、INSERT /*+ APPEND */,或者某些DDL如ALTER TABLE MOVE。 所以正确的做法可能是在move表时使用nologging,而shrink本身并不支持。这时候需要向用户解释两者的区别,并提供替代方案,比如使用move加上nologging,然后再启用行移动进行shrink。但需要注意move操作会改变行的物理位置,可能需要重建索引,同时会影响日志生成。 另外,用户可能想通过nologging减少日志量,提升shrink速度,但可能对shrink和move的区别不太清楚。需要明确说明shrink本身是否会产生大量redo,以及如何结合nologging来优化。 总结回答步骤: 1. 指出shrink操作本身不支持nologging。 2. 提供替代方案,如使用alter table move nologging,但需要重建索引。 3. 说明shrink和move的区别,以及各自的适用场景。 4. 提醒用户nologging的风险,比如无法通过redo恢复,需要备份。 5. 可能给出示例代码,说明如何正确使用move和shrink。</think>--- 在Oracle中,**`SHRINK SPACE`** 操作主要用于压缩表段(消除碎片、释放空间),但 **`SHRINK` 本身不支持直接使用 `NOLOGGING` 模式**。若需减少日志生成,需结合 `MOVE` 操作或调整表的日志模式。以下是详细说明: --- ### **方法1:直接使用 `SHRINK SPACE`** `SHRINK SPACE` 默认生成完整redo日志,无法通过 `NOLOGGING` 减少日志量: ```sql -- 启用行移动(必需) ALTER TABLE 表名 ENABLE ROW MOVEMENT; -- 执行压缩 ALTER TABLE 表名 SHRINK SPACE; ``` --- ### **方法2:`MOVE` 操作 + `NOLOGGING`** 若需减少日志,可通过 `MOVE` 重组表并指定 `NOLOGGING`: ```sql -- 设置表为NOLOGGING模式 ALTER TABLE 表名 NOLOGGING; -- 执行MOVE操作(重组表数据) ALTER TABLE 表名 MOVE NOLOGGING; -- 重建索引(MOVE后索引失效) ALTER INDEX 索引名 REBUILD NOLOGGING; -- 恢复表为LOGGING模式(可选) ALTER TABLE 表名 LOGGING; ``` --- ### **关键区别** | **操作** | **支持NOLOGGING** | **是否释放空间** | **索引状态** | **适用场景** | |----------------|-------------------|------------------|----------------------|---------------------------| | `SHRINK SPACE` | 否 | 是 | 保持有效 | 在线碎片整理,允许少量DML | | `MOVE` | 是 | 是 | 需要重建索引 | 离线重组,追求最小日志量 | --- ### **注意事项** 1. **`NOLOGGING` 的风险** - 操作期间若发生故障,数据可能无法通过redo恢复,需提前备份。 - 仅建议在维护窗口或可接受数据丢失风险的场景使用。 2. **空间要求** - `MOVE` 需要额外空间存储重组后的数据,确保表空间足够。 3. **补充操作** - 执行 `MOVE` 后需重建索引、统计信息: ```sql ANALYZE TABLE 表名 COMPUTE STATISTICS; ``` --- ### **示例完整脚本** ```sql -- 1. 设置表为NOLOGGING ALTER TABLE employees NOLOGGING; -- 2. 执行MOVE操作 ALTER TABLE employees MOVE NOLOGGING; -- 3. 重建主键索引 ALTER INDEX emp_pk REBUILD NOLOGGING; -- 4. 恢复日志模式 ALTER TABLE employees LOGGING; ``` --- 若需结合 `SHRINK` 和 `NOLOGGING`,建议先用 `MOVE NOLOGGING` 减少日志,再定期执行 `SHRINK` 维护碎片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值