oracle中Direct IO+asm引起css initialization

某数据库升级到12c后(应用代码也升级了),出现了大量css initialization的等待:

SQL> select event,sql_id,count(*) from  v$session
where event='CSS initialization' group by event,sql_id;

EVENT                  SQL_ID          COUNT(*)
---------------------- ------------- ----------
CSS initialization     1qkdw0dtyjydf       5
CSS initialization     2g9g4as2nasad       1
CSS initialization     5r5mwAS0m4mxq       1
CSS initialization     712df0y5u236f     529
CSS initialization     aasd9k80jrvax     342
CSS initialization     a4uvs112123q6       1
CSS initialization     c5ax6wp98nam4       1
CSS initialization     fsadasd6asd12       4

怀疑是否是12c的新特性导致。

CSS initialization 说明:
在RAC(或使用ASM的单实例)数据库环境下,当前台进程需要执行direct IO操作时,需要向CSSD进程进行注册,此时该前台进程发生CSS initialization等待。
在11g还是12c上,CSS initialization的触发原理都没有改变,该event是一个direct IO的预期行为,任何前台进程在需要进行direct IO的情况下,都必须进行一次CSS注册,之后就可以被允许进行direct IO操作。

我们知道,对LOB对象操作的时候,第一次操作的时候,是会进行direct IO的,后续的操作,要看LOB对象是否有cache,如果有cache,那么就不会进行direct OI,也就不会进行CSS initialization。

如果没有cache,那么每一次dml操作都要进行CSS initialization。那么就会出现这个客户遇到的情况一样,大并发的情况下,大量进程处于CSS initialization的等待了,并且cssd.bin进程的CPU使用率也会变得非常高。

所以通过情况下,我们不建议对频繁操作的核心业务表加LOB字段的。如果确实需要LOB字段,需要使用cache特性。请注意,这里是LOB对象的cache,而不是table的cache属性。我犯过一个错误,一个细微的差别导致加cache到table上,而不是LOB对象上,所以无论怎么测试,都无法重新客户的场景。

我建立的表如下:

