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。