sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 产品DBA > Oracle ASM >

【学习笔记】Oracle ASM normal diskgroup情况下的IO读取

时间:2016-12-21 21:28   来源:Oracle研究中心   作者:网络   点击:

天萃荷净 Oracle研究中心学习笔记:提到oracle 12c之前,asm 的读取默认都是始终从primary extent开始的,然而从12c开始发生变化。
当时的图片我找不到了,在以前的文档中,我找到如下一个图,基本上类似:




---diskgroup

[oracle@10gasm ~]$ export ORACLE_SID=+ASM
[oracle@10gasm ~]$ asmcmd

ASMCMD> lsdg
State    Type    Rebal  Unbal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Name
MOUNTED  EXTERN  N      N         512   4096  1048576      2048      687                0             687              0  DATA1/
MOUNTED  NORMAL  N      N         512   4096  1048576      2048     1922                0             961              0  DATA2/

---test table

SQL> select count(1) from test_asm_read;

COUNT(1)
----------
10000

SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) blk#
2  from test_asm_read where object_id=100;

FILE#       BLK#
---------- ----------
6         13

SQL> select object_name,object_id from test_asm_read where object_id=100;

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
killdb.com                         100

SQL> select name from v$datafile where file#=6;

NAME
--------------------------------------------------------------------------------
+DATA2/test/datafile/test.256.804807701
SQL> l
1  select owner,segment_name,FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS
2* from dba_extents where SEGMENT_NAME='TEST_ASM_READ'
SQL> /

OWNER                          SEGMENT_NAME                 FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS
------------------------------ ------------------------- ---------- ---------- ---------- ----------
ROGER                          TEST_ASM_READ                      6          0          9          8
ROGER                          TEST_ASM_READ                      6          1         17          8
ROGER                          TEST_ASM_READ                      6          2         25          8
ROGER                          TEST_ASM_READ                      6          3         33          8
ROGER                          TEST_ASM_READ                      6          4         41          8
ROGER                          TEST_ASM_READ                      6          5         49          8
ROGER                          TEST_ASM_READ                      6          6         57          8
ROGER                          TEST_ASM_READ                      6          7         65          8
ROGER                          TEST_ASM_READ                      6          8         73          8
ROGER                          TEST_ASM_READ                      6          9         81          8
ROGER                          TEST_ASM_READ                      6         10         89          8
ROGER                          TEST_ASM_READ                      6         11         97          8
ROGER                          TEST_ASM_READ                      6         12        105          8
ROGER                          TEST_ASM_READ                      6         13        113          8
ROGER                          TEST_ASM_READ                      6         14        121          8
ROGER                          TEST_ASM_READ                      6         15        129          8
ROGER                          TEST_ASM_READ                      6         16        137        128

17 rows selected.

从上面信息可以看出,测试表有17个extent,前面0~15,是1m大小,后面第16号extent是1m大小。 由于asm默认的au size也是1m,那么,所以我们可以肯定的讲,我们所要查询的这条数据和前面这16个extent,都在一个au里面。

oracle里面,最小的分配单元是extent,而asm中最小的分配单元是AU.

SQL> select HEADER_FILE,HEADER_BLOCK,blocks from dba_segments
  2  where segment_name='TEST_ASM_READ';

HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          6           11        256

SQL> l
  1* select file#,name from v$datafile order by 1
SQL> /

     FILE# NAME
---------- ------------------------------------------------------------
         1 +DATA1/test/datafile/system.256.802678453
         2 +DATA1/test/datafile/undotbs1.258.802678457
         3 +DATA1/test/datafile/sysaux.257.802678455
         4 +DATA1/test/datafile/users.259.802678457
         5 +DATA1/test/datafile/roger.266.804210969
         6 +DATA2/test/datafile/test.256.804807701
         7 +DATA1/test/datafile/roger.267.806226805

SQL>  select disk_kffxp, au_kffxp, xnum_kffxp
  2   from x$kffxp
  3   where GROUP_KFFXP=2 and
  4   NUMBER_KFFXP=256;

DISK_KFFXP   AU_KFFXP XNUM_KFFXP
---------- ---------- ----------
         1         52          0
         0         52          0
         0         53          1
         1         53          1
         1         54          2
         0         54          2
         0         55          3
         1         55          3
         1         56          4
         0         56          4
         0         57          5

