分类: Oracle
2013-07-23 15:37:38
online 移动datafile是12c中一个很好的特性之一,对我们做迁移来讲是太好不过了,比如存储更换,可以直接move,都不需要用rman去进行restore了.
那么多move datafile的实质到底如何呢 ?下面我们通过10046 event和strace命令来跟踪下move datafile的操作。
--Session 1
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
SQL> select sid from v$mystat where rownum < 2; SID ---------- 30 SQL> select spid from v$process where addr=(select paddr from v$session where sid=30); SPID ------------------------ 4192 SQL> show user USER is "SYS" SQL> oradebug setmypid Statement processed. SQL> oradebug event 10046 trace name context forever,level 12; Statement processed. SQL> alter database move datafile 6 to '/oracle/oradata/orcl/users01.dbf'; Database altered. SQL> oradebug event 10046 trace name context off Statement processed. SQL> oradebug close_trace Statement processed. SQL> oradebug tracefile_name /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4192.trc SQL> |
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 |
----Session 3 |
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 4 5 6 |
|
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 |
----10046 trace event |
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1针对controlfile的读写: |
|
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 4 5 6 7 8 |
|
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 |
从跟踪来看,move datafile的过程中会对controlfile进行顺序读和parallel write. 我们来看下对数据文件的读写情况: |
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 |
|
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 |
我们可以看到,trace文件的前部和尾部都是对该数据文件的header block进行读,然后写.中间部分内容是按照128 block单位进行读写. 可以发现,是会将整个datafile的block都读一遍。细心的朋友也行会发现,这里居然是db file single write,按理说应该是db file parallel write 才对,因为后面的p3=128. 如果是single write,那么p3应该是1才对. |
那么这里只有一种解释,将每个block都写一次,每次读完后都写128次.
每次db file single write之前也是对应的db file sequential read,大家注意后的p3也是128,并不是1. 12c的官方文档是这样解释这个event的:
<%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%971-12c%E5%88%9D%E4%BD%93%E9%AA%8C.html>
1 2 3 4 5 |
file# See "file#" block# See "block#" blocks This is the number of blocks that the session is trying to read (should be 1) |
所以这里给人似乎有点难以理解,难道是每次读1个block,读128次?
另外,关于move datafile操作,我相信肯定也是会触发检查点的.本文转自cuug官网