联系:QQ(5163721)
标题:Exadata上,ASM的Req_mir_free_MB 是如何得到的?
作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
Exadata上,ASM的Req_mir_free_MB 是如何得到的?
首先,我们都知道,可通过v$asm_diskgroup来查看required_mirror_free_mb:
SQL> set linesize 150 SQL> set pages 999 SQL> SELECT name, type, group_number, total_mb, free_mb, required_mirror_free_mb FROM v$asm_diskgroup ORDER BY name; NAME TYPE GROUP_NUMBER TOTAL_MB FREE_MB REQUIRED_MIRROR_FREE_MB ------------------------------ ------ ------------ ---------- ---------- ----------------------- DATA_DM01 NORMAL 1 15593472 9371300 2074432 DBFS_DG NORMAL 2 894720 893248 81338 RECO_DM01 NORMAL 3 3896064 2597260 434924 SQL>
这里看到,实际上lsdg的输出跟v$asm_diskgroup是一致的(注意,早起的数据库版本由于rebalance时的bug,可能造成显示不一致,例如 Bug 7699985)
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 NORMAL N 512 4096 4194304 15593472 9371300 2074432 3648434 0 N DATA_DM01/ MOUNTED NORMAL N 512 4096 4194304 894720 893248 81338 405955 0 Y DBFS_DG/ MOUNTED NORMAL N 512 4096 4194304 3896064 2597260 434924 1081168 0 N RECO_DM01/ ASMCMD>
由于Exadata上,没有外部冗余,数据完全通过ASM镜像,那么就要考虑当磁盘故障或者cell故障时的数据保护,需要相应的根据Normal Redundancy或者High Redundancy来考虑分别两种情况:
1,在Normal Redundancy时,要考虑1块磁盘损坏或者1个cell不能启动时,如果修复时间超过缺省的3.6小时,需要使用现有系统中可用磁盘空间做Rebalance
2,在HighRedundancy时,要考虑2块磁盘损坏或者2个cell不能启动时,如果修复时间超过缺省的3.6小时,需要使用现有系统中可用磁盘空间做Rebalance
Oracle根据内部算法,使用一个调解因子做系数,比如,不同版本的Oracle,评估方法不同:
如果数据库是11.2.0.3或者11.2.0.4,那么这个调解因子为1.10,如果是低于这个版本的数据库,调解因子是1.5(具体该因子的算法尚未知道)
对于每一个磁盘组,他们需要调解的空间大小(即,预留空间)=v$asm_diskgroup.required_mirror_free_mb * 调解因子
然后根据不同的镜像(Normal或者High),以及不同的Exadata配置(1/8,1/4、1/2,满配)再分别乘以一个系数,下面的代码根据每个磁盘组的最大的failgroup的大小来确定需要保留的空间:
然后,计算出来总共的需要“预留的空间”按照不同配置的Exadata乘以一个比例,就是我们这看到的 REQUIRED_MIRROR_FREE_MB:
对于Normal Redundancy:
-- Eighth Rack IF dg.type = 'NORMAL' THEN -- Eighth Rack IF (v_num_disks < 36) THEN -- Use eqn: y = 1.21344 x+ 17429.8 v_required_free_mb := 1.21344 * v_max_total_mb + 17429.8; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Quarter Rack ELSIF (v_num_disks >= 36 AND v_num_disks < 84) THEN -- Use eqn: y = 1.07687 x+ 19699.3 -- Revised 2/21/14 for 11.2.0.4 to use eqn: y=0.803199x + 156867, more space but safer v_required_free_mb := 0.803199 * v_max_total_mb + 156867; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Half Rack ELSIF (v_num_disks >= 84 AND v_num_disks < 168) THEN -- Use eqn: y = 1.02475 x+53731.3 v_required_free_mb := 1.02475 * v_max_total_mb + 53731.3; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Full rack is most conservative, it will be default ELSE -- Use eqn: y = 1.33333 x+83220. v_required_free_mb := 1.33333 * v_max_total_mb + 83220; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; END IF; -- DISK usable file MB v_usable_mb := ROUND((dg.free_mb - v_required_free_mb)/2); v_disk_desc := 'ONE disk'; -- CELL usable file MB v_cell_usable_mb := ROUND( (dg.free_mb - v_one_cell_req_mir_free_mb)/2 ); v_one_cell_usable_mb := v_cell_usable_mb;
对于High Redundancy:
-- Eighth Rack IF (v_num_disks <= 18) THEN -- Use eqn: y = 4x + 0 -- Updated for 11.2.0.4 to higher value: y = 3.84213x + 84466.4 v_required_free_mb := 3.84213 * v_max_total_mb + 84466.4; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Quarter Rack ELSIF (v_num_disks > 18 AND v_num_disks <= 36) THEN -- Use eqn: y = 3.87356 x+417692. v_required_free_mb := 3.87356 * v_max_total_mb + 417692; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Half Rack ELSIF (v_num_disks > 36 AND v_num_disks <= 84) THEN -- Use eqn: y = 2.02222 x+56441.6 v_required_free_mb := 2.02222 * v_max_total_mb + 56441.6; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; -- Full rack is most conservative, it will be default ELSE -- Use eqn: y = 2.14077 x+54276.4 v_required_free_mb := 2.14077 * v_max_total_mb + 54276.4; IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; END IF; -- DISK usable file MB v_usable_mb := ROUND((dg.free_mb - v_required_free_mb)/3); v_disk_desc := 'TWO disks'; -- CELL usable file MB v_one_cell_usable_mb := ROUND( (dg.free_mb - v_one_cell_req_mir_free_mb)/3 );