Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Доброго дня!
Помогите, пожалуйста, с запросом к БД Nagios
Есть вот такие данные
host_id service_id performance_data
101 201 load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0;
102 202 users=0;20;50;0
101 203 /=1324MB;6968;7839;0;8710
... ... ...
performance_data представляет собой текстовую строку и имеет следующий формат:
'label1'=value[UOM];[warn];[crit];[min];[max]; пробел 'label2'=value[UOM];[warn];[crit];[min];[max]; ...
UOM - единица измерения
лейблов может быть от 1 до, к примеру, 10
Нужно распарсить эти строки и получить следующую выборку
param_id host_id service_id label value warn crit min max
01 101 201 load1 0.000 5.000 10.000 0
02 101 201 load5 0.000 4.000 6.000 0
03 101 201 load15 0.000 3.000 4.000 0
04 102 202 users 0 20 50 0
05 101 203 / 1324 6968 7839 0 8710
... и т.д.
Итого нужно:
1. Разбить performance_data на строки (разделитель пробел), сформировать из них столбец
2. Разбить каждую строку на столбцы label, value, warn, crit, min, max, (разделители ; и = ) и отрезать единицу измерения, если она есть
3. Пронумеровать строки (присвоить уникальный ключ) - param_id - что-то наподобие row_number в Oracle
Неактивен
Нужно создать новую таблицу с новой структурой и переливать туда данные в новом формате.
Переливать по принципу INSERT INTO ... SELECT
load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0;
Распарсить эту гадость можно с помощью функций REPLACE и SUBSTRING_INDEX
Если не справитесь, напишите.
Неактивен
evgeny, спасибо! SUBSTRING_INDEX мне помог чтобы разбить один лейбл на стобцы
вот что получилось (вместо users=0;20;50;0 соответственно любая строка из perfomance_data):
select substring_index(concat(replace('users=0;20;50;0','=',';'),';'),';',1) as label,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',2),';',-1) as value,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',3),';',-1) as warn,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',4),';',-1) as crit,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',5),';',-1) as min,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',6),';',-1) as max
но вот задача как разбить вот это load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0; на 3 разных строки осталась... и я ума не приложу что с этим делать
Неактивен
по поводу создания новой таблицы, можно ли сделать ее динамической?
чтобы запрос выполнялся по заданному расписанию и обновлял значение value, а также добавлял новые строки для лейблов, если они появляются в исходных таблицах?
Неактивен
по поводу создания новой таблицы, можно ли сделать ее динамической?
чтобы запрос выполнялся по заданному расписанию и обновлял значение value, а также добавлял новые строки для лейблов, если они появляются в исходных таблицах?
Угу
но вот задача как разбить вот это load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0; на 3 разных строки осталась... и я ума не приложу что с этим делать
Ну что тут делать ... Перепарсивать ещё раз, по второму кругу.
Резать по словам load
А вообще если сильно замaрачиваетесь, то наверно проще сделать STORE PROCEDURE
Неактивен
Страниц: 1