Мы запускаем различные отчеты непосредственно из базы данных 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
(Размеры, которые я показал для ясности, указаны в Гб, но в базе данных фактически в байтах)
Попробуй это:
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
- Прокомментируйте это для всех файлов ВМ; это фильтрует только файлы размером более 1 ГБ прибл. и file_size> 1e9