linux中asm文件夹,定位数据在ASM中的位置

有时候我们想要知道一个特定的database block位于ASM的哪个磁盘,磁盘的哪个AU以及AU的哪一个块。本篇文章将向大家展示如何解决这个问题。

首先在数据库里创建测试表空间:

SQL> create tablespace t_cs datafile '+testdg' size 50M autoextend off;

Tablespace created.

SQL> set long 200

SQL> set linesize 200

SQL> select f.file#, f.name "file", t.name "tablespace"

2  from v$datafile f, v$tablespace t

3  where t.name='T_CS' and f.ts# = t.ts#;

FILE# file                                              tablespace

---------- -------------------------------------------------- ------------------------------

11 +TESTDG/jyrac/datafile/t_cs.256.932913341          T_CS

注意到ASM file number是256,现在创建一张测试表并插入数据:

SQL> create table t(n number,name varchar2(20)) tablespace t_cs;

Table created.

SQL> insert into t values(1,'JY');

1 row created.

SQL> commit;

Commit complete.

查询表T所占用的数据块号:

SQL> select rowid,name from t;

ROWID              NAME

------------------ --------------------------------------------------

AAAV/pAALAAAACHAAA JY

SQL> select dbms_rowid.rowid_block_number('AAAV/pAALAAAACHAAA') "block number" from dual;

block number

------------

135

查询数据文件的块大小:

SQL> select block_size from v$datafile where file#=11;

BLOCK_SIZE

----------

8192

可以看到插入的数据位于135号块,数据文件块大小为8K。

连接ASM实例,查询256号文件的区分布:

SQL> select group_number from v$asm_diskgroup where name='TESTDG';

GROUP_NUMBER

------------

5

SQL> select

2  xnum_kffxp,            -- virtual extent number

3  pxn_kffxp,            -- physical extent number

4  disk_kffxp,            -- disk number

5  au_kffxp              -- allocation unit number

6  from x$kffxp

7  where number_kffxp=256 -- asm file 256

8  and group_kffxp=5      -- group number 1

9  order by 1,2,3;

XNUM_KFFXP  PXN_KFFXP DISK_KFFXP  AU_KFFXP

---------- ---------- ---------- ----------

0          0          2        41

0          1          3        38

1          2          3        39

1          3          2        42

2          4          1        41

2          5          0        36

3          6          0        37

3          7          2        43

4          8          2        45

4          9          1        42

5        10          3        40

5        11          1        43

6        12          1        44

6        13          2        47

7        14          0        38

7        15          1        45

8        16          2        48

8        17          0        39

9        18          3        43

9        19          0        40

10        20          1        46

10        21          3        44

11        22          0        41

11        23          3        45

12        24          2        49

12        25          3        46

13        26          3        47

13        27          2        46

14        28          1        47

14        29          0        42

15        30          0        43

15        31          2        52

16        32          2        53

16        33          1        48

17        34          3        48

17        35          1        49

18        36          1        50

18        37          2        54

19        38          0        44

19        39          1        51

20        40          2        55

20        41          0        45

21        42          3        50

21        43          0        46

22        44          1        52

22        45          3        51

23        46          0        47

23        47          3        52

24        48          2        56

24        49          3        53

25        50          3        54

25        51          2        59

26        52          1        53

26        53          0        48

27        54          0        49

27        55          2        60

28        56          2        61

28        57          1        54

29        58          3        55

29        59          1        56

30        60          1        58

30        61          2        65

31        62          0        51

31        63          1        59

32        64          2        66

32        65          0        52

33        66          3        57

33        67          0        53

34        68          1        60

34        69          3        58

35        70          0        54

35        71          3        59

36        72          2        67

36        73          3        60

37        74          3        61

37        75          2        68

38        76          1        61

38        77          0        55

39        78          0        56

39        79          2        71

40        80          2        72

40        81          1        63

41        82          3        63

41        83          1        64

42        84          1        65

42        85          2        73

43        86          0        57

43        87          1        66

44        88          2        74

44        89          0        58

45        90          3        64

45        91          0        59

46        92          1        67

46        93          3        65

47        94          0        60

47        95          3        66

48        96          2        77

48        97          3        67

49        98          3        69

49        99          2        78

50        100          1        69

50        101          0        61

2147483648          0          1        57

2147483648          1          0        50

2147483648          2          2        62

105 rows selected.

