一篇ORA-4031处理服务文档

背景: **保险核心业务系统数据库使用Oracle 10.2.0.5 版本 RAC(Real Application Cluster)集群,集群构建在IBM Aix系统上,包含两个节点:【node1,node2】。 在较长一段时间内,node2会每间隔20天左右,出现ORA-04031错误,导致该节点数据库系统不再可用,需重启该节点上Oracle 实例方能解决问题。 ORA-04031错误解释: 04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"// *Cause: More shared memory is needed than was allocated in the shared// pool or Streams pool.// *Action: If the shared pool is out of memory, either use the// DBMS_SHARED_POOL package to pin large

Oracle数据库细粒度审计(Fine-Grained-Audit)应用

Oracle数据库细粒度审计(Fine-Grained-Audit)应用 设计目标: 在实际的业务场景中,经常有审计“某人、某时间段、查看了某条敏感数据”这样的需求,Oracle本身提供了DB Vault、Audit Vault组件。 本文讨论使用细粒度审计,实现医院“防统方”功能: 背景: 医生开药后会从对应厂商医药代表处收取回扣,而收取回扣,需要统计处方中的药品、数量、医生信息。现阶段“纪委”部门严禁“统方”——对处方用药进行统计——操作。 期望实现对“可疑操作”的审计记录功能,后续对“可疑”记录进行进一步分析,进而准确确认是否为“统方”操作。 所以,技术实现上分两个阶段: 可疑操作记录 可疑操作分析架构设计应具备可扩展性: 规则可定义 能够适用其他“敏感数据”审计需求 阶段一: 可疑操作记录 概述: 通过Oracle FGA,记录可疑操作。 FGA技术背景: DBMS_FGA.ADD_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2, audit_condition VARCHAR2, audit_column VARCHAR2, handler_schema VARCHAR2, handler_module VARCHAR2, enable BOOLEAN, statement_types VARCHAR2, audit_trail BINARY_INTEGER IN DEFAULT, audit_column_opts BINARY_INTEGER IN DEFAULT); Oracle FGA核心的操作就是这个存储过程的调用: 我们需要指定object_schema, object_name来限定是对哪个表(对象)来做审计;使用audit_condition(SQL 逻辑表达式,但是有一定限制,如不能使用子查询,不能使用rownum伪列等)来限制“行”级别的敏感数据——只有符合此条件的,才触发审计操作。使用audit_column来指定“敏感”列,只有涉及敏感列的操作才被审计,结合audit_column_opts,灵活定义敏感列(其实就是Any还是All的关系)audit_trail来指定审计结果存放的“位置”,也决定审计记录的数据内容(特别是是否记录SQL,以及绑定变量),这里最需要特别指出的是,这里的设置不依赖于数据库级别的audit_trail 初始化参数。handler_schema 和 handler_module指定“敏感”操作发生时,调用的存储过程,用来自定义一些处理操作。

SQL Script: DB Usage History

Declare         v_BaselineSize        number(20);        v_CurrentSize        number(20);        v_TotalGrowth        number(20);        v_Space                number(20);        cursor usageHist is                 select a.snap_id,                        SNAP_TIME,                        sum(TOTAL_SPACE_ALLOCATED_DELTA) over ( order by a.SNAP_ID) ProgSum                 from                         (select SNAP_ID,                                sum(SPACE_ALLOCATED_DELTA) TOTAL_SPACE_ALLOCATED_DELTA                         from DBA_HIST_SEG_STAT                         group by SNAP_ID                         having sum(SPACE_ALLOCATED_TOTAL) <> 0                         order by 1 ) a,                        (select distinct SNAP_ID,                                to_char(END_INTERVAL_TIME,'DD-Mon-YYYY HH24:Mi') SNAP_TIME                         from DBA_HIST_SNAPSHOT) b                 where a.snap_id=b.snap_id;Begin         select sum(SPACE_ALLOCATED_DELTA) into v_TotalGrowth from DBA_HIST_SEG_STAT;        select sum(bytes) into v_CurrentSize from dba_segments;        v_BaselineSize := v_CurrentSize - v_TotalGrowth ;         dbms_output.put_line('SNAP_TIME           Database Size(MB)');         for row in usageHist loop                 v_Space := (v_BaselineSize + row.ProgSum)/(1024*1024);                dbms_output.put_line(row.SNAP_TIME || '           ' || to_char(v_Space) );        end loop;end;

Archivelog Calendar

