从 SQL 获取虚拟机客户数据存储利用率

从 SQL 获取虚拟机客户数据存储利用率

我们直接从 vSphere 4.1 数据库运行各种报告,以获得快照、预留等内容的战术概述。

我目前遇到的问题是我无法找出客户的数据存储使用情况。

因此虚拟机来自 VPX_VM:

SELECT VM.ID, ENTITY.NAME
FROM VPX_VM VM
INNER JOIN VPX_ENTITY ENTITY ON (VM.ID=ENTITY.ID)

/*
ID | NAME
41 | Guest1
/*

我可以从 VPX_GUEST_DISK 获取客户机使用情况:

SELECT *
FROM VPX_GUEST_DISK

/*
VM_ID | PATH | CAPACITY | FREE_SPACE
   41 | C:\  |    30 Gb |      10 Gb
   41 | D:\  |    25 Gb |      20 Gb
   41 | F:\  |   100 Gb |      15 Gb
   41 | G:\  |   100 Gb |       4 Gb
   41 | H:\  |   100 Gb |      20 Gb
   41 | I:\  |   250 Gb |      10 Gb
   41 | J:\  |    50 Gb |       9 Gb
*/

我可以从 VPX_DS_ASSIGNMENT 中找出正在使用的数据存储:

SELECT VM.ID, ENTITY.NAME, ASS.DS_ID, DS.NAME
FROM
    VPX_VM VM
    INNER JOIN VPX_ENTITY ENTITY ON (VM.ID=ENTITY.ID)
    LEFT JOIN VPX_DS_ASSIGNMENT ASS ON (ASS.ENTITY_ID=VM.ID)
    LEFT JOIN VPX_DATASTORE DS ON (ASS.DS_ID=DS.ID)

/*
ID | NAME   | DS_ID | NAME
41 | Guest1 |    15 | Datastore1
41 | Guest1 |    21 | Datastore2
41 | Guest1 |    50 | Datastore3
41 | Guest1 |   380 | Datastore4
41 | Guest1 |   382 | Datastore5
*/

请注意,这里只有 5 个分配,因为客户机的 F:和 G:磁盘位于同一个数据存储上,而它的 I:和 J:磁盘位于同一个(不同的)数据存储上。

但我无法查明每个数据存储的使用量。我真正需要的是告诉我每个 VPX_GUEST_DISK 位于哪个数据存储上的链接。

这就是我最终需要的结果:

ID | NAME   | DS_ID | NAME       | ASSIGNED
41 | Guest1 |    15 | Datastore1 |    30 Gb
41 | Guest1 |    21 | Datastore2 |    25 Gb
41 | Guest1 |    50 | Datastore3 |    25 Gb
41 | Guest1 |   380 | Datastore4 |   100 Gb
41 | Guest1 |   382 | Datastore5 |   300 Gb

甚至

ID | NAME   | DS_ID | NAME       | ASSIGNED
41 | Guest1 |    15 | Datastore1 |    30 Gb
41 | Guest1 |    21 | Datastore2 |    25 Gb
41 | Guest1 |    50 | Datastore3 |   100 Gb
41 | Guest1 |    50 | Datastore3 |   100 Gb
41 | Guest1 |   380 | Datastore4 |   100 Gb
41 | Guest1 |   382 | Datastore5 |   250 Gb
41 | Guest1 |   382 | Datastore5 |    50 Gb

(为了清楚起见,我显示的大小以 Gb 为单位,但数据库中的大小实际上是以字节为单位)

答案1

尝试一下这个:

select 
    ds.ds_name, ds.ds_capacity_gb, ds.ds_free_gb,
    -- vm.name, 
    substring(vm.name, len(ds.storage_url) + 1, len(vm.name) - len(ds.storage_url)) file_name, 
    CONVERT(decimal(10, 0), CONVERT(decimal(15, 0), vm.file_size) / 1024 / 1024 / 1024) AS file_size_gb,
    vm.type
from vpx_vm_fle_file_info vm, 
    (select name as ds_name, storage_url, CONVERT(decimal(10, 0), CONVERT(decimal(15, 0), CAPACITY) / 1024 / 1024 / 1024) AS ds_capacity_gb, 
        CONVERT(decimal(10, 0), CONVERT(decimal(15, 0), FREE_SPACE) / 1024 / 1024 / 1024) AS ds_free_gb
    from vpx_datastore) ds
where vm_id = 7000
    -- filter by datastores
    and substring(vm.name, 1, len(ds.storage_url)) = ds.storage_url

-- 对所有 VM 文件进行注释;这仅过滤大约超过 1 GB 的文件,并且 file_size > 1e9

相关内容