Модуль <MySQL> надає до системи OpenSCADA підтримку БД MySQL. БД MySQL є потужною реляційною та багатоплатформеною БД, доступною за вільною ліцензією. Чинним розробником БД MySQL є Корпорація Oracle. Повністю вільною реалізацією MySQL є проект MariaDB. Модуль засновано на бібліотеці API БД MySQL на мові "С". Модуль дозволяє виконувати дії над базами даних, таблицями та вмістом таблиць.
1. Операції над БД
Підтримуються операції відкриття та закриття БД з можливістю створення нової БД при відкритті та видалення існуючої при закритті. У термінах підсистеми "БД" системи OpenSCADA відкриттям БД є її реєстрація для подальшого використання у системі. Також підтримується операція запиту переліку таблиць у БД.
БД MySQL адресується рядком наступного типу: "{host};{user};{pass};{db};{port}[;{u_sock}[;{charset-collation}[;{tms}]]]". Де:
host — ім'я хосту на якому працює сервер БД MySQL;
user — ім'я користувача БД;
pass — пароль користувача для доступу до БД;
bd — ім'я БД;
port — порт, який слухає сервер БД (по замовченню 3306);
u_sock — ім'я UNIX-сокету у випадку локального доступу до БД (/var/lib/mysql/mysql.sock);
tms — таймаути MySQL у форматі "{connect},{read},{write}" та секундах.
У випадку локального доступу до БД, у межах одного хосту, треба використовувати UNIX сокет. Наприклад: ";roman;123456;OpenSCADA;;/var/lib/mysql/mysql.sock;utf8-utf8_general_ci-MyISAM;5,2,2"
У випадку віддаленого доступу до БД треба використовувати ім'я хосту та порт серверу БД. Наприклад: "server.nm.org;roman;123456;OpenSCADA;3306"
2. Операції над таблицею
Підтримуються операції відкриття, закриття таблиці з можливістю створення нової таблиці при відкритті та видалені існуючої при закритті, а також запит структури таблиці.
3. Операції над вмістом таблиці
сканування записів таблиці;
запит значень вказаних записів;
встановлення значень вказаних записів;
видалення записів.
API підсистеми "БД" надає доступ до вмісту таблиці за значенням ключового(их) поля(ей). Так, операція запиту запису передбачає попереднє встановлення ключових стовпчиків об'єкту TConfig, за якими буде здійснено запит. Створення нового запису(рядка) здійснюється операцією встановлення значень запису, які відсутні.
Модуль дозволяє динамічно змінювати структуру таблиць БД MySQL. Так, у випадку невідповідності структури таблиці та структури запису що встановлюється, структуру таблиці буде приведено до потрібної структури запису. У випадку запиту значень запису та невідповідності структур записи та таблиці, буде отримано тільки значення загальних елементів запису та таблиці. Модуль не відстежує послідовності розташування елементів у запису та структурі таблиці.
Модулем реалізується механізм підтримки багатомовних текстових змінних. Для полів з багатомовною текстовою змінною створюються стовпчики окремих мов у форматі <lang>#<FldID> (en#NAME). При цьому базовий стовпчик містить значення для базової мови. Стовпчики окремих мов створюються за потреби, у момент збереження до БД та при виконанні OpenSCADA у відповідній локалі. У випадку відсутності значення для конкретної мови буде використано значення для базової мови.
Типи елементів БД MySQL наступним чином відповідають типам елементів системи OpenSCADA:
Типи полів системи OpenSCADA
Типи полів БД MySQL
TFld::String
char(n), text, mediumtext
TFld::Integer
int(n), DATETIME [для полів з ознакою TFld::DateTimeDec]
TFld::Real
double(n,m)
TFld::Boolean
tinyint(1)
4. Доступ до БД
БД MySQL містить потужний механізм розподілу доступу, який полягає у вибірковому зазначені доступу користувача БД до окремих SQL-команд. У таблиці нижче перелічено операції над БД та потрібний доступ до команд для цих операцій.
Операція
SQL-команди
Створення БД та таблиць
CREATE
Видалення БД та таблиць
DROP
Додання записів
INSERT
Видалення записів
DELETE
Отримання значень записів
SELECT
Встановлення значень записів
UPDATE
Маніпуляція структурою таблиці
ALTER
Коротко розглянемо процедуру первинного налаштування серверу MySQL з метою підключення до нього за допомогою цього модуля:
Встановлення серверу СУБД MySQL у вигляді пакету або збірки.
Запуск серверу БД, якщо не запустився одразу:
$ service mysqld start
Встановлюємо потрібний пароль для системного користувача "root":
$ mysqladmin -u root password '123456'
Підключаємося до серверу БД локально за допомогою даного модуля, ввівши адресу БД: "localhost;root;123456;test;;;utf8"
Дозволяємо зовнішній доступ:
my.cnf: Змінюємо значення "bind-address" на "0.0.0.0" для доступу з усіх інтерфейсів.
Підключаємося до СУБД локально, для управління користувачами "$ mysql -u root -p":
Отримуємо перелік користувачів: "SELECT Host,User,Password FROM mysql.user;"
Додаємо користувача: "CREATE USER 'newuser'@'%' IDENTIFIED BY 'password';"
Видаляємо користувача: "DROP USER 'newuser'@'%’;"
Змінюємо пароль: "UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='newuser';
Встановлюємо користувачу всі права: "GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%';"
Приймаємо привілеї: "FLUSH PRIVILEGES;"
5. Продуктивність БД
Вимірювання продуктивності БД здійснювалося тестом "БД" модуля системних тестів "SystemTests", шляхом виконання операцій над записами структурою: <name char (20), descr char (50), val double (10.2), id int (7), stat bool, reqKey string, reqVal string>.