程序媛记一次在线创建索引被kill案例及应对措施

关注我们获得更多内容

作者|李晴晴,云和恩墨西区技术顾问,有多年数据库服务经验,主要服务于电网、政府、银行等行业客户,擅长SQL审核、性能优化、数据库升级。索引是Oracle数据库中十分重要且普遍存在的对象之一,本文分享某客户现场一次创建索引中断引起异常的问题分析及解决过程。案例过程在日常的数据库优化工作中,发现某sql执行效率较低,并且运行频率较高。

然后在创建索引语句后加上了online关键词,继续在PLSQLDeveloper客户端执行,但一直没有返回结果,故联系我看下原因。一般,在出现ora-00054报错时,主要原因就可能是该表存在尚未commit或rollback的DML命令,而在线创建索引没有返回的原因也应该是被别的会话进程阻塞了,有这个思路就去验证,查看当前系统的锁便发现:

而waiter的确实是创建索引的进程:确实存在进程对该表进行insert操作,而这个进程一直未提交,咨询相关人员表示这个进程存在缓存数据,由于业务关系不能将这个进程commit或者kill。于是运维人员就把创建索引这个进程kill掉了。原以为杀了创建索引的进程就能“好”了,却发现事实远远不是这样。

为了验证索引的有效性,我们使用索引列进行搜索,并用hint强制,结果都是走全表扫描(实验见下图)。也就是说,这个索引是有问题的。

既然索引不能被使用,那就要对这个索引进行清理。直接drop是不可行的,并且该数据库版本为11.2.0.4,dropindex并不支持online操作,故当时尝试了下是否可以在线重建索引:可以看到,报了ora-08104错误。

程序媛记一次在线创建索引被kill案例及应对措施

总结这起事件主要是因为服务器进程在执行createindexonline时意外终止,导致生成的索引并不可用,而由于数据表上的insert进程一直未提交,导致索引进程的等待。

程序媛记一次在线创建索引被kill案例及应对措施

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180921A11QKQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券