对于某些加载数据的应用,比如SQL*Loader或者impdp等操作是不需要生成日志的,再这些工作之前我们可以通过以下手段有效的减少数据库的消耗。
案例演示使用oracle12c的pdb
一, 修改表空间的日志生成方式
show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
1. 切换到pdb
alter session set container=pdb1;
2. 创建表空间Baymax作为我们的演示对象
create tablespace baymax
datafile '/u01/app/oracle/oradata/cdb/pdb1/baymax01.dbf'
size 20m
autoextend on maxsize 1g;
select tablespace_name,file_name,bytes/1024/1024 mb,autoextensible from cdb_data_files;

默认创建的表空间日志模式为开启状态LOGGING


默认创建的表空间日志模式为开启状态LOGGING
select tablespace_name,logging,con_id from cdb_tablespaces;

3. 关闭表空间的日志模式
alter tablespace baymax nologging;
select tablespace_name,logging,con_id from cdb_tablespaces where tablespace_name='BAYMAX';
TABLESPACE LOGGING CON_ID
---------- --------- ----------
BAYMAX NOLOGGING 3
4. 作为数据加载后可以手工调整回日志方式
alter tablespace baymax logging;
二,数据泵导入数据时使用isable_archive_logging参数
12c的新特性,可以尽量减少导入操作时生成日志。并且在expdp时可以自动判断是否符合自动加载的条件direct=y。如果符合该条件数据泵会自动开启直接路径加载的方式来提高导出速度,比之前版本的数据泵只能了许多。
create or replace dp_dir as '/home/oracle';
grant read,write on directory dp_dir to dp
$ impdp dp/dp directory=dp_dir dumpfile=hr.dmp transform=disable_archive_logging:Y
需要注意的是常规的DML操作,如insert,update,delete语句是不受nologging限制的。即使在表空间上设置了nologging,也会生成日志,这样做是为了数据的可恢复性。
nologging的有效工作范围很小,总结如下:
- 直接路径加载的insert语句
- 直接路径的SQL*Loader语句
-
CREATE TABLE
AS SELECT(nologging只会影响创建表时的insert语句,当表创建好以后就不再受nologging的影响) -
ALTER TABLE
MOVE -
ALTER TABLE
ADD/MERGE/SPLIT/MOVE/MODIFY PARTITION - CREATE INDEX
-
ALTER INDEX
REBUILD - CREATE MATERIALIZED VIEW
-
CREATE MATERIALIZED VIEW LOG
-
ALTER MATERIALIZED VIEW
MOVE -
ALTER MATERIALIZED VIEW LOG
MOVE
以后的学习过程中发现新的方法再补充进来。
全文完