UniSet 2.32.1
(DBServer_MySQL) Реализация сервиса ведения БД на основе MySQL

Общее описание работы DBServer_MySQL

Сервис предназначен для работы с БД MySQL. В его задачи входит сохранение всех событий происходящих в системе в БД. К этим событиям относятся изменение состояния датчиков, различные логи работы процессов и т.п. К моменту запуска, подразумевается, что необходимые таблицы уже созданы, все необходимые настройки mysql сделаны.

При работе с БД, сервис в основном пишет в БД. Обработка накопленных данных ведётся уже другими программами (web-интерфейс).
Для повышения надежности DBServer периодически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД. В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer произвести соединение.При этом все запросы которые поступают для записи в БД, но не могут быть записаны складываются в буфер (см. Защита от потери данных).
Предупреждения
При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить новые настройки.

Настройка DBServer

Объект DBServer берёт настройки из конфигурационного файла из секции <LocalDBServer>. Возможно задать следующие параметры:

  • dbname - название БД
  • dbnode - узел БД
  • dbuser - пользователь
  • dbpass - пароль для доступа к БД
  • pingTime - период проверки связи с сервером MySQL
  • reconnectTime - время повторной попытки соединения с БД

Защита от потери данных

Для того, чтобы на момент отсутствия связи с БД данные по возможности не потерялись, сделан "кольцевой" буфер. Размер которого можно регулировать параметром "--dbserver-buffer-size" или параметром bufferSize=".." в конфигурационном файле секции "<LocalDBSErver...>".

Механизм построен на том, что если связь с mysql сервером отсутствует или пропала, то сообщения помещаются в нулевой буфер, который "опустошается" как только она восстановится. Если связь не восстановилась, а буфер достиг максимального заданного размера, то удаляются более ранние сообщения. Эту логику можно сменить, если указать параметр "--dbserver-buffer-last-remove" или bufferLastRemove="1", то теряться будут сообщения добавляемые в конец.

Таблицы MySQL

К основным таблицам относятся следующие:

DROP TABLE IF EXISTS `main_history`;
CREATE TABLE `main_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`sensor_id` int(10) unsigned NOT NULL,
`value` double NOT NULL,
`node` int(10) unsigned NOT NULL,
`confirm` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `main_history_sensor_id` (`sensor_id`),
CONSTRAINT `sensor_id_refs_id_3d679168` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `main_emergencylog`;
CREATE TABLE `main_emergencylog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`type_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `main_emergencylog_type_id` (`type_id`),
CONSTRAINT `type_id_refs_id_a3133ca` FOREIGN KEY (`type_id`) REFERENCES `main_emergencytype` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `main_emergencyrecords`;
CREATE TABLE `main_emergencyrecords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`log_id` int(11) NOT NULL,
`sensor_id` int(10) unsigned NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
KEY `main_emergencyrecords_log_id` (`log_id`),
KEY `main_emergencyrecords_sensor_id` (`sensor_id`),
CONSTRAINT `log_id_refs_id_77a37ea9` FOREIGN KEY (`log_id`) REFERENCES `main_emergencylog` (`id`),
CONSTRAINT `sensor_id_refs_id_436bab5e` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `main_messages`;
CREATE TABLE `main_messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`text` text NOT NULL,
`node` int(10) unsigned NOT NULL,
`confirm` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `main_messages_key` (date,time,node)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Предупреждения
Временно, для обратной совместимости поле 'time_usec' в таблицах оставлено с таким названием, хотя фактически туда сейчас сохраняется значение в наносекундах!