Pull to refresh

Миграция Home Assistant с SQLite на PostgreSQL

Level of difficultyEasy
Reading time4 min
Views2K

Многие начинают знакомство с Home Assistant «как есть» — с минимальными настройками и базой данных SQLite. Это отличный старт, особенно если вы только строите свой умный дом. Но когда система обрастает датчиками, автоматизациями и историей, SQLite начинает тормозить.

Решение — перейти на более производительное хранилище данных, такое как PostgreSQL.

В этой статье покажу, как выполнить миграцию с SQLite на PostgreSQL, сохранив накопленную статистику и избежав ошибок. Всё проверено на Home Assistant 2025.5.

Подготовка и важные моменты

Перед началом обязательно сделайте резервную копию: Настройки → Система → Резервное копирование.

Миграция данных из SQLite

Нам нужна чистая база PostgreSQL. Вы можете арендовать её у хостинг-провайдера или установить локально на сервере, где крутится ваш Home Assistant.

Как развернуть базу — отдельная тема, поэтому здесь считаем, что она уже создана и называется homeassistant.

Для переноса данных воспользуемся утилитой pgloader.

Установка (на Debian/Ubuntu-системах):

$ apt-get install pgloader

Далее создаём файл migrate.load с настройками для миграции, где указываем во from путь до файла нашей SQLite базы, а в into параметры подключения к PostgreSQL базе:

load database
    from sqlite:////var/ha/config/home-assistant_v2.db
    into postgresql://homeassistant_user:MyPassword@myhost.ru:5432/homeassistant

with include drop, create tables, create indexes, reset sequences

set work_mem to '16MB', maintenance_work_mem to '512 MB';

После этого запускаем миграцию:

$ pgloader migrate.load

Процесс может занять несколько минут. В конце вы должны увидеть отчёт об успешной миграции. Проверьте, что в новой базе созданы таблицы.

Для переключения на новую базу, в файл configuration.yaml добавляем настройки подключения, аналогичные как были заданы в настройках миграции.

recorder:
 db_url: postgresql://homeassistant:YouPassWord@127.0.0.1:5432/homeassistant

Перезапустите Home Assistant — он должен начать писать данные в PostgreSQL. Но на этом дело не заканчивается.

Перечисления

Во многих статьях на этом моменте всё заканчивается. Но без одного важного шага Home Assistant начнёт ругаться: появятся ошибки в логах, а в интерфейсе — пустые графики.

Дело в том, что pgloader не создаёт SEQUENCE, которые нужны для автонумерации записей в таблицах. Придётся создать их вручную.

Подключитесь к базе PostgreSQL (через psql или PgAdmin) и выполните следующие запросы:

CREATE SEQUENCE event_data_id_seq;
ALTER TABLE event_data ALTER COLUMN data_id SET DEFAULT nextval('event_data_id_seq');
SELECT setval('event_data_id_seq', COALESCE((SELECT MAX(data_id) FROM event_data), 1), true);

CREATE SEQUENCE events_id_seq;
ALTER TABLE events ALTER COLUMN event_id SET DEFAULT nextval('events_id_seq');
SELECT setval('events_id_seq', COALESCE((SELECT MAX(event_id) FROM events), 1), true);

CREATE SEQUENCE metadata_id_seq;
ALTER TABLE states_meta ALTER COLUMN metadata_id SET DEFAULT nextval('metadata_id_seq');
SELECT setval('metadata_id_seq', COALESCE((SELECT MAX(metadata_id) FROM states_meta), 1), true);

CREATE SEQUENCE recorder_runs_id_seq;
ALTER TABLE recorder_runs ALTER COLUMN run_id SET DEFAULT nextval('recorder_runs_id_seq');
SELECT setval('recorder_runs_id_seq', COALESCE((SELECT MAX(run_id) FROM recorder_runs), 1), true);

CREATE SEQUENCE schema_changes_id_seq;
ALTER TABLE schema_changes ALTER COLUMN change_id SET DEFAULT nextval('schema_changes_id_seq');
SELECT setval('schema_changes_id_seq', COALESCE((SELECT MAX(change_id) FROM schema_changes), 1), true);

CREATE SEQUENCE state_attributes_id_seq;
ALTER TABLE state_attributes ALTER COLUMN attributes_id SET DEFAULT nextval('state_attributes_id_seq');
SELECT setval('state_attributes_id_seq', COALESCE((SELECT MAX(attributes_id) FROM state_attributes), 1), true);

CREATE SEQUENCE states_id_seq;
ALTER TABLE states ALTER COLUMN state_id SET DEFAULT nextval('states_id_seq');
SELECT setval('states_id_seq', COALESCE((SELECT MAX(state_id) FROM states), 1), true);

CREATE SEQUENCE statistics_id_seq;
ALTER TABLE statistics ALTER COLUMN id SET DEFAULT nextval('statistics_id_seq');
SELECT setval('statistics_id_seq', COALESCE((SELECT MAX(id) FROM statistics), 1), true);

CREATE SEQUENCE statistics_meta_id_seq;
ALTER TABLE statistics_meta ALTER COLUMN id SET DEFAULT nextval('statistics_meta_id_seq');
SELECT setval('statistics_meta_id_seq', COALESCE((SELECT MAX(id) FROM statistics_meta), 1), true);

CREATE SEQUENCE statistics_runs_id_seq;
ALTER TABLE statistics_runs ALTER COLUMN run_id SET DEFAULT nextval('statistics_runs_id_seq');
SELECT setval('statistics_runs_id_seq', COALESCE((SELECT MAX(run_id) FROM statistics_runs), 1), true);

CREATE SEQUENCE statistics_short_term_id_seq;
ALTER TABLE statistics_short_term ALTER COLUMN id SET DEFAULT nextval('statistics_short_term_id_seq');
SELECT setval('statistics_short_term_id_seq', COALESCE((SELECT MAX(id) FROM statistics_short_term), 1), true);

Эти команды создают все необходимые SEQUENCE, чтобы Home Assistant мог корректно продолжать работу с базой: добавлять события, состояния и статистику.

Итог

Теперь ваш Home Assistant работает с PostgreSQL, а это значит:

  • более высокая производительность;

  • стабильность при длительной работе;

  • меньше проблем с повреждением базы;

  • возможность удалённого доступа к данным.

Если вы всерьёз занимаетесь умным домом, такая миграция — шаг к стабильной и надёжной системе. А SQLite... пусть остаётся для тестов 😉.

Tags:
Hubs:
0
Comments4

Articles