查询Oracle归档日志产生频率,以日历形式展现:. SELECT * FROM (SELECT A.*, B.SIZE_GB, DECODE(C.SIZE_GB, NULL, 0, C.SIZE_GB) DELETED_GB, B.SIZE_GB - DECODE(C.SIZE_GB, NULL, 0, C.SIZE_GB) REMAIN_GB FROM (SELECT * FROM (SELECT TO_DATE(b.date_time, 'DD/MM/YYYY') dt, TO_CHAR(TO_DATE(b.date_time, 'DD/MM/YYYY'), 'DAY') DAY, "00", "01",  "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",

insert select执行报ora-600 [32695]

问题描述 应用人员报障说每月都在执行的一个sql今天突然怎么也执行不下去,并报如下错误: ORA-00600: internal error code, arguments: [32695], [hash aggregation can't be done], [], [], [], [], [], [] 操作系统为SUNOS 5.10,Oracle版本为:10.2.0.4.0,单机环境 执行的SQL语句为: INSERT INTO MID_DM_RPT_COMP_SUB_PROD_M SELECT COMP_AREA_ID, COMP_CITY_ID.....省略.... 经查询mos并找到如下文档ORA-600 [32695] [hash aggregation can't be done] (文档 ID 729447.1) 该文档给出的解决办法如下: 禁用hash group by SQL> alter system set "_gby_hash_aggregation_enabled"=false scope=spfile; SQL> alter session set "_gby_hash_aggregation_enabled"=false; 通过在SQL语句中添加hint NO_USE_HASH_AGGREGATION绕过bug

insert select语句报ORA-32690:Hast Table Infrastructure ran out of memory

系统环境 OS:SUNOS 5.10 DB:Oracle 10.2.0.4.0 问题现象 用户在pl/sql developer上执行insert select 语句报报ORA-32690,如图: 问题分析 根据文档(Query crash with ORA-32690 -- Bug 6471770. (文档 ID 960690.1))得知,该问题是由于Bug 6471770所致。 Bug 6471770影响的版本:10.2.0.3.0及之后的版本,并在11.2中被修复。 MOS上给出的解决办法: Cause This seems to be Bug 6471770. - Known bug on database version 10.2.0.3. - The workaround is resolving the issue. The bug is fixed in 11.2 release. Solution: So

PostgreSQL 的多版本并发控制(MVCC:Multi-version Concurrency Control)

从用户使用角度来看,PostgreSQL的事务并发特性,应具备如下性质:      每一个事务在开始时,记录(snapshot)当时数据库的Version,事务一旦开始运行后,其他事务做了什么操作应该不影响本事务; 读永不堵塞写,写永不堵塞读——这句话老是在Oracle的文档中看到; 写操作与写操作之间,只有当修改了相同数据行时,才会出现互相堵塞——行级锁。 下面举一个最典型的并行Update相同数据行的例子: Transaction A 执行操作: UPDATE foo SET x = x+1 WHERE rowed = 42 在Transaction A提交或回滚之前,Transaction B执行操作: UPDATE foo SET x = x+1 WHERE rowed = 42 很显然: B需要等待A提交或者回滚 如果A回滚事务,那么B继续执行,x的值也毫无争议 但是如果A事务提交,那B事务会发生什么? x的值仍然使用原来的值,会出现update语句执行两次,但是x的值只增加了1,这显然不是我们预期的结果     但是如果B事务使用A事务提交后的x的新值,那么B事务就使用了其开始之后才提交的数据。这和Transaction Isolation原则冲突…… 回答上面的问题,我们来了解PostgreSQL的transaction isolation level实现: PostgreSQL提供两种isolation level(这和Oracle一致):   Read committed level: 针对前述问题,B事务将使用A事务提交后的新数据(A事务提交后的数据行,必须仍然满足B事务的where条件限制)   Serializable level:

AngularJS and scope.$apply

JavaScrip世界中(clien端t)这几个知名的所谓MVC框架,对照他们的tutorial,做个练习,都挺简单有趣,可一旦真实的应用这些框架去实际实现一些场景,立刻就发现没那么简单了。 AngularJS也一样,只要我们编写一些“非尝试”性质的代码,就无法避免使用到$scope.$apply()方法。表面看来,这只是一个让我们的页面上有数据绑定属性的空间得到更新,但是为什么有这个方法存在、我们何时需要这个方法,这是个问题,先看AngularJS的文档,我没有搞得很清楚,看了http://jimhoskins.com/2012/12/17/angularjs-and-apply.html 这篇文档后,我才真正的搞明白怎么回事(当然,搞明白后,再去看AngularJS文档,发现文档其实也说了…… 只是不那么利于理解)。 想知道何时(when)用到$apply, 最好的途径就是先搞清楚我们为什么(why)要用到$apply。 JavaScript is Turn Based 我们书写的JavaScript代码,不是作为一个整体,一下子就运行完成的,JavaScript代码是安顺序(turn)运行。每一个顺序中运行的代码是不可中断,当一个代码片段正在属于自己的顺序(turn)中运行时,我们的浏览器中将不会有任何变化,其他的JavaScript代码段没有机会运行,浏览器中的界面也完全冻结。这也正是为什么效率低下的JavaScript代码会“冰冻”整个web page。 正因为此,当我们执行的任务预期会消耗很多时间才能执行完——如Ajax请求,等待click事件,timeout延时调用,我们都会设置一个回调(callback)函数,然后立即结束当前的turn。稍后,当Ajax请求完成,click事件被探测到,timeout延时时间到,一个新的JavaScript turn会被创建,我们之前设置的回调函数在其中运行。 让我们来看一个例子,一个js文件,内容如下: var button = document.getElementById('clickMe'); function buttonClicked() { alert('the button was clicked'); } button.addEventListener('click', buttonClicked); function timerComplete() { alert('timer complete'); } setTimeout(timerComplete, 2000); 当这个js文件被装载,会被分配一个turn,获取一个button,添加 click 事件监听,设置一个延时器。然后,这个turn就结束,浏览器可以完成其他的相关页面更新操作,等待获取用户输入。 如果浏览器探测到在#clickMe按钮上有点击操作,它会创建一个新的turn,在其中执行buttonClicked函数。这个函数返回,turn也就终结。 过了2000毫秒后,浏览器创建一个新的turn来调用timerComplete。 我们的JavaScript程序是在一个个turn中运行的,在turn之间隙,页面完成重绘、用户输入被接收。 我们如何更新使用数据绑定的页面空间? AngularJS让我们将一些页面组建绑定到JavaScript代码中的数据上,但是组件是如何知道数据发生了变化,需要对页面进行重绘的呢? 要解决这个问题(数据绑定)有多种解决方案。代码需要知道数据的值被修改,我们有两种可行的策略将数据修改通知到绑定的组件。 第一个策略,所有数据修改通过method来操作,避免属性直接赋值。这样数据被改变就可以被代码捕捉,相应的页面绑定就可以被更新。这一策略的缺点是,我们必须使用特定的对象,其中所有的赋值操作,得通过诸如obj.set('key','value)的方式来操作,而不是更直观的obj.key = 'value'方式。EmberJS和KnockoutJS框架都使用这一策略。 AngularJS使用的是第二种策略:允许任何对象值作为页面对象的绑定对象。然后,在任何一个JavaScript的turn(前文说了半天的turn)结束时,检查这些对象的数值是否被修改。这个策略的描述,给人的第一感觉是觉得会比较低效,但是这里头有一些非常聪明的做法解决其对性能的影响。这一策略的优点就是,我们可以使用普通的对象(object),用任意我们喜欢的方式给对象赋值,对象的任意变化都会自动在数据绑定中体现。 为了让这一策略工作,我们需要知道何时对象的值可能被修改了,这也就是$scope.$apply介入运行的点。 $apply 和 $digest 检查绑定的值是否已经修改,正宗对应的方法是$scope.$digest()。那里是“神奇”发生的地方,但其实我们基本上从不会直接调用$digest方法,我们一般会调用$scope.$apply(),间接调用到$scope.$digest()。

Ringo和Spring集成

Ringo with Spring 可以设想,集成了Spring之后,RingoJS就不收任何限制了,JavaScript语言的灵活性,加上Java & Spring 的完善功能,感觉上就应该可以做出很帅的东西…… >> 因为觉得在集成使用Ringo和Spring方面有很多值得一说,Jim Cook就Share了部分他们使用的代码,这部分代码可以让我们更加容易的在Ringo中引用ApplicationContext。下文的例子即基于Jim Cook分享的代码。 Ringo 使用org.ringojs.jsgi.JsgiServlet来bootstrapSSJS环境,我们可以扩展这个类,以提供一些Spring helper函数,帮助我们在Ringo中访问Spring。 package org.ringojs.jsgi;   import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils;   import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException;   publicclass ExtJsgiServlet extends JsgiServlet {   private ApplicationContext _springContext;   @Override public void init(ServletConfig config)throws ServletException { super.init(config); final ServletContext context = config.getServletContext(); _springContext = WebApplicationContextUtils