我们直接从 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