ASM分配空间的最小量就是一个分配单元AU。缺省的AU大小是1MB,但exadata中缺省的AU大小是4MB。ASM基于文件的空间分配是以区为单位的,区是由一个或多个AU组成的。在11.2中,前20000个区只包含1个AU,接下来的20000个区包含4个AU,之后的区包含16个AU。这就叫做可变大小区。在11.1中,区的增长是以1-8-64倍AU的方式增长的。在10g中,没有可变大小区,所以所有的区大小实际上都是1个AU。
在v$asm_file视图中可以看到bytes与space列:
.bytes:文件大小以bytes为单位
.space:分配给文件的字节数
在定义方面有细微的差别并且在数量方面有较大差别。
首先查询关于磁盘组datadg的一些基本信息,因为磁盘组datadg存储了大多数数据文件。在数据库实例上执行以下查询:
SQL> select name, group_number, allocation_unit_size/1024/1024 "au size (mb)", type from v$asm_diskgroup where name='DATADG'; NAME GROUP_NUMBER au size (mb) TYPE ------------------------------------------------------------ ------------ ------------ ------------ DATADG 3 1 NORMAL
现在创建一个小文件(不超过60个区)和一个大文件(超过60个区)
SQL> create tablespace t1 datafile '+datadg' size 10M; Tablespace created. SQL> create tablespace t2 datafile '+datadg' size 100M; Tablespace created.
查询到所创建的表空间的数据文件号
SQL> select name,round(bytes/1024/1024) "MB" from v$datafile; NAME MB ------------------------------------------------------------ ---------- +DATADG/jyrac/datafile/system.259.930413057 760 +DATADG/jyrac/datafile/sysaux.258.930413055 1630 +DATADG/jyrac/datafile/undotbs1.262.930413057 100 +DATADG/jyrac/datafile/users.263.930413057 5 +DATADG/jyrac/datafile/example.260.930413057 346 +DATADG/jyrac/datafile/undotbs2.261.930413057 150 +DATADG/jyrac/datafile/test01.dbf 100 +DATADG/jyrac/datafile/cs.271.931880499 1 +DATADG/jyrac/datafile/cs_stripe_coarse.272.931882089 1 +DATADG/jyrac/datafile/not_important.273.931882831 1 +TESTDG/jyrac/datafile/t_cs.256.932985243 50 +DATADG/jyrac/datafile/t1.274.933003755 10 +DATADG/jyrac/datafile/t2.275.933003775 100 13 rows selected.
小文件的ASM文件号是274,大文件的ASM文件号是275。
查询这两个文件的字节数与空间信息(AU)
SQL> select file_number, round(bytes/1024/1024) "bytes (au)", round(space/1024/1024) "space (aus)", redundancy
2 from v$asm_file where file_number in (274, 275) and group_number=3;
FILE_NUMBER bytes (au) space (aus) REDUND
----------- ---------- ----------- ------
274 10 22 MIRROR
275 100 205 MIRROR
bytes列显示了真实的文件大小。对于小文件来说,bytes显示文件的大小为10个AU=10MB(AU的大小为1MB),而小文件空间使用了22个AU。10个AU用于真实的数据文件,1个AU用于文件头,并且因为文件被镜像,因此需要双倍数量的AU,也就是22个AU。对于大文件来说,bytes显示文件的大小为100个AU=100MB(AU的大小为1MB),100个AU用于真实的数据文件,1个AU用于文件头,并且因为文件被像像,因此需要双倍数量的AU,也就是202个AU,但这里大文件空间使用了205个AU,额外的3个AU是什么呢?
执行下面的查询来获得275号文件的AU分布情况:
SQL> select xnum_kffxp "virtual extent", pxn_kffxp "physical extent", disk_kffxp "disk number", au_kffxp "au number"
2 from x$kffxp where group_kffxp=3 and number_kffxp=275
3 order by 1,2,3;
virtual extent physical extent disk number au number
-------------- --------------- ----------- ----------
0 0 3 1787
0 1 2 1779
1 2 1 1779
1 3 3 1788
2 4 2 1780
2 5 3 1789
3 6 0 1785
3 7 2 1781
4 8 3 1790
4 9 1 1780
5 10 1 1781
5 11 2 1782
6 12 2 1783
6 13 0 1786
7 14 0 1787
7 15 3 1791
8 16 3 1792
8 17 0 1788
9 18 1 1782
9 19 0 1789
10 20 2 1784
10 21 1 1783
11 22 0 1790
11 23 1 1784
12 24 3 1793
12 25 2 1785
13 26 1 1785
13 27 3 1794
14 28 2 1786
14 29 3 1795
15 30 0 1791
15 31 2 1787
16 32 3 1796
16 33 1 1786
17 34 1 1787
17 35 2 1788
18 36 2 1789
18 37 0 1792
19 38 0 1793
19 39 3 1797
20 40 3 1798
20 41 0 1794
21 42 1 1788
21 43 0 1795
22 44 2 1790
22 45 1 1789
23 46 0 1796
23 47 1 1790
24 48 3 1799
24 49 2 1791
25 50 1 1791
25 51 3 1800
26 52 2 1792
26 53 3 1801
27 54 0 1797
27 55 2 1793
28 56 3 1802
28 57 1 1792
29 58 1 1793
29 59 2 1794
30 60 2 1796
30 61 0 1798
31 62 0 1799
31 63 3 1804
32 64 3 1805
32 65 0 1800
33 66 1 1795
33 67 0 1801
34 68 2 1797
34 69 1 1796
35 70 0 1802
35 71 1 1797
36 72 3 1806
36 73 2 1798
37 74 1 1798
37 75 3 1807
38 76 2 1799
38 77 3 1808
39 78 0 1803
39 79 2 1800
40 80 3 1809
40 81 1 1799
41 82 1 1800
41 83 2 1801
42 84 2 1802
42 85 0 1804
43 86 0 1805
43 87 3 1810
44 88 3 1811
44 89 0 1806
45 90 1 1801
45 91 0 1807
46 92 2 1803
46 93 1 1802
47 94 0 1808
47 95 1 1803
48 96 3 1812
48 97 2 1804
49 98 1 1804
49 99 3 1813
50 100 2 1805
50 101 3 1814
51 102 0 1809
51 103 2 1806
52 104 3 1815
52 105 1 1805
53 106 1 1806
53 107 2 1807
54 108 2 1808
54 109 0 1810
55 110 0 1811
55 111 3 1816
56 112 3 1817
56 113 0 1812
57 114 1 1807
57 115 0 1813
58 116 2 1809
58 117 1 1808
59 118 0 1814
59 119 1 1809
60 120 3 1818
60 121 2 1810
61 122 1 1810
61 123 3 1819
62 124 2 1811
62 125 3 1820
63 126 0 1815
63 127 2 1812
64 128 3 1821
64 129 1 1811
65 130 1 1812
65 131 2 1813
66 132 2 1814
66 133 0 1816
67 134 0 1817
67 135 3 1822
68 136 3 1823
68 137 0 1818
69 138 1 1813
69 139 0 1819
70 140 2 1815
70 141 1 1814
71 142 0 1820
71 143 1 1815
72 144 3 1824
72 145 2 1816
73 146 1 1816
73 147 3 1825
74 148 2 1817
74 149 3 1826
75 150 0 1821
75 151 2 1818
76 152 3 1827
76 153 1 1817
77 154 1 1818
77 155 2 1819
78 156 2 1820
78 157 0 1822
79 158 0 1823
79 159 3 1828
80 160 3 1829
80 161 0 1824
81 162 1 1819
81 163 0 1825
82 164 2 1821
82 165 1 1820
83 166 0 1826
83 167 1 1821
84 168 3 1830
84 169 2 1822
85 170 1 1822
85 171 3 1831
86 172 2 1823
86 173 3 1832
87 174 0 1827
87 175 2 1824
88 176 3 1833
88 177 1 1823
89 178 1 1824
89 179 2 1825
90 180 2 1826
90 181 0 1828
91 182 0 1829
91 183 3 1834
92 184 3 1835
92 185 0 1830
93 186 1 1825
93 187 0 1831
94 188 2 1827
94 189 1 1826
95 190 0 1832
95 191 1 1827
96 192 3 1836
96 193 2 1828
97 194 1 1828
97 195 3 1837
98 196 2 1829
98 197 3 1838
99 198 0 1833
99 199 2 1830
100 200 3 1839
100 201 1 1829
2147483648 0 1 1794
2147483648 1 2 1795
2147483648 2 3 1803
205 rows selected.
当文件被镜像时,可以看到每个虚拟区有两个物理区。但有趣的是最三个AU的虚拟区号为2147483648,有三份镜像副本。接下来将使用kfed工具来查看它们的内容。
查询磁盘组datadg的磁盘名
SQL> select disk_number, path from v$asm_disk where group_number=3;
DISK_NUMBER PATH
----------- --------------------------------------------------
0 /dev/raw/raw11
1 /dev/raw/raw4
3 /dev/raw/raw10
2 /dev/raw/raw3
[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=1794 | grep type
kfbh.type: 12 ; 0x002: KFBTYP_INDIRECT
[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=1795 | grep type
kfbh.type: 12 ; 0x002: KFBTYP_INDIRECT
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=1803 | grep type
kfbh.type: 12 ; 0x002: KFBTYP_INDIRECT
这些额外的AU用来存储大文件的ASM元数据。更确切地说,它们所持有的区映射信息无法存储在ASM文件目录块中。文件目录需要额外的空间来跟踪超过60个区的大文件,因为需要额外的AU。虽然文件目录只需要几个额外的ASM元数据块,因为ASM空间分配的最小单元是一个AU,并且因为这是元数据,AU存在三份镜像(虽然是normal冗余磁盘组),因此对于大文件来说会分配3个额外的AU。在外部冗余磁盘组中,对于每个大文件只有1个额外的AU。
小结:
对于一个文件ASM磁盘组所需要的空间大小依赖于两个因素:文件大小与磁盘的冗余类型:
在外部冗余磁盘组中,如果文件大小超过60个AU,那么所需要的空间将是文件大小所占用的AU,加上文件头所占用的1个AU,加上间接区所占用的1个AU。
在normal冗余磁盘组中,如果文件大小超过60个AU,那么所需要的空间将是文件大小所占用的AU,加上文件头所占用的2个AU,加上间接区所占用的3个AU。
在high冗余磁盘组中,如果文件大小超过60个AU,那么所需要的空间将是文件大小所占用的AU,加上文件头所占用的3个AU,加上间接区所占用的3个AU。