可以看到文件的区分布在所有磁盘,由于数据文件为Normal冗余,每个区都是两副本。注意我说的是数据文件为Normal冗余。默认情况下,文件会继承磁盘组的冗余策略。控制文件是个例外:即使在Normal冗余的磁盘组,如果磁盘组包含至少3个failgroup,控制文件也会被创建为high冗余。

查询磁盘组的AU大小:

SQL> select block_size,allocation_unit_size from v$asm_diskgroup where group_number=5;

BLOCK_SIZE ALLOCATION_UNIT_SIZE

---------- --------------------

4096              1048576

AU大小为1MB。注意每个磁盘组可以有不同的AU大小。

现在已知测试数据在256号ASM file的135号块。数据块为8K的情况下,每个AU可以包含128个块。这就意味着135号块位于第二个virtual extent的第7个块。第二个virtual extent包含3号磁盘的39号au和2号磁盘的42号au.

查询磁盘2和3的名字:

SQL> set long 200

SQL> set linesize 200

SQL> select disk_number, name,path from v$asm_disk where group_number=5 and disk_number in (2,3);

DISK_NUMBER NAME                                                        PATH

----------- ------------------------------------------------------------ --------------------------------------------------

2 TESTDG_0002                                                  /dev/raw/raw13

3 TESTDG_0003                                                  /dev/raw/raw14

测试数据位于2号磁盘的42号AU的第7个块。我们首先将这个AU的数据dd出来:

[grid@jyrac1 ~]$ dd if=/dev/raw/raw13 bs=1024k count=1 skip=42 of=AU42.dd

1+0 records in

1+0 records out

1048576 bytes (1.0 MB) copied, 0.021209 seconds, 49.4 MB/s

注意几个参数的含义:

bs=1024k -- AU的大小

skip=42 -- 它是指跳过文件的前42个数据块,从第43个数据块开始,因为AU的序号是从0开始

count=1 -- 只需要导出一个AU

然后将7号块的数据从AU中导出:

[grid@jyrac1 ~]$ dd if=AU42.dd bs=8k count=1 skip=7 of=block135.dd

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 9.3e-05 seconds, 88.1 MB/s

注意bs指定为8k(数据块大小),skip指它是指跳过文件的前7个数据块,从第8个数据块开始,因为AU中的块号也是从0开始(要导出的块号)。

查看数据块内容:

[grid@jyrac1 ~]$ od -c block135.dd

0000000 006 242  \0  \0 207  \0 300 002 020  W 314  \0  \0  \0 001 006

0000020 305 276  \0  \0 001  \0 020  \0 351  _ 001  \0 016  W 314  \0

0000040  \0  \0 350 037 002 037  2  \0 200  \0 300 002 005  \0  \r  \0

....

0017760 001 200 001  , 001 002 002 301 002 002  J  Y 001 006 020  W

0020000

在内容的最后可以看到插入的数据 -- JY.注意Oracle数据块从下向上填充。

查看3号磁盘/dev/raw/raw14的39号AU,结果是一样的

[grid@jyrac1 ~]$ dd if=/dev/raw/raw14 bs=1024k count=1 skip=39 of=AU39.dd

1+0 records in

1+0 records out

1048576 bytes (1.0 MB) copied, 0.017309 seconds, 60.6 MB/s

[grid@jyrac1 ~]$ dd if=AU39.dd bs=8k count=1 skip=7 of=block135_copy.dd

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 0.000207 seconds, 39.6 MB/s

0000000 006 242  \0  \0 207  \0 300 002 020  W 314  \0  \0  \0 001 006

0000020 305 276  \0  \0 001  \0 020  \0 351  _ 001  \0 016  W 314  \0

0000040  \0  \0 350 037 002 037  2  \0 200  \0 300 002 005  \0  \r  \0

....

0017760 001 200 001  , 001 002 002 301 002 002  J  Y 001 006 020  W

0020000

小结:

要定位ASM中数据块的位置,需要知道数据块位于哪个数据文件。然后通过X$KFFXP视图查看数据文件的区分布。还需要数据块大小和ASM AU大小去定位数据块位于哪个AU。 以上操作和ASM或者RDBMS的版本无关。(V$ASM_ATTRIBUTE视图除外,因为在10g中没有该视图)在Normal和high冗余模式下,将会有多副本数据。但是定位数据块的方法是相同的。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值