长事务导致Exadata存储索引特性失效

个人简介:石云华,Exadata中国用户组联合创始人,2019年被ORACLE官方授予ACE称号。毕业后一直从事Oracle数据库第三方运维服务工作,拥有十余年电信运营商、保险、税务、电力行业核心系统数据库运维经验。现就职于北京海天起点技术服务股份有限公司,oracle数据库专家组成员,Exadata部门负责人。个人著作有《Exadata实施运维指南》,另外一本《Oracle Exadata性能优化》即将面世。
Exadata存储索引工作的条件是存储索引的regionLastChangeScn必须小于数据库的min active scn。如果数据库中存在长事务,则会导致数据库的min active scn长时间不会发生变化,渐渐偏离数据库当前的scn,存储索引使用逐渐减少,间接地阻止了存储索引的正常工作。

这里其实同样存在一个问题,那就是到底多长的事务算是长事务,ORACLE官方也没有给出明确的答复,只是认为运行时间超过几天的事务都需要关注。因此,最好的方法是定期监视gv$transaction视图,并确保不存在孤立或者废弃的事务。

下面提供一个真实案例来论述长事务对存储索引特性的影响。


案例概要:

在一台X2-2的Exadata环境中测试存储索引特性时,无意中发现该Exadata环境的存储索引特性不工作,而相同的测试代码在其他Exadata环境中却能正常工作,具体测试代码如下所示。

从测试代码可以看出,该SQL语句进行了智能扫描操作,但存储索引特性未工作。

案例分析及处理:

在会话层面和实例层面查看可能会影响存储索引特性的隐含参数设置情况,具体命令如下。

可见相关的隐含参数都是默认值,不存在隐含参数影响了存储索引特性的情况。

下面进行跟踪存储索引,具体代码如下所示。

在数据库层面设置_kcfis_storageidx_diag_mode隐含参数,开启存储索引的跟踪模式,此时会在存储节点生成存储索引跟踪日志文件,具体生成的跟踪日志文件如下所示。

从存储索引跟踪日志文件的内容可以看出,对SQLID为asu49m6xzuz2u的SQL语句进行了存储索引跟踪,id为{10176103 98 195867650},也即表对象的data_object_id为10176103,regionLastChangeScn为0x0e19.06cb00c7,minActSCN为0x0e17.1fe7fe6b,由于regionLastChangeScn比minActSCN大非常多,所以存储索引特性未工作。

通过以下语句可知,上述存储索引跟踪日志正是刚刚执行的SQL语句。

既然我们已经知道是由于minActSCN与regionLastChangeScn相差太多导致存储索引特性未工作,那么我们需要知道是哪个事务长时间未提交导致minActSCN未变化。首先我们查询各个实例中仍然存活的事务的最早时间,具体命令如下。

可以看出,两个实例中都存在一周以前的事务仍未提交,这种情况是极其不正常的。

继续查询目前仍然存活的事务的SCN号,及其对应的undo段号和undo事务槽号,具体命令如下所示。

从前面的存储索引跟踪日志中我们知道minActSCN为0x0e17.1fe7fe6b,其转换成十进制为15492482334315,也即undo段号为59,同时undo事务槽号为12所对应的事务。

下面,我们继续查询undo段号为59,同时undo事务槽号为12所对应的事务的详细信息,具体命令如下。

从获取的信息可以看出,调用的程序为plsqldev.exe工具,这很明显应该是开发人员调用产生的事务,联系到具体使用该plsqldev.exe工具的开发人员,询问得知他根本没有执行任何DML操作,而仅仅是通过DBLINK访问了远程数据库上的表,而我们知道DBLINK访问其实就会隐式地产生一个事务,至此,我们终于知道为什么数据库的minActSCN长时间不变化了。

案例解决方案:

通过这个案例,需要对开发人员提出新的要求,在通过DBLINK访问了远程数据库上的表时,即使是查询操作,也要及时进行事务提交操作。

 

在这个案例中,我们获取数据库的minActSCN时,使用了跟踪存储索引的方式,其实在MOS上有一篇文章《EXADATA and SuperCluster Check if long running transactions are preventing min active scn from progressing, resulting in Storage Indexes not being used(Doc ID 2081483.1)提供了另外一种方式来获取数据库的minActSCN,即在数据库层面设置55703事件,它会将数据库的minActSCN记录在数据库的alert日志中。

未经允许不得转载:Oracle一体机用户组 » 长事务导致Exadata存储索引特性失效

相关推荐