Oracle

LOGGING模式

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

FORCE LOGGING

强制记录日志,即对数据库中的所有操作都产生日志信息,并将该信息写入到联机重做日志文件。

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

NOLOGGING

尽可能的记录最少日志信息到联机日志文件。


数据库处于归档模式
nologging + append 模式,不会生成redo。

数据库处于非归档模式
append 模式不会生成redo, no append模式都会生成redo。

1
2
3
select log_mode,force_logging from v$database;
alter database force logging;
insert /*+append parallel(32)*/ into tab nologging

最小附加日志(minimal supplemental logging)

1
2
3
4
alter database {add|drop} supplemental log data;
alter table test drop supplemental log data(all,primary key,unique,foreign key) columns;
select * from v$flash_recovery_area_usage;
DELETE noprompt ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';

tablespace

1
2
3
4
5
alter tablespace test offline;
cp datafile newdatafile;
alter tablespace test rename datafile datafile to newdatafile
alter tablespace test online;
ora-01113 文件10 需要介质修复,输入语句:recover datafile 10;

ORACLE常用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#序列
select level as xh from dual connect by level <= 8;
#lag 忽略空
select a.*, nvl(test, lag(a.test ignore nulls ) over(order by xh)) from cs12 a order by a.xh;
#替换中文
select regexp_replace('1测试S01','[' || unistr('\0391') || '-' || unistr('\9fa5') || ']','') from dual;
#导出脚本
nohup expdp \"/ as sysdba\" PARALLEL=16 cluster=no COMPRESSION=ALL DUMPFILE=CS_%U.dmp DIRECTORY=NEW_DIR logfile=cs.log schemas=cs_user \ query= \"where lrrq\>\=to_date\(\'2022-01-01 00:00:00\'\,\'yyyy-mm-dd hh24:mi:ss\'\) or \(xgrq\>\=to_date\(\'2022-01-01 00:00:00\'\,\'yyyy-mm-dd hh24:mi:ss\'\) \)\" > cs.out 2>&1 &;
#搜集统计信息
EXEC dbms_stats.gather_table_stats(ownname => 'USER',tabname => 'TABLENAME',cascade => TRUE,estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO',degree=>16 );
#查看执行计划
select a.SQL_TEXT, a.SQL_FULLTEXT, a.ADDRESS || ',' || a.HASH_VALUE
from v$sqlarea a
where sql_fulltext like '%and t.cs = :1%';
select * from v$sql_plan where sql_id = '2n2yxg7h0chdt';
#清除旧的执行计划
exec sys.dbms_shared_pool.purge('0700000B4EBA9AC8,3758506425', 'c');