DISK_KFFXP   AU_KFFXP XNUM_KFFXP
---------- ---------- ----------
         1         57          5
         1         58          6
         0         58          6
         0         59          7
         1         59          7
         1         60          8
         0         60          8
         0         61          9
         1         61          9
         1         62         10
         0         62         10

22 rows selected.

SQL> l
  1* select name,path,DISK_NUMBER from v$asm_disk where group_number=2 order by 3
SQL> /

NAME                           PATH                           DISK_NUMBER
------------------------------ ------------------------------ -----------
DATA2_0000                     /dev/sdb                                 0
DATA2_0001                     /dev/sde                                 1


从上面可以看到,我们的datafile 6大小是10m,而我创建的测试表占据2m(未建其他表),所以,我们的test_asm_read表应该就在最前面的2个au当中。从上面的查询结果我们也可以看到,au分别存了2份,一份是primary extent,一份是mirror extent, 我们来验证下:

SQL> show user
USER is "ROGER"
SQL> select sid from v$mystat where rownum=1;

       SID
----------
       153

SQL>  alter system flush BUFFER_CACHE;

System altered.

SQL> show user
USER is "ROGER"
SQL> select sid from v$mystat where rownum=1;

       SID
----------
       153

SQL>  alter system flush BUFFER_CACHE;

System altered.

SQL> select s.sid,s.serial#,p.spid from v$process p,v$session s where p.addr=s.paddr and s.sid=153;

       SID    SERIAL# SPID
---------- ---------- ------------
       153        148 5390

SQL> select * from test_asm_read where object_id=100;

OWNER                          OBJECT_NAME                    SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID
------------------------------ ------------------------------ ------------------------------ ---------- --------------
OBJECT_TYPE         CREATED   LAST_DDL_ TIMESTAMP           STATUS  T G S
------------------- --------- --------- ------------------- ------- - - -
SYS                            killdb.com                                                        100            100
INDEX               30-JUN-05 30-JUN-05 2005-06-30:19:10:18 VALID   N N N

SQL>

