文档章节

create(rebuild) index online 也会在开始和结束时候锁表(TM4)

Rocky-Wang
 Rocky-Wang
发布于 2015/08/14 10:48
字数 928
阅读 22
收藏 0

当我们对索引进行rebuild,如果不加online选项,oracle则直接读取原索引的数据;

当我们添加online选项时,oracle是直接扫描表中的数据, 那如何维护索引段数据的一致性呢?也就是从开始创建到索引创建完成这段时间的表数据改变?

从索引开始rebuild online开始的那一刻起,oracle会先创建一个SYS_JOURNAL_xxx的系统临时日志表,结构类似于mlog$_,通过内部触发器,记录了开始rebuild索引时表上所发生的改变的记录,当索引已经创建好之后,新数据将直接写入索引,只需要把SYS_JOURNAL_xxx日志表中的改变维护到索引中即可.

但是, 必须清楚的是, 即使加了online参数,在ddl刚开始时,需要获取表上的TM4的锁, ddl要结束时,也会获取表上的TM4的锁, ddl执行过程中,只需要获取表上的TM2的锁。

所以,online创建索引或者重建索引:

1,如果ddl发起之前,有其它dml在操作这个表,则ddl会被阻塞,ddl继而会阻塞后续的其它dml

2,如果ddl发起获取TM4后(很快会变成TM2),其它dml会被短暂阻塞;

3ddl执行过程中,不阻塞其它DML

4ddl执行结束时,还会获得一次TM4的锁,这个阶段有与上述12一样的影响。

具体大家可以自己测试一下。

另外11g对比之前版本的数据库, online创建(重建)索引有了一点改进:

Before 11g, OIB will get in the DML queue to lock the table exclusively while preventing the new DML’s to go through, once all the active transactions (ones which were initiated before the OIB) are completed, OIB will create the journal IOT table and release the exclusive table lock (it’ll still keep the share lock on the table to prevent any other DDL’s) for DML’s to continue.

With 11g, significant changes were introduced to address all these problems.

Oracle will still wait for long running transactions to complete before starting the OIB process, but it will not block the upcoming DML’s. Oracle will not use exclusive table lock (mode 6) for OIB, which will eliminate any DML hang situations.

(简而言之就是上述1的绿色部分:该ddl不会再短暂阻塞其它dml):

Create或者Rebuild进程开始和结束的时候,oracle要在base table上获得Table lock,因为在索引开始创建的时候要保证DD信息,结束的时候要对索引改变做merge,把索引放到最终的结构中。

1,Create或者Rebuild操作开始和终止要求一个table lock,此时有事务正在操作base table。那么,Create或者Rebuild 索引就会处于Hang状态。当创建索引的session Hang之后,接下来的需要对base table操作的事务,都将处于Hang的状态,这个持续会在创建索引的session获得需要的Table lock后结束,那么在高并发的系统中,效果可想而知了.....

2,11g中,有一些变化,其实和之前的版本一致,Create或者Rebuild online在开始和结束的时候要获得Table lock,如果在这之前有相关的active事务,那么也会Hang

区别在于:当Create或者Rebuild online的进程被锁定,那么后续的活跃事务将不会被阻塞,其它的事务可以顺利的进行(因为dmlTM3的锁是兼容的)。所以,在11g中可能事务繁忙的时候Create or Rebuild online,风险降低了点。

具体参考下面这三篇文章:

http://www.ningoo.net/html/2008/lock_mechanism_of_rebuild_index_online.html

http://wangwei.cao.blog.163.com/blog/static/10236252620117316108251/

http://blog.csdn.net/coast_lichao/article/details/7607409


© 著作权归作者所有

Rocky-Wang
粉丝 5
博文 34
码字总数 43517
作品 0
深圳
数据库管理员
私信 提问
Oracle alter index rebuild 与 ORA-08104 说明

一. 官网说明 在MOS 上的一篇文章讲到了rebuild online 和offline的区别: Index Rebuild Is Hanging Or Taking Too Long [ID 272762.1] Symptoms: ========= Performance issues while reb......

MR_White
2014/09/29
109
0
MySQL5.7—在线DDL总结

---切记:DDL操作要在业务低峰期进行 1、MySQL各版本,对于DDL的处理方式是不同的,主要有三种: ①:Copy Table方式: 这是InnoDB最早支持的方式。顾名思义,通过临时表拷贝的方式实现的。新...

一个笨小孩
2017/08/16
0
0
mysql 5.6 online DDL

背景 dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waiting for meta data lock”状态的时候。因此mysql 5.6...

dengwang123
2016/11/24
0
0
MySQL Online DDL的改进与应用

1 早期DDL实现原理(5.6.7之前 ) Innodb早期支持通过copy table跟inplace的方式来执行DDL语句,其原理如下: copy table方式 inplace方式(fast index creation,仅针对索引的创建跟删除) ...

jjjyyy66
2017/05/15
0
0
MySQL--Online DDL

最近帮助客户订正SQL时注意到alter的操作可能会锁表(MDL),所以也补一下online ddl的知识,避免不当的操作影响业务的运行。 Online DDL原理: MySQL数据库操作中,DDL操作(比如CREATE,D...

newdba@dtstack
2018/01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Handler简解

Handler 这里简化一下代码 以便理解 Handler不一定要在主线程建 但如Handler handler = new Handler(); 会使用当前的Looper的, 由于要更新UI 所以最好在主线程 new Handler() { mLooper = Lo...

shzwork
25分钟前
3
0
h5获取摄像头拍照功能

完整代码展示: <!DOCTYPE html> <head> <title>HTML5 GetUserMedia Demo</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum......

诗书易经
27分钟前
3
0
正向代理和反向代理

文章来源 运维公会:正向代理和反向代理 1、正向代理 (1)服务对象不同 正向代理服务器的服务对象是客户端,可以将客户端和代理服务器看作一个整体。 (2)配置方法不同 需要在客户端配置代...

运维团
44分钟前
4
0
5个避免意外论文重复率高的方法

即使你不是故意抄袭,但你可能在无意中抄袭了别人的论文, 这个叫做意外抄袭,它可能正发生在你身上,如果你不熟悉学术 道德规范,这里将告诉你5个基本的方法来避免意外抄袭。 Tip1 熟悉其他...

论文辅导员
45分钟前
4
0
Maven通过profiles标签读取不同的配置

<profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> ......

时刻在奔跑
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部