Назад | Перейти на главную страницу

Получение использования гостевого хранилища данных виртуальной машины из 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

(Размеры, которые я показал для ясности, указаны в Гб, но в базе данных фактически в байтах)

Попробуй это:

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