----strace spid 5390
[oracle@10gasm ~]$  strace -fr -o /tmp/5390.log    -p  5390
Process 5390 attached - interrupt to quit
Process 5390 detached
[oracle@10gasm ~]$ cd /proc/5390/fd/
[oracle@10gasm fd]$ ls -ltr
total 0
lrwx------ 1 oracle oinstall 64 Mar 13 06:25 0 -> /dev/pts/2
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 9 -> /home/oracle/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 8 -> pipe:[118609]
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 7 -> /dev/zero
l-wx------ 1 oracle oinstall 64 Mar 13 07:10 6 -> /home/oracle/admin/test/bdump/alert_test.log
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 13 07:10 3 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 2 -> /dev/pts/2
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 14 -> /dev/sdb
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 13 -> /dev/sde
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 12 -> /dev/sdd
l-wx------ 1 oracle oinstall 64 Mar 13 07:10 11 -> pipe:[118610]
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 10 -> /dev/sdc
lrwx------ 1 oracle oinstall 64 Mar 13 07:10 1 -> /dev/pts/2
[oracle@10gasm fd]$ cat /tmp/5390.log |grep pread64
5390       0.000056 pread64(10, "\6\242\0\0\375\274@\0\25\237\v\0\0\0\1\0063\340\0\0\2\0\24\0\3\0\0\0\24\237\v\0"..., 8192, 347054080) = 8192
5390       0.000047 pread64(12, "\6\242\0\0S\335@\0Z\311\v\0\0\0\1\6J\305\0\0\1\0-\0\2\0\0\0\233\234\v\0"..., 8192, 293232640) = 8192
5390       0.000046 pread64(10, "\6\242\0\0\320\317@\0\f\237\v\0\0\0\1\6\v7\0\0\2\0\0\0g\0\0\0\10\237\v\0"..., 8192, 315228160) = 8192
5390       0.000076 pread64(10, "\6\242\0\0\305\314@\0#\236\v\0\0\0\1\6\333V\0\0\2\0\36\0003\0\0\0\34\236\v\0"..., 8192, 321429504) = 8192
5390       0.000027 pread64(13, "#\242\0\0\v\0\200\1\231|\n\0\0\0\1\4\215c\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192, 54616064) = 8192
5390       0.000027 pread64(13, "\6\242\0\0\f\0\200\1&\220\n\0\0\0\1\0046\206\0\0\1\0\0\0\212\311\0\0&\220\n\0"..., 40960, 54624256) = 40960
5390       0.000026 pread64(13, "\6\242\0\0\21\0\200\1m|\n\0\0\0\2\0046\364\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54665216) = 65536
5390       0.000025 pread64(13, "\6\242\0\0\32\0\200\1m|\n\0\0\0\2\4\2\250\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 54738944) = 57344
5390       0.000024 pread64(13, "\6\242\0\0!\0\200\1s|\n\0\0\0\2\4\337d\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54796288) = 65536
5390       0.000024 pread64(13, "\6\242\0\0*\0\200\1y|\n\0\0\0\2\4h\30\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 54870016) = 57344
5390       0.000024 pread64(13, "\6\242\0\0001\0\200\1y|\n\0\0\0\2\4\n\233\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54927360) = 65536
5390       0.000023 pread64(13, "\6\242\0\0:\0\200\1y|\n\0\0\0\2\4\335\t\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55001088) = 57344
5390       0.000022 pread64(13, "\6\242\0\0A\0\200\1\177|\n\0\0\0\2\4\243\261\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55058432) = 65536
5390       0.000024 pread64(13, "\6\242\0\0J\0\200\1\205|\n\0\0\0\2\4\177\221\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55132160) = 57344
5390       0.000024 pread64(13, "\6\242\0\0Q\0\200\1\205|\n\0\0\0\2\4\377[\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55189504) = 65536
5390       0.000060 pread64(13, "\6\242\0\0Z\0\200\1\205|\n\0\0\0\2\4\357\30\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55263232) = 57344
5390       0.000025 pread64(13, "\6\242\0\0a\0\200\1\213|\n\0\0\0\2\4D\n\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55320576) = 65536
5390       0.000024 pread64(13, "\6\242\0\0j\0\200\1\221|\n\0\0\0\2\4\212\351\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55394304) = 57344
5390       0.000036 pread64(13, "\6\242\0\0q\0\200\1\221|\n\0\0\0\2\4_\0\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55451648) = 65536
5390       0.000024 pread64(14, "\6\242\0\0\200\0\200\1\227|\n\0\0\0\2\4w\206\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 8192, 55574528) = 8192
5390       0.000022 pread64(13, "\6\242\0\0z\0\200\1\221|\n\0\0\0\2\4;=\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 49152, 55525376) = 49152
5390       0.000024 pread64(14, "\6\242\0\0\201\0\200\1\227|\n\0\0\0\2\4f\213\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55582720) = 65536
5390       0.000024 pread64(14, "\6\242\0\0\213\0\200\1\227|\n\0\0\0\2\4\343\352\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55664640) = 57344
[oracle@10gasm fd]$

SQL>  select 54616064/1024/1024 from dual;

54616064/1024/1024
------------------
        52.0859375
SQL> select (54616064-52*1024*1024)/4096 from dual;

(54616064-52*1024*1024)/4096
----------------------------
                          22
SQL> select (54624256-52*1024*1024)/4096 from dual;

(54624256-52*1024*1024)/4096
----------------------------
                          24
SQL> select (54665216-52*1024*1024)/4096 from dual;

(54665216-52*1024*1024)/4096
----------------------------
                          34
SQL> select (54738944-52*1024*1024)/4096 from dual;

(54738944-52*1024*1024)/4096
----------------------------
                          52
SQL> select (54796288-52*1024*1024)/4096 from dual;

(54796288-52*1024*1024)/4096
----------------------------
                          66
SQL> select (54870016-52*1024*1024)/4096 from dual;

(54870016-52*1024*1024)/4096
----------------------------
                          84
SQL> select (54927360-52*1024*1024)/4096 from dual;                

(54927360-52*1024*1024)/4096
----------------------------
                          98
SQL> select (55001088-52*1024*1024)/4096 from dual;  

(55001088-52*1024*1024)/4096
----------------------------
                         116
SQL> select (55058432-52*1024*1024)/4096 from dual;

(55058432-52*1024*1024)/4096
----------------------------
                         130

SQL> select (55132160-52*1024*1024)/4096 from dual;

(55132160-52*1024*1024)/4096
----------------------------
                         148

SQL> select (55189504-52*1024*1024)/4096 from dual;

(55189504-52*1024*1024)/4096
----------------------------
                         162

SQL> select (55263232-52*1024*1024)/4096 from dual;

(55263232-52*1024*1024)/4096
----------------------------
                         180

SQL> select (55320576-52*1024*1024)/4096 from dual;

(55320576-52*1024*1024)/4096
----------------------------
                         194

SQL> select (55394304-52*1024*1024)/4096 from dual;

(55394304-52*1024*1024)/4096
----------------------------
                         212

SQL> select (55451648-52*1024*1024)/4096 from dual;

(55451648-52*1024*1024)/4096
----------------------------
                         226

SQL> select (55574528-52*1024*1024)/4096 from dual;  --file 14

(55574528-52*1024*1024)/4096
----------------------------
                         256

SQL> select (55525376-52*1024*1024)/4096 from dual;

(55525376-52*1024*1024)/4096
----------------------------
                         244

SQL> select (55582720-52*1024*1024)/4096 from dual;  --file 14

(55582720-52*1024*1024)/4096
----------------------------
                         258

SQL> select (55664640-52*1024*1024)/4096 from dual;  --file 14

(55664640-52*1024*1024)/4096
----------------------------
                         278

从上面的信息,似乎还看不太出来,我直接通过dump 这个block,来看下它的具体offset,如下:

---打开一个session

[oracle@10gasm ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 13 07:47:55 2013
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select sid from v$mystat where rownum=1;

       SID
----------
       153

SQL> select s.sid,s.serial#,p.spid from v$process p,v$session s where p.addr=s.paddr and s.sid=153;

       SID    SERIAL# SPID
---------- ---------- ------------
       153        151 8375

SQL> oradebug setmypid
Statement processed.
SQL> select name from V$datafile where file#=6;

NAME
--------------------------------------------------------------------------------
+DATA2/test/dOracle?о?????atafile/test.256.804807701

SQL> alter system dump datafile '+DATA2/test/datafile/test.256.804807701' block 13;
System altered.

SQL> oradebug tracefile_name
/home/oracle/admin/test/udump/test_ora_8375.trc
SQL>

----执行alter system之前,执行如下strace跟踪

[oracle@10gasm fd]$  strace -fr -o /tmp/8375.log    -p  8375
Process 5390 attached - interrupt to quit
Process 5390 detached

[oracle@10gasm fd]$ cd /proc/8375/fd
[oracle@10gasm fd]$ ls -ltr
total 0
lrwx------ 1 oracle oinstall 64 Mar 13 07:47 0 -> /dev/pts/2
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 9 -> /home/oracle/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 8 -> pipe:[123600]
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 7 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 6 -> /dev/null
l-wx------ 1 oracle oinstall 64 Mar 13 07:55 5 -> /home/oracle/admin/test/udump/test_ora_8375.trc
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 13 07:55 3 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 2 -> /dev/pts/2
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 14 -> /dev/sde
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 13 -> /dev/sdd
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 12 -> /dev/sdc
l-wx------ 1 oracle oinstall 64 Mar 13 07:55 11 -> pipe:[123601]
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 10 -> /home/oracle/admin/test/adump/ora_8375.aud
lrwx------ 1 oracle oinstall 64 Mar 13 07:55 1 -> /dev/pts/2

[oracle@10gasm fd]$ cat /tmp/8375.log |grep pread64
8375       0.000028 pread64(14, "\v\242\0\0\1\0\200\1\0\0\0\0\0\0\1\4\326\n\0\0\0\0\0\0\0\1 \n\231\v8}"..., 512, 54534144) = 512
8375       0.000031 pread64(14, "\v\242\0\0\1\0\200\1\0\0\0\0\0\0\1\4\326\n\0\0\0\0\0\0\0\1 \n\231\v8}"..., 8192, 54534144) = 8192
8375       0.000028 pread64(14, "\v\242\0\0\1\0\200\1\0\0\0\0\0\0\1\4\326\n\0\0\0\0\0\0\0\1 \n\231\v8}"..., 8192, 54534144) = 8192
8375       0.000027 pread64(14, "\6\242\0\0\r\0\200\1e}\n\0\0\0\1\4H\331\0\0\1\0\0\0\212\311\0\0e}\n\0"..., 8192, 54632448) = 8192

[oracle@10gasm fd]$
SQL> select (54534144-52*1024*1024)/4096 from dual;

(54534144-52*1024*1024)/4096
----------------------------
                           2
SQL> select (54632448-52*1024*1024)/4096 from dual;

(54632448-52*1024*1024)/4096
----------------------------
                          26

可以看到这里,实际上就是操作的offset 54632448,转换一下,就知道这个位置是第53个AU的第26个block(4096来计算).
如何换成8192计算,那么正好是我们的数据库block file 6,block 13.

这里需要补充点知识,asm的mirror 是以extent为单位进行,我这里的diskgroup data2中有2个disk,分别是/dev/sdb,/dev/sde,换句话讲,我的测试表test_asm_read大小2m,实际上消耗了4m的asm空间,其中分别在2个disk中各站2m. 从前面我们的查询可以看出,我们这个测试表一共分配了0~16个,也就是17个extent,这就是说着17个extent分别存在2个disk中,各一份。

我们知道这个block在第53个au中,一个1m/8k=128,那说明我们的13号block就在一个unit单元里面。

[oracle@10gasm fd]$ dd if=/dev/sde of=/tmp/dd.asm bs=1024k skip=52 count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00809608 seconds, 130 MB/s
[oracle@10gasm fd]$  dd if=/tmp/dd.asm of=/tmp/asm_dump bs=8k skip=13 count=1
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.000183065 seconds, 44.7 MB/s
[oracle@10gasm fd]$ strings /tmp/asm_dump |grep killdb.com
killdb.com
[oracle@10gasm fd]$
从这么dd内容来看,我们定位的位置是正确的。

我们再回到前面的问题来,上面的一连串block号,我们除以2,用db block_size来计算,那么就是如下数据:
/dev/sde?? au (53) 11,12,17,26,33,42,49,58,65,79,81,90,97,106,113??? au(54) 129 ,au 54的129-128=1,即是第1个block.
/dev/sdb?? au (53) 128,122??? au(54)139,au 54的139-128=11,即是第11个block.

注意,我这里是为8192个单位进行计算的。

这里我们可以发现一个意思的事情:所读取的/dev/sdb盘操作offset,如果是以4096单位计算的话,分别对应第53个au的如下block:

256 258 278,也就是第53个au的最后一个block,和第54个au的第2个block,第11个block。

同样通过上面dd的方式去查看,我发现这几个block中并没有我们查询的那条数据。

这里还有个问题要说明,那么就是我仅仅查询了一条数据,为什么strace的结果来看,server process读取了上述多个block呢?
这个很容易解释,因为我的测试表没有索引,该sql必须走全表扫描。会扫描读取高水位线以下所有的block。

5390       0.000027 pread64(13, "#\242\0\0\v\0\200\1\231|\n\0\0\0\1\4\215c\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192, 54616064) = 8192
5390       0.000027 pread64(13, "\6\242\0\0\f\0\200\1&\220\n\0\0\0\1\0046\206\0\0\1\0\0\0\212\311\0\0&\220\n\0"..., 40960, 54624256) = 40960
5390       0.000026 pread64(13, "\6\242\0\0\21\0\200\1m|\n\0\0\0\2\0046\364\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54665216) = 65536
5390       0.000025 pread64(13, "\6\242\0\0\32\0\200\1m|\n\0\0\0\2\4\2\250\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 54738944) = 57344
5390       0.000024 pread64(13, "\6\242\0\0!\0\200\1s|\n\0\0\0\2\4\337d\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54796288) = 65536
5390       0.000024 pread64(13, "\6\242\0\0*\0\200\1y|\n\0\0\0\2\4h\30\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 54870016) = 57344
5390       0.000024 pread64(13, "\6\242\0\0001\0\200\1y|\n\0\0\0\2\4\n\233\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 54927360) = 65536
5390       0.000023 pread64(13, "\6\242\0\0:\0\200\1y|\n\0\0\0\2\4\335\t\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55001088) = 57344
5390       0.000022 pread64(13, "\6\242\0\0A\0\200\1\177|\n\0\0\0\2\4\243\261\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55058432) = 65536
5390       0.000024 pread64(13, "\6\242\0\0J\0\200\1\205|\n\0\0\0\2\4\177\221\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55132160) = 57344
5390       0.000024 pread64(13, "\6\242\0\0Q\0\200\1\205|\n\0\0\0\2\4\377[\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55189504) = 65536
5390       0.000060 pread64(13, "\6\242\0\0Z\0\200\1\205|\n\0\0\0\2\4\357\30\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55263232) = 57344
5390       0.000025 pread64(13, "\6\242\0\0a\0\200\1\213|\n\0\0\0\2\4D\n\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55320576) = 65536
5390       0.000024 pread64(13, "\6\242\0\0j\0\200\1\221|\n\0\0\0\2\4\212\351\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55394304) = 57344
5390       0.000036 pread64(13, "\6\242\0\0q\0\200\1\221|\n\0\0\0\2\4_\0\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55451648) = 65536
5390       0.000024 pread64(14, "\6\242\0\0\200\0\200\1\227|\n\0\0\0\2\4w\206\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 8192, 55574528) = 8192
5390       0.000022 pread64(13, "\6\242\0\0z\0\200\1\221|\n\0\0\0\2\4;=\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 49152, 55525376) = 49152
5390       0.000024 pread64(14, "\6\242\0\0\201\0\200\1\227|\n\0\0\0\2\4f\213\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 65536, 55582720) = 65536
5390       0.000024 pread64(14, "\6\242\0\0\213\0\200\1\227|\n\0\0\0\2\4\343\352\0\0\1\0\0\0\212\311\0\0f|\n\0"..., 57344, 55664640) = 57344
最后一列代表的是读取的大小,简单计算一下,可以得出如下信息:
1: 一共读取了126个block。
2: 该条数据所在的block offset为54632448,介于54624256和54665216之间,然而我们可以看到oracle进程在下面还读取了file 14,也就是/dev/sdb上面的信息.
3: 如果说primary extent是位于/dev/sde上,那么也就同时读取了/dev/sdb盘,也就是说即使磁盘组是normal形式,仍然会读取mirror extent的。
4:从上面信息,我们还可以得出一点,oracle虽然会读取mirror extent,但是并不是去读取我们实际的block数据。


最终我们可以通过上述实验跟踪得出一个结论,该文档描述不准确,针对normal或high的diskgroup,不是说oracle就不读去mirror extent,只是说当我们执行查询sql时,查询所返回的数据是从primary extent中读取的,但是同时也会读取mirror extent中的一些block,虽然不多。 不过目前不清楚该操作的含义,我猜测可能是oracle通过这个读取操作来看mirror extent中的数据至少是完好可以读取的。这样可以保证当我们的primary extent不可用时,可以从mirror extent中读取数据,而应用端是无所察觉的。

补充:
1) 在11gR2版本中,提供了一个新的特性Intelligent Data Placement(IDP),智能数据分布,该特性的用意是可以将我们asm实例中的较热diskgroup或较热的
datafile启用IDP特性,其意义实际上是将其数据分布至于disk的外圈,那样可以降低访问的延迟。如下几种情况适用于IDP:

1. 当磁盘组的使用率超过25%时;
2. database中数据文件的访问频率差异较大时,通俗的理解就是某些datafile io很高,其他相对较低,那么这时就可以诊断该datafile使用IDP特性;
3. 当diskgroup中disk数量越多时,效果将更加明显。

另外,要使用IDP,必须设置2个diskgroup 属性,至少要11.2,如下:

alter diskgroup DATA set attribute ‘compatible.asm’=’11.2’;
alter diskgroup DATA set attribute‘compatible.rdbms’=’11.2’;

可以通过如下2种方式去使用IDP特性,分别是diskgroup 级别和datafile文件级别:

ALTER DISKGROUP data ADD TEMPLATE datafile_hot ATTRIBUTE ( HOT MIRRORHOT);

ALTER DISKGROUP data MODIFY FILE ‘+DATA2/test/datafile/test.256.804807701′ ATTRIBUTE (HOT MIRRORHOT);

2)从11gR2开始,asm还提供了一个remap命令,当出现读取时发现corrupted sector时,asm尝试去进行block remap,当然我们也可以进行手工remap。
如果asm在remap时,默认仍然是写相同的位置,如果写入失败,会写到新的new allocation unit 中,如果仍然写入失败,会将该disk offline掉。
如果一个diskgroup中的多个盘都offline了,那么asm会强制将该diskgroup offline掉。
需要注意一点的是:remap命令是针对block级别,不过是一个范围操作,其操作本身并不是去修复错误的block,而且进行relocate操作。可以理解
为从mirror extent中去copy 正常的block过来进行覆盖。

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle ASM normal diskgroup情况下的IO读取

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1426.html

Oracle研究中心

关键词:

Oracle ASM

Oracle normal diskgroup情况下的IO读取