Oracle Nologging and Append
对于logging的理解总是以为表的日志设置为NO它就不会去产生日志了,其实不是的下面是对于logging的一些解释和试验。
Logging介绍
可以采用nologging模式执行以下操作:
1. 索引的创建和ALTER(重建)。
2. 表的批量INSERT(通过/*+append */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据生成少量redo,但是所有索引修改会生成大量redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
3. Lob操作(对大对象的更新不必生成日志)。
4. 通过create table as select创建表。
5. 各种alter table操作,如move和split。
在一个archivelog模式的数据库上,如果nologging使用得当,可以加快许多操作的速度,因为它能显著减少生成的重做日志量。假设你有一个表,需要从一个表空间移到另一个表空间,原先需要N小时才能完成的操作可能只需要N/2小时。要想适当地使用这个特性,需要DBA的参与,或者必须与负责数据库备份和恢复(或任何备用数据库)的人沟通。如果这个人不知道使用了这个特性,一旦出现介质失败,就可能丢失数据,或者备用数据库的完整性可能遭到破坏,对此一定要三思。 对象Logging状态查询
通过此查询SQL语句查询表的logging状态
SELECT T.TABLE_NAME, T.LOGGING
FROM USER_TABLES T
WHERE T.TABLE_NAME LIKE '%TEST_FUTUFARES%';
Create和Insert的Logging测试
Create table …. as select ….及 insert into …..select ….测试
改变logging状态值的方法:
ALTER TABLE table_name NOLOGGING/logging;
下面的例子是源数据在1万条左右,Create table …as
select …测试发现相差2秒钟左右,特别是在大数据量带有nologging的Create速度上确实会快很多。
下面是INSERT语句的测试数据量在2百万左右,TEST_FUTUFARES2的logging不管是在YES还是NO的状态下其实插入都是一样的速度
通过以上测试其实表在Nologging与Logging状态时插入2百万的数据耗时差不多的,也就是说DML不是说不记日志而只是在特定的情况下是不记日志的,比如用SQL*Loader直接装载及INSERT /*+Append*/选项直接路径装载,也就是说不管是否是NOLOGGING状态DML操作正常情况下肯定会产生日志。
Nologging模式下数据库操作只有如下几种情况下不产成redo记录:
1、用sql*load的direct load方式时,不采用redo记录
已测试
2、用insert的direct方式,即在append方式insert
已测试
3、create table ….as select….
已测试
4、create index
create index TEST_FUTUFARES2_log on TEST_FUTUFARES2
(FARE_KIND,FUTUFARE_TYPE) nologging;
创建索引要想产生极少的REDO必须要按上面的那种方式创建索引,按照上面的那种方法去创建索引不管表的日志是处在nologging还是logging状态下都是一样都会产生很少的REDO日志,否则还是会产生大量的REDO日志。
5、alter table ... move partition
6、alter table ... split partition
7、alter index ... split partition
8、alter index ... rebuild
9、alter index ... rebuild partition 10、INSERT, UPDATE, and DELETE on LOBs in NOCACHE
NOLOGGING mode stored out of line
Append介绍
非归档模式情况下:
1.查看当前会话所有产生的REDO总量
表处于nologging状态:
SQL> set timing on;
SQL> INSERT INTO TEST_FUTUFARES2 SELECT * FROM
TEST_FUTUFARES;
2090220 rows inserted
Executed in 36.25 seconds
SQL> SELECT , B.VALUE FROM V$MYSTAT B, V$STATNAME A
WHERE A.STATISTIC# = B.STATISTIC# AND LIKE '%redo
size%';
NAME VALUE
--------------------------------------------------------------------------
Redo size 113495212
SQL> INSERT /*+append*/ INTO TEST_FUTUFARES2 SELECT *
FROM TEST_FUTUFARES;
2090220 rows inserted
Executed in 9.062 seconds
SQL> SELECT , B.VALUE FROM V$MYSTAT B, V$STATNAME A
WHERE A.STATISTIC# = B.STATISTIC# AND LIKE '%redo
size%';
NAME VALUE
--------------------------------------------------------------------------
Redo size 113560764
SQL> select 113560764-113495212 from dual;
113560764-113495212
-------------------
65552
表处于logging状态:
对于此测试得出的结果其实跟上面的nologging得出的测试结果几乎是一模一样的,就不贴出来了。
归档模式情况下:
表处于logging状态:
SQL> INSERT INTO TEST_FUTUFARES2 SELECT * FROM
TEST_FUTUFARES;
2090220 rows inserted
Executed in 44.031 seconds
SQL> SELECT , B.VALUE FROM V$MYSTAT B, V$STATNAME A
WHERE A.STATISTIC# = B.STATISTIC# AND LIKE '%redo
size%';
NAME VALUE
--------------------------------------------------------------------------
Redo size 113460280
SQL> INSERT /*+append*/ INTO TEST_FUTUFARES2 SELECT *
FROM TEST_FUTUFARES;
2090220 rows inserted
Executed in 24.297 seconds
SQL> SELECT , B.VALUE FROM V$MYSTAT B, V$STATNAME A
WHERE A.STATISTIC# = B.STATISTIC# AND LIKE '%redo
size%';
NAME VALUE
--------------------------------------------------------------------------
Redo size 223253980
SQL> select 223253980-113460280 from dual;
223253980-113460280 -------------------
109793700
表处于nologging状态:
SQL> INSERT /*+append*/ INTO TEST_FUTUFARES2 SELECT *
FROM TEST_FUTUFARES;
2090220 rows inserted
Executed in 6.391 seconds
SQL> SELECT , B.VALUE FROM V$MYSTAT B, V$STATNAME A
WHERE A.STATISTIC# = B.STATISTIC# AND LIKE '%redo
size%';
NAME VALUE
--------------------------------------------------------------------------
redo size
223576712
SQL> select 223576712-223253980 from dual;
223576712-223253980
-------------------
322732
2.查看全局数据库redo生成量,可以通过v$sysstat视图看到
SQL> select name,value from v$sysstat where name='redo size';
NAME VALUE
--------------------------------------------------------------------------
Oracle物化视图定时全量刷新导致归档日志骤增
Oracle物化视图定时全量刷新导致归档⽇志骤增
⼀、问题描述
某项⽬组来电,说有⼀个源表约2万多条的物化视图,每5分钟定时全量(Complete)刷新⼀次,⼀天下来,导致Oracle数据库归档⽇志骤增。
⼆、问题分析及解决
先明确⼀个问题:归档⽇志(Archive Log)和重做⽇志(REDO Log)的关系。
Oracle的重做⽇志是⼀组(或⼏组)⽂件,按⼀定的规则顺序循环写,当重做⽇志写满后,从头开始写之前,如果数据库在归档模式(Archive),则在重写
之前,需要把当前的重做⽇志进⾏归档(Archive),形成归档⽇志。即归档⽇志来⾃于重做⽇志。
基于此,可以通过减少产⽣重做⽇志的量来达到减少归档⽇志量的⽬的。
综合⼀下:
1、不要全量刷新,采⽤在源表上记录物化视图⽇志的⽅式,实现快速刷新,减少更新的数据量,达到减少重做⽇志的⽬的;
2、指定物化视图为nologging模式
3、减少或取消其上的索引(2W条记录,如果使⽤得⽐较频繁,甚⾄可以考虑把它cache到内存中)
4、如果⼀定要有索引,⾃⼰写刷新的Job,先disable索引,然后刷新,然后重建索引(唯⼀索引可能有问题)。
5、评估业务、技术要求,考虑取消物化视图,建⽴⼀般视图,在访问该视图时,直接从源表中查询。
三、验证过程
验证全量刷新的物化视图产⽣的REDO⽇志的⼤⼩: -- 建⽴源表
create table big_table as select * from dba_objects;
-- 我机器上(11g),⼤概8W条记录
select count(*) from big_table;
/*
开始验证全量刷新产⽣的REDO⽇志的量
*/
-- 建⽴物化视图
create materialized view big_table_mv as select * from big_table;
-- 查看⽬前REDO⽇志的量(重新启动数据库会⾃动清理)
Oracle存储过程执行存储过程带日期参数
Oracle存储过程执⾏存储过程带⽇期参数
1、上⼀篇出的是Oracle数据库创建存储过程不带参数,直接执⾏,这种满⾜⽇常查询,这篇是带⽇期的调⽤
那么如果有⼀些常⽤查询或者计算需要传参数的,则需带参和传参 ,我先⽤⽇期参数做为⽰例
CREATE OR REPLACE PROCEDURE PROC_TEMP1(S_DATE IN VARCHAR2,E_DATE IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE TEMP1 NOLOGGING AS
SELECT T.CREATE_STAFF,T.CREATE_ORG_ID,COUNT(1) ORDER_CNT
FROM TABLE_NAME T
WHERE T.CREATE_ORG_ID<>''0''
AND T.CREATE_STAFF<>''0''
AND T.SYS_SOURCE=''0''
AND T.CREATE_DATE >= TO_DATE('''||S_DATE||''',''YYYY-MM-DD'')
AND T.CREATE_DATE <=TO_DATE('''||E_DATE||''',''YYYY-MM-DD'')
GROUP BY T.CREATE_STAFF,T.CREATE_ORG_ID';
END;
绿⾊字体中就是存储过程创建的关键字;
红⾊字体就是⼊参,和参数的使⽤,传⽇期参数的时候,传VARCHAR2字符类型,然后使⽤TO_DATE转化为⽇期类型,就可以查出数
据,⾮常好⽤。
2、执⾏存储过程,代⼊⽇期
BEGIN PROC_TEMP1('2021-07-01','2021-07-02'); END;
这就可以了
创建和调⽤都有
oracle11g常用命令
1 第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> alter system checkpoint; 3.adding online redo log groups sql> alter database add logfile [group 4] sql> ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m; 4.adding online redo log members sql> alter database add logfile member sql> '/disk3/log1b.rdo' to group 1, sql> '/disk4/log2b.rdo' to group 2; 5.changes the name of the online redo logfile sql> alter database rename file 'c:/oracle/oradata/oradb/redo01.log' sql> to 'c:/oracle/oradata/redo01.log'; 6.drop online redo log groups sql> alter database drop logfile group 3; 7.drop online redo log members sql> alter database drop logfile member 'c:/oracle/oradata/redo01.log'; 8.clearing online redo log files sql> alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo'; ing logminer analyzing redo logfiles a. in the init.ora specify utl_file_dir = ' '
Oracle tablespace (表空间)的创建、删除、修改、扩展及检查等
Oracle tablespace (表空间)的创建、删除、修改、扩展及检查等
oracle 数据库表空间的作用
1.决定数据库实体的空间分配;
2.设置数据库用户的空间份额;
3.控制数据库部分数据的可用性;
4.分布数据于不同的设备之间以改善性能;
5.备份和恢复数据。
--oracle 可以创建的表空间有三种类型:
1.temporary: 临时表空间,用于临时数据的存放;
create temporary tablespace "sample"......
2.undo : 还原表空间. 用于存入重做日志文件.
create undo tablespace "sample"......
3.用户表空间: 最重要,也是用于存放用户数据表空间
create tablespace "sample"......
--注:temporary 和 undo 表空间是oracle 管理的特殊的表空间.只用于存放系统相关数据.
--oracle 创建表空间应该授予的权限
1.被授予关于一个或多个表空间中的resource特权;
2.被指定缺省表空间;
3.被分配指定表空间的存储空间使用份额;
4.被指定缺省临时段表空间。
select tablespace_name "表空间名称",status "状态",extent_management "区管理方式",allocation_type "磁盘扩展管理方式",segment_space_management "段管理方式" from dba_tablespaces;
--查询各个表空间的区、段管理方式
--1、建立表空间
--语法格式:
create tablespace 表空间名 datafile '文件标识符' 存储参数 [...]
|[minimum extent n] --设置表空间中创建的最小范围大小
oracle常见等待事件及处理方法
实用标准文案
文档
我们可以通过视图v$session_wait来查看系统当前的等待事件,以及与等待事件相对应的资源的相关信息
看书笔记db file scattered read DB ,db file sequential read DB,free buffer waits,log
buffer space,log file switch,log file sync
我们可以通过视图v$session_wait来查看系统当前的等待事件,以及与等待事件相对应的资源的相关信息,从而可确定出产生瓶颈的类型及其对象。v$session_wait的p1、p2、p3告诉我们等待事件的具体含义,根据事件不同其内容也不相同,下面就一些常见的等待事件如何处理以及如何定位热点对象和阻塞会话作一些介绍。
<1> db file scattered read DB 文件分散读取 (太多索引读,全表扫描-----调整代码,将小表放入内存)
这种情况通常显示与全表扫描相关的等待。当全表扫描被限制在内存时,它们很少会进入连续的缓冲区内,而是分散于整个缓冲存储器中。如果这个数目很大,就表明该表找不到索引,或者只能找到有限的索引。尽管在特定条件下执行全表扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否必要。因为全表扫描被置于LRU(Least
Recently Used,最近最少适用)列表的冷端(cold end),所以应尽量存储较小的表,以避免一次又一次地重复读取它们。
==================================================
该类事件的p1text=file#,p1是file_id,p2是block_id,通过dba_extents即可确定出热点对象(表或索引)
select owner,segment_name,segment_type
OracleGoldenGate常用参数
OracleGoldenGate常⽤参数
OGG(Oracle GoldenGate)参数介绍
所有的GoldenGate进程均有参数⽂件 Manager
Extract
Replicat
Utilities
所有参数均有缺省配置 实际应⽤只需对⼩部分参数进⾏配置
所有参数⽂件均放在 ./dirprm⽬录下 缺省通过进程名进⾏查找
⼀、全局参数
MGRSERVNAME Specifies the name of the Manager process when it is installed as a Windows service.
CHECKPOINTTABLE Specifies a default checkpoint table.
GGSCHEMA Specifies the name of the schema that contains the database objects that support DDL synchronization for Oracle.
DDLTABLE Specifies a non-default name for the DDL history table that supports DDL synchronization for Oracle.
MARKERTABLE Specifies a non-default name for the DDL marker table that supports DDL synchronization for Oracle.
OUTPUTFILEUMASK Specifies a umask that can be used by Oracle GoldenGate processes to create trail files and discard files.
SYSLOG Filters the types of Oracle GoldenGate messages that are written to the system logs.
Oracleredo与undo
Oracleredo与undo
Undo and redo
Oracle最重要的两部分数据,undo 与redo,redo(重做信息)是oracle在线(或归档)重做⽇志⽂件中记录的信息,可以利⽤redo重放事务信息,undo(撤销信息)是oracle在undo段中记录的信息,⽤于撤销或回滚事务。
1 redo
重做⽇志⽂件redo log,是数据库的事务⽇志,oracle维护着2类重做⽇志,在线重做⽇志⽂件和归档重做⽇志⽂件,归档⽇志⽂件就是重做⽇志的副本,系统将⽇志⽂件填满时arch进程会在另⼀个位置建⽴⼀个在线重做⽇志的副本 每个oracle数据库⾄少有2个重做⽇志组,以便切换⽇志,每个⽇志组⾄少有1个⽇志组成员,这些在线重做⽇志⽂件是以循环写的⽅式使⽤,
2 undo
你对数据库执⾏修改时,数据库会⽣成undo信息,以便回滚到更改前的状态,undo⽤于取消⼀条语句或⼀组语句的作⽤,undo在数据库内部存放在⼀组特殊的段中,
为undo段(回滚段 rollback segment),利⽤undo,数据库只是逻辑的恢复到原来的样⼦,所有修改都逻辑的取消,但是数据结构以及数据块本⾝在回滚后可能不⼤相同, 对于undo⽣成对于直接路径操作不适⽤,直接路径操作能够绕过表上的undo⽣成。
SQL> set autotrace traceonly statisticsSQL> select * from t;--not first executeno rows selectedStatistics---------------------------------------------------------- 0 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 995 bytes sent via SQL*Net to client 374 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processedSQL> insert into t select * from all_objects;49789 rows created.SQL> rollback;Rollback complete.SQL> select * from t;no rows selectedStatistics---------------------------------------------------------- 0 recursive calls 0 db block gets 689 consistent gets -----I/O 0 physical reads 0 redo size 995 bytes sent via SQL*Net to client 374 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processedInsert导致⼀些块增加到表的⾼⽔位线(HWM),这些块没有因为回滚⽽消失,select extent_id, bytes, blocks from user_extents
一个insert插入语句很慢的优化
⼀个insert插⼊语句很慢的优化
1、insert建议
update表的时候,oracle需要⽣成redo log和undo log;此时最好的解决办法是⽤insert,并且将表设置为nologging;当把表设为nologging后,并且使⽤的insert时,速度是最快的,
这个时候oracle只会⽣成最低限度的必须的redo log,⽽没有⼀点undo信息
前提:在做insert数据之前,如果是⾮⽣产环境,请将表的索引和约束去掉,待insert完成后再建索引和约束。
1.
insert into tab1 select * from tab2;
commit;
这是最基础的insert语句,我们把tab2表中的数据insert到tab1表中。根据经验,千万级的数据可在1⼩时内完成。但是该⽅法产⽣的arch会⾮常快,需要关注归档的产⽣量,及时启动备份软件,避免arch⽬录撑爆。2.
alter table tab1 nologging;
insert /*+ append */ into tab1 select * from tab2;
commit;
alter table tab1 logging;
该⽅法会使得产⽣arch⼤⼤减少,并且在⼀定程度上提⾼时间,根据经验,千万级的数据可在45分钟内完成。但是请注意,该⽅法适合单进程的串⾏⽅式,如果当有多个进程同时运⾏时,后发起的进程会有enqueue的等待。
注意此⽅法千万不能dataguard上⽤(不过要是在database已经force logging那也是不怕的,呵呵)!!3.
insert into tab1 select /*+ parallel */ * from tab2;
commit;
对于select之后的语句是全表扫描的情况,我们可以加parallel的hint来提⾼其并发,这⾥需要注意的是最⼤并发度受到初始化参数parallel_max_servers的限制,并发的进程可以通过v$px_session查看,
oracle索引创建及使用
oracle索引创建及使用
摘要:
1.Oracle 索引的定义与作用
2.Oracle 索引的类型
3.Oracle 索引的创建方法
4.Oracle 索引的使用方法
5.Oracle 索引的维护与优化
正文:
【Oracle 索引的定义与作用】
Oracle 索引是 Oracle 数据库中一种重要的对象,它可以提高查询数据的速度,有效地减少查询时间。索引的作用类似于书籍的目录,可以让我们快速定位到需要的信息。在数据库中,索引可以让数据库系统快速找到所需的数据,从而提高查询效率。
【Oracle 索引的类型】
Oracle 索引分为以下几种类型:
1.B-Tree 索引:B-Tree 索引是最常用的索引类型,适用于大多数场景。它将数据分布在多个节点上,通过平衡树的结构来提高查询效率。
2.Bitmap 索引:Bitmap 索引适用于数据量较小且列值分布较为集中的场景。它将每个列的值用二进制位表示,从而减少存储空间和提高查询速度。
3.Function-Based 索引:基于函数的索引,可以通过对函数结果进行索引来提高查询效率。适用于对复杂计算结果的查询加速。 4.Global Temporary Index:全局临时索引,适用于需要在多个表空间之间进行查询的场景。
5.Partition Index:分区索引,适用于将大表按照一定规则划分为多个分区的场景,可以提高查询效率。
【Oracle 索引的创建方法】
创建 Oracle 索引可以使用 CREATE INDEX 语句,基本语法如下:
```
CREATE INDEX index_name
ON table_name (column_name)
INDEX_TYPE index_type
(column_name, column_name,...)
EXTENTS (number_of_extents)
oracle update nologging用法
第 1 页 共 2 页 oracle update nologging用法
在Oracle数据库中,Update语句是一种常用的数据更新操作。然而,有时候我们可能需要避免在执行Update操作时产生日志记录,以提高数据库的性能或满足特定的安全要求。这种情况下,我们可以使用Update nologging选项。本文将详细介绍Oracle Update nologging的用法和注意事项。
Update nologging是一种特殊的更新语句选项,用于在执行更新操作时抑制日志记录。通过使用Update nologging,我们可以减少数据库的日志负载,提高数据库的性能。此外,某些情况下,使用Update nologging可以满足特定的安全要求,例如在更新敏感数据时防止日志泄露。
要使用Update nologging,您需要在执行Update语句时添加nollogging选项。语法如下:
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2 WHERE 条件;
例如,假设我们有一个名为"employees"的表,其中包含员工的姓名和工资信息。我们想要更新工资信息,但不希望产生日志记录,可以使用以下语句:
UPDATE employees SET salary = 5000 WHERE id = 1 nologging;
请注意,使用Update nologging将导致对数据的修改不会被记录在数据库的日志中。这意味着如果您需要审计或跟踪数据库的更改,您可能无法获取这些更改的信息。
三、注意事项
在使用Update nologging时,请注意以下几点:
1. 性能影响:虽然使用Update nologging可以减少日志记录,但可能会对数据库的性能产生一定的影响。在更新大量数据时,日志记录的缺失可能会导致性能下降。
2. 安全性问题:使用Update nologging可能会降低数据库的安全性。由于日志记录的缺失,您可能无法追踪或审计对数据的更改,这可能对数据库的完整性造成威胁。 第 2 页 共 2 页 3. 仅适用于特定情况:Update nologging并非在所有情况下都是最佳选择。在某些情况下,记录数据库更改可能仍然是有用的,例如用于审计或故障排除。
