有時(shí)候我們想要知道一個(gè)特定的database block位于ASM的哪個(gè)磁盤,磁盤的哪個(gè)AU以及AU的哪一個(gè)塊。本篇文章將向大家展示如何解決這個(gè)問題。
首先在數(shù)據(jù)庫里創(chuàng)建測試表空間:
SQL> create tablespace T1 datafile '+DATA';
Tablespace created.
SQL> select f.FILE#, f.NAME "File", t.NAME "Tablespace" from V$DATAFILE f, V$TABLESPACE t
where t.NAME='T1' and f.TS# = t.TS#; FILE# File Tablespace ----- ---------------------------------- ---------- 6 +DATA/br/datafile/t1.272.797809075 T1
SQL>
注意到ASM file number是272。
現(xiàn)在創(chuàng)建一張測試表并插入數(shù)據(jù):
SQL> create table TAB1 (n number, name varchar2(16))
tablespace T1;
Table created.
SQL> insert into TAB1 values (1, 'CAT'); 1 row created.
SQL> commit;
Commit complete.
查詢塊號:
SQL> select ROWID, NAME from TAB1;
ROWID NAME ------------------ ---- AAASxxAAGAAAACHAAA CAT
SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER('AAASxxAAGAAAACHAAA') "Block number" from DUAL; Block number ------------ 135
查詢數(shù)據(jù)文件的塊大小:
SQL> select BLOCK_SIZE from V$DATAFILE where FILE#=6; BLOCK_SIZE
---------- 8192
可以看到插入的數(shù)據(jù)位于135號塊,數(shù)據(jù)文件塊大小為8K。
連接ASM實(shí)例,查詢272號文件的區(qū)分布:
SQL> select GROUP_NUMBER from V$ASM_DISKGROUP where NAME='DATA';
GROUP_NUMBER ------------ 1 SQL> select PXN_KFFXP, -- physical extent number XNUM_KFFXP, -- virtual extent number DISK_KFFXP, -- disk number AU_KFFXP -- allocation unit number from X$KFFXP where NUMBER_KFFXP=272 -- ASM file 272 AND GROUP_KFFXP=1 -- group number 1 order by 1;
PXN_KFFXP XNUM_KFFXP DISK_KFFXP AU_KFFXP ---------- ---------- ---------- ---------- 0 0 0 1175 1 0 3 1170 2 1 3 1175 3 1 2 1179 4 2 1 1175 ...
SQL>
可以看到文件的區(qū)分布在所有磁盤,由于數(shù)據(jù)文件為Normal冗余,每個(gè)區(qū)都是兩副本。注意我說的是數(shù)據(jù)文件為Normal冗余。默認(rèn)情況下,文件會繼承磁盤組的冗余策略。控制文件是個(gè)例外:即使在Normal冗余的磁盤組,如果磁盤組包含至少3個(gè)failgroup,控制文件也會被創(chuàng)建為high冗余。
查詢磁盤組的AU大小:
SQL> select VALUE from V$ASM_ATTRIBUTE where NAME='au_size' and GROUP_NUMBER=1;
VALUE
------- 1048576
AU大小為1MB。注意每個(gè)磁盤組可以有不同的AU大小。
現(xiàn)在已知測試數(shù)據(jù)在272號ASM file的135號塊。數(shù)據(jù)塊為8K的情況下,每個(gè)AU可以包含128個(gè)塊。這就意味著135號塊位于第二個(gè)virtual extent的第7個(gè)塊。第二個(gè)virtual extent包含3號磁盤的1175號AU和2號磁盤的1179號AU。
查詢磁盤2和3的名字:
SQL> select DISK_NUMBER, NAME from V$ASM_DISK where DISK_NUMBER in (2,3);
DISK_NUMBER NAME
----------- ------------------------------ 2 ASMDISK3 3 ASMDISK4
SQL>
我使用了ASMLIB,所以在OS層面,對應(yīng)的磁盤名為:
/dev/oracleasm/disks/ASMDISK3和/dev/oracleasm/disks/ASMDISK4
測試數(shù)據(jù)位于1175號AU的第7個(gè)塊。我們首先將這個(gè)AU的數(shù)據(jù)dd出來:
$ dd if=/dev/oracleasm/disks/ASMDISK4 bs=1024k count=1 skip=1175 of=AU1175.dd 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.057577 seconds, 18.2 MB/s
$ ls -l AU1175.dd -rw-r--r-- 1 grid oinstall 1048576 Oct 27 22:45 AU1175.dd
$
注意幾個(gè)參數(shù)的含義:
然后將7號塊的數(shù)據(jù)從AU中導(dǎo)出:
$ dd if=AU1175.dd bs=8k count=1 skip=7 of=block135.dd
注意bs指定為8k(數(shù)據(jù)塊大小),skip指定為7(要導(dǎo)出的塊號)。
查看數(shù)據(jù)塊內(nèi)容:
$ od -c block135.dd ... 0017760 \0 \0 , 001 002 002 301 002 003 C A T 001 006 332 217 0020000 $
在內(nèi)容的后可以看到插入的數(shù)據(jù) – CAT。注意Oracle數(shù)據(jù)塊從下向上填充。如果去查看磁盤/dev/oracleasm/disks/ASMDISK3的1179號AU,結(jié)果是一樣的。
要定位ASM中數(shù)據(jù)塊的位置,需要知道數(shù)據(jù)塊位于哪個(gè)數(shù)據(jù)文件。然后通過X$KFFXP視圖查看數(shù)據(jù)文件的區(qū)分布。還需要數(shù)據(jù)塊大小和ASM AU大小去定位數(shù)據(jù)塊位于哪個(gè)AU。以上操作和ASM或者RDBMS的版本無關(guān)。(V$ASM_ATTRIBUTE視圖除外,因?yàn)樵?0g中沒有該視圖)在Normal和high冗余模式下,將會有多副本數(shù)據(jù)。但是定位數(shù)據(jù)塊的方法是相同的。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。