CREATE TABLE wrong_tab_securefile_cache (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE cache
tablespace users;

正确的表的建立方式如下:
CREATE TABLE tab_securefile_cache (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE (cache)
tablespace users;

仅仅是有没有括号的差别,即一个是cache,一个是(cache)。

但是如果你用dbms_metadata进行分析,就可以比较清楚的看清他们之间的差别了:

SQL> select dbms_metadata.get_ddl('TABLE','WRONG_TAB_SECUREFILE_CACHE','SYS') FROM DUAL;
 
DBMS_METADATA.GET_DDL('TABLE','WRONG_TAB_SECUREFILE_CACHE','SYS')
--------------------------------------------------------------------------------
 
  CREATE TABLE "SYS"."WRONG_TAB_SECUREFILE_CACHE"
   (    "ID" NUMBER,
        "CLOB_DATA" CLOB
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
 LOB ("CLOB_DATA") STORE AS SECUREFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
  NOCACHE LOGGING  NOCOMPRESS  KEEP_DUPLICATES
  STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
   CACHE
 
 
SQL >
SQL> select dbms_metadata.get_ddl('TABLE','TAB_SECUREFILE_CACHE','SYS') FROM DUAL;
 
DBMS_METADATA.GET_DDL('TABLE','TAB_SECUREFILE_CACHE','SYS')
--------------------------------------------------------------------------------
 
  CREATE TABLE "SYS"."TAB_SECUREFILE_CACHE"
   (    "ID" NUMBER,
        "CLOB_DATA" CLOB
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
 LOB ("CLOB_DATA") STORE AS SECUREFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
  CACHE  NOCOMPRESS  KEEP_DUPLICATES
  STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
 
 
SQL>

第21行和41行可以看到差别,第一个的cache属性是加在表上的,第二个表的cache属性是加在LOB上的。

所以,如果我们把LOB对象加到cache中,就不会那么剧烈的遭受css initialization。

最后,客户是通过LOB字段改成varchar2字段解决了。

时间: 2024-09-19 20:33:06

oracle中Direct IO+asm引起css initialization的相关文章

Direct IO+asm引起css initialization

作者简介: 何剑敏 Oracle ACS华南区售后团队,首席技术工程师 现供职于Oracle ACS华南区售后团队,首席技术工程师.多年从事第一线的数据库运维工作,有丰富项目经验.维护经验和调优经验,专注于数据库的整体运维. 某数据库升级到12c后(应用代码也升级了),出现了大量css initialization的等待: 怀疑是否是12c的新特性导致. CSS initialization 说明: 在RAC(或使用ASM的单实例)数据库环境下,当前台进程需要执行direct IO操作时,需要向

Oracle中如何远程访问ASM

一.动态监听 1.监听文件 [oracle@node1 admin]$ more /u01/oracle/network/admin/listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/oracle) (PROGRAM = extproc) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADD

Oracle中如何找回ASM中的数据文件

很多时候由于asm不能正常启动,导致数据丢失.下面提供两种方法找回asm中的数据文件 一.使用AMDU工具 AMDU是Oracle 11g里自带的一个免费的工具,用于分析ASM磁盘组的元数据以及从不能mount的磁盘组中往外抽取数据文件"NOTE:553639.1 Placeholder for AMDU binaries and using with ASM 10g"明确指出:AMDU也可用于10g,并提供了可用于10g的AMDU的各个操作系统的版本供大家下载. 1.设置LD_LIB

oracle中的asm文化

从oracle中ASM的发展来看,到今天的普及使用,应该可以算做一种文化,因为这体现的不仅是ASM技术在实际工作中的成功普及,而且从某种程度来说,都代表了一个新生事物的发展历程,无论是java的发展还是各种开源项目的普及,都有着相似的痕迹. asm从Oracle 10g版本推出,是作为grid的一部分鼓励使用的.而在这段漫长的时间里面,其实asm就在逐渐完善. 就如同你去公司内部推广一套很新技术的时候,人家肯定得衡量你的东西是不是足够好,如果性能指标能够达到指数级的提升,或者操作能够简化到极致,

ORACLE数据库异步IO介绍

异步IO概念     Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它.AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成.稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果.     Linux IO模型(I/O models)分同步IO模型(synchronous models)和异步IO模型(asynchr

Oracle中的并行

Oracle中的并行 一Oracle中的并行 首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元.例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户.并行处理的机制实际上就是把一个要扫描的数据集分成

Oracle中如何把表和索引放在不同的表空间里

Oracle中并没有区分表空间里放的是表还是索引,所有当数据量比较小时,完全可以把表和索引放在同一个表空间里,但随着数据量的增大,最好还是把表和索引分开存储在不同的表空间里   因为:1)提高性能:尽量把表和索引的表空间存储在不同在磁盘上,把两类不同IO性质的数据分开放,这样可以提高磁盘的IO总体性能: 2)便于管理:试想一下,如果索引的数据文件损坏,只要创建索引即可,不会引起数据丢失的问题. 下面语句用于移动索引的表空间: 复制代码 代码如下: alter index INDEX_OWNER.

Oracle RAC(4 TB ASM) 数据库恢复详细记录

6月底我们接到某客户的紧急支持请求,其客户数据库在不久前由于机房停电,导致数据库重启后无法启动. 我们通过teamviewer远程初步分析了alert log以及kfed读取了几个disk 发现,数据库无法启动的根本原因在于ASM diskgroup无法mount.而ASM diskgroup 无法mount的根本原因在于,ASM元数据出现损坏,其中表现为ASM 启动时无法进行事务恢复. 这里我们先不去纠结为什么会坏.对于asm的元数据如果出现损坏,那么修复的难度可想而知. 这里我采取了非常简单

oracle中游标(Cursor)的详解

概述 也许大家对数据库中游标都不陌生,但对于其概念可能有时又会有些模糊,游标到底是什么? 为了使大家对游标有个清晰的认识,本文将介绍Oracle中游标(curosr)相关的知识. 游标的概念 一般来讲,游标包含着两种不同的概念: 程序中的游标(Program Cursor)和Oracle中的游标(Oracle Curosr). 程序中的游标(Program Cursor): 在最终用户程序(Client Application)中,游标(curosr)通常指和SQL语句关联的一个数据结构,用于关