База данных в Home Assistant используется для хранения истории изменения данных с датчиков, истории различных событий объектов и устройств и прочей статистики. Сама конфигурация Home Assistant в БД не хранится. И чем больше в системе устройств и датчиков, чем чаще они отправляют свои данные, тем больше становится размер БД.
Зачем я поставил MariaDB
Home Assistant "из коробки" использует СУБД (систему управления базой данных) SQLite. И долгое время меня этот вопрос вообще не заботил, и я даже не знал, как именно оно устроено. До тех пор, пока Home Assistant не начал работать всё медленнее и медленнее.
Напомню, что я не являюсь специалистом ни в области программирования на каком бы то ни было языке (хотя и немного развлекаюсь этим для своих практических нужд на C++ и C#), ни в области администрирования операционных систем или баз данных. Поэтому, к сожалению, не смогу компетентно сравнить различные СУБД и показать преимущества одних типов перед другими.
В моём конкретном случае задача была практическая и конкретная - ускорить работу Home Assistant. Поиски информации по этой проблеме привели меня к изучению темы БД Home Assistant.
Одной из причин медленной работы умного дома могла быть разросшаяся по размерам база данных. Размер файла home-assistant_v2.db (а SQLite хранит всю базу данных в одном файле) в какой-то момент у меня достиг нескольких гигабайт (я намеренно увеличил время хранения статистики с дефолтных 10-ти до 90 дней), а сам Home Assistant в то время работал ещё на Raspberry Pi3 с обычной картой памяти.
По найденным в сообществе Home Assistant советам я решил перейти с медленной СУБД SQLite на более быструю СУБД - MariaDB, которая является ответвлением от СУБД MySQL.
Так ли это на самом деле, что эти СУБД отличаются по скорости работы, я не знаю. Возможно, что и нет. А может быть и сама постановка вопроса некорректна. Но, вероятно, из-за разной архитектуры хранения данных на носителе эти СУБД отличаются по эффективности при работе с БД большого размера.
Впрочем, все эти размышления и догадки без углублённого изучения матчасти практического смысла не имеют. Главное лишь в том, что переход с SQLite на MariaDB решил проблему медленной работы Home Assistant.
Возможно ли было выполнить корректную миграцию данных с одной БД на другую, я так и не понял, информации по этому вопросу я не нашёл, и в тот момент я потерял всю накопленную с датчиков статистику. База данных начала копиться с нуля. Но когда она достигла тех же значений своего объёма, то Home Assistant продолжал работать так же быстро, как и раньше. Сейчас размер БД у меня составляет около 8 Гб, и никаких проблем со скоростью работы HA я не наблюдаю.
Вторым преимуществом установки MariaDB стала возможность использовать phpMyAdmin - широко известный инструмент администрирования баз данных MySQL через веб-интерфейс, где в ручном режиме с помощью SQL-запросов можно как изучать сохраняемые в БД данные, так и корректировать их. Для SQLite приложения администрирования тоже существуют, но они все слабенькие и не могут быть встроены в Home Assistant. Приходилось делать копию файла home-assistant_v2.db, скачивать его по samba на комп, изучать, корректировать и заливать обратно. Всё это было очень долго и неудобно. А для phpMyAdmin в Home Assistant есть специальное дополнение, которое позволяет администрировать БД на лету:
Подготовка к установке дополнения MariaDB
Ещё раз оговорюсь - я не знаю как корректно выполнить миграцию данных из базы SQLite в базу MariaDB, и возможно ли это вообще, поэтому выполняя мои последующие рекомендации вы однозначно потеряете всю накопленную статистику, и данные начнут копиться заново. Все графики, журнал событий и история окажутся пустыми.
Так как процедура смены типа БД небезопасна и можно всё очень сильно поломать, то перед началом этих действий обязательно сделайте резервную копию системы - меню "Настройки" -> "Система" -> "Резервные копии".
Также не лишним будет отдельно создать копию базы данных - скопировать файл home-assistant_v2.db на свой компьютер, подключившись к Home Assistant по samba, если вы делаете это из под Windows. О том, как установить samba, я рассказывал здесь:
Файл home-assistant_v2.db расположен в папке config:
Установка MariaDB
MariaDB устанавливается в Home Assistant как дополнение. То есть это будет самостоятельное программное обеспечение, не встроенное в ядро Home Assistant. СУБД будет работать рядом с Home Assistant, а Home Assistant будет обращаться уже не к своей локальной базе данных SQLite, а к другой базе данных, расположенной за пределами Home Assistant и не видимой пользователю обычными средствами.
Переходим в магазин дополнений - меню "Настройки" -> "Дополнения" -> кнопка "Магазин дополнений" и находим там MariaDB:
Выбираем его, и нажимаем кнопку "Установить":
Скачивание и установка у меня заняли примерно полторы минуты. Включаем сторожевого пса (опцию Watchdog), чтобы в случае непредвиденного падения дополнения оно рестартовало автоматически:
Переходим на вкладку "Конфигурация", и вместо null задаём пароль к БД, после чего нажимаем кнопку "Сохранить":
Возвращаемся на вкладку "Информация" и нажимаем кнопку "Запустить", если дополнение не стартовало само на предыдущем шаге (у меня стартовало):
Всё, СУБД MariaDB работает. Теперь нужно перенастроить Home Assistant на работу с новой базой данных.
Настройка Home Assistant
Потребуется отредактировать файл configuration.yaml. Это можно сделать с помощью дополнения File Editor, напомню, что рассказывал о его установке здесь:
Добавляем в файл configuration.yaml две строчки:
recorder:
db_url: 'mysql://homeassistant:homeassistant@core-mariadb/homeassistant?charset=utf8mb4'
Сохраняем изменения, проверяем конфигурацию и перезапускаем Home Assistant:
После первого перезапуска у меня новая БД не заработала, возникла ошибка. Первое, что обратило на себя внимание, это отсутствие пунктов меню "История" и "Журнал событий":
А это значит, что встроенная интеграция "recorder", отвечающая за запись данных в БД, не стартовала. Открыв журнал сервера (меню "Настройки" -> "Система" -> "Журнал сервера") я увидел там ожидаемые ошибки:
После чего, зайдя в меню "Настройки" -> "Дополнения" -> "MariaDB", я обнаружил, что дополнение не запущено. Запустил его снова вручную, и ещё раз перезагрузил Home Assistant. После второй перезагрузки все пункты меню вернулись на место, а дополнение стартовало автоматически:
Последующие попытки перезапуска Home Assistant также больше не приводили к проблеме, из чего я делаю вывод о каком-то "сбое первого запуска". С таким явлением мне уже не раз приходилось сталкиваться, когда что-то вновь установленное или перенастроенное начинало работать только после второго перезапуска системы.
На этом всё. Теперь Home Assistant работает с новой базой данных, других настроек для работы MariaDB не требуется. При резервном копировании системы новая база данных, как и прежде, будет автоматически включена в резервную копию, а при восстановлении - восстановлена. Никаких дополнительных действий для этого выполнять не нужно.