oracle online系列(一):online move datafile

昨日与维照的技术交流中,说起oracle的诸多online操作,所以决定写一个oracle online操作的系列文章。

先从online move datafile说起,online move datafile是12.1的新特性,在12c之前如果想要move datafile通常需要下列步骤:

  • 1.offline datafile
  • 2.backup as copy数据文件到指定路径
  • 3.switch datafile to copy切换控制文件中数据文件路径
  • 4.由于offline datafile不会做检查点,所以在online之前需要recover datafile
  • 5.online datafile

12.1推出了online move datafile的新特性,那么oracle是如何通过一条命令就搞定了12c之前较为繁琐的步骤呢?下面将通过测试验证进行深入分析。

测试环境12.2,测试验证过程使用了gdb、10046、strace,gdb在kcffo_mv_prepare、kcffo_mv_copy_loop、kcffo_mv_remove_secondary等重要函数打上断点。10046跟踪online move datafile的会话,strace跟踪dbwr进程。

发起数据文件12的online move操作

通过分析发现其内部操作如下:

第一步:调用kcffo_movefile函数开始对数据文件进行online move,这个move期间session都会持有对应数据文件的MV锁

第二步:调用kcffo_mv_prepare函数对数据文件进行初始化。

从10046 trace也能看出来该步骤会做三个非常重要的操作:

  • 在指定路径产生一个和原数据文件大小相同的数据文件称作secondary file,但这个文件只写入了数据文件头,整个文件都是空的。
  • 将 secondary file 加入到控制文件DATA FILE RECORDS中,同样以datafile copy的形式存在
  • dbwr将打开secondary file的句柄,这是能实现online非常关键的一点

dump控制文件可以看到,secondary file被加入,并且 Online move state变成了1

查看dbwr持有的句柄发现dbwr持有了secondary file的句柄

第三步:调用kcffo_mv_copy_loop函数对数据文件其他block进行拷贝,从2号块开始以多块读的方式做数据文件的拷贝。为什么函数中有loop呢?个人认为原因是因为在此过程期间如果数据文件发生自动扩展或者resize,还会调用 kcffo_mv_copy_loop 继续拷贝。

在此过程中,发生了检查点,那么dbwr将实施“双写“,这一点就是online move datafile的根本所在。

第四步:切换控制文件中的数据文件,该过程中session将持有CF锁,此时在切换完成之前任何检查点都将无法完成。这保证了切换前数据文件的一致性。

第五步:调用kcffo_mv_remove_secondary函数清理secondary file,如果语句加了keep子句,将不会有这一步操作。该步骤是online move datafile的结束动作。主要操作有两步:

  • 清理控制文件中的 secondary file(如果没有加keep子句的话)
  • 清理原数据文件(如果没有加keep子句的话)
此条目发表在Oracle分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注