normal diskgroup情况下的IO读取
本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客
本文链接地址: normal diskgroup情况下的IO读取
前段时间,在ML的群中,原厂一个哥们发了图,图中提到oracle 12c之前,asm 的读取默认都是始终从primary extent开始的,然而从12c开始发生变化。
当时的图片我找不到了,在以前的文档中,我找到如下一个图,基本上类似:
1 |
1 |
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
---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> 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.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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 SQL> |
从上面可以看到,我们的datafile 6大小是10m,而我创建的测试表占据2m(未建其他表),所以,我们的test_asm_read表
应该就在最前面的2个au当中。从上面的查询结果我们也可以看到,au分别存了2份,一份是primary extent,一份是
mirror extent, 我们来验证下:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
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 SQL> |
从上面的信息,似乎还看不太出来,我直接通过dump 这个block,来看下它的具体offset,如下:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
---打开一个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/datafile/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单元里面。
1 2 3 4 5 6 7 8 9 10 11 |
[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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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过来进行覆盖。
Leave a Reply
You must be logged in to post a comment.