作者 阿九【转载时请务必以超链接形式标明文章原始出处和作者信息】
先看下ASM磁盘组的组成和容量
SQL> select group_number,disk_number,total_mb,free_mb from v$asm_disk order by disk_number;
GROUP_NUMBER DISK_NUMBER TOTAL_MB FREE_MB
------------ ----------- ---------- ----------
0 0 0 0
1 0 3072 1795
1 1 1024 594
0 1 0 0
SQL>
磁盘组是由两个盘组成,一个3G大小,一个1G大小
看下总体的容量
SQL> !asmcmd lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 4096 1048576 4096 2368 0 2368 0 N DATA/
SQL>
可以看到总空闲空间为 2368M
我们测试添加一个1024M的文件看看
SQL> create tablespace testasm3 datafile '+DATA' size 1024M;
表空间已创建。
SQL>
表空间创建成功,我们看下容量变化
SQL> select group_number,disk_number,total_mb,free_mb from v$asm_disk order by disk_number;
GROUP_NUMBER DISK_NUMBER TOTAL_MB FREE_MB
------------ ----------- ---------- ----------
0 0 0 0
1 0 3072 1009
1 1 1024 333
0 1 0 0
SQL>
看来1024M大小被分散到了两个磁盘上,总空闲容量为:1342M,我们再添加一个1024M的表空间看看
SQL> create tablespace testasm4 datafile '+DATA' size 1024M;
表空间已创建。
SQL>
表空间也创建成功了,我们再看下容量变化
SQL> /
GROUP_NUMBER DISK_NUMBER TOTAL_MB FREE_MB
------------ ----------- ---------- ----------
0 0 0 0
1 0 3072 239
1 1 1024 77
0 1 0 0
SQL>
看到总空想容量还有:316M,但最小的一个盘只剩77M容量,我们按300M来添加一个表空间看看
SQL> create tablespace testasm5 datafile '+DATA' size 300M;
表空间已创建。
SQL>
表空间创建成功了,看下容量变化
SQL> /
GROUP_NUMBER DISK_NUMBER TOTAL_MB FREE_MB
------------ ----------- ---------- ----------
0 0 0 0
1 0 3072 12
1 1 1024 2
0 1 0 0
SQL>
SQL> !asmcmd lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 4096 1048576 4096 14 0 14 0 N DATA/
SQL>
可以ASM磁盘组总空闲容量为14M,我们继续添加一个13M的表空间看看
SQL> create tablespace testasm6 datafile '+DATA' size 13M;
create tablespace testasm6 datafile '+DATA' size 13M
*
第 1 行出现错误:
ORA-01119: 创建数据库文件 '+DATA' 时出错
ORA-17502: ksfdcre: 4 未能创建文件 +DATA
ORA-15041: diskgroup "DATA" space exhausted
SQL>
报错了,提示空间不足,但是从ASM实例来看,空闲空间还有14M呢,我加个13M的空间应该不会报错啊
SQL> create tablespace testasm6 datafile '+DATA' size 12M;
create tablespace testasm6 datafile '+DATA' size 12M
*
第 1 行出现错误:
ORA-01119: 创建数据库文件 '+DATA' 时出错
ORA-17502: ksfdcre: 4 未能创建文件 +DATA
ORA-15041: diskgroup "DATA" space exhausted
SQL> create tablespace testasm6 datafile '+DATA' size 10M;
create tablespace testasm6 datafile '+DATA' size 10M
*
第 1 行出现错误:
ORA-01119: 创建数据库文件 '+DATA' 时出错
ORA-17502: ksfdcre: 4 未能创建文件 +DATA
ORA-15041: diskgroup "DATA" space exhausted
SQL>
无论我用10M 还是12M都还是报空间不足错误。
看来ASM磁盘组,如果磁盘组中各磁盘容量差异太大,最终会导致这种空闲空间的虚假信息。
因为ASM的rebalance不能将某个比例的数据分配到小容量的磁盘中。