Home Assistant Database MySQL vs. SQLite
Home Assistant uses SQLite as a database. In SQLite all data is stored in a simple file: home-assistant_v2.db. I had no problems with the database so far and I am very satisfied with the performance of Home Assistant. Nevertheless I wanted to try a MySQL database, because at least theoretically MySQL could achieve a better performance. In practice, however, I could not notice any difference. According to the manufacturer's page, SQLite is even recommended:
The default, and recommended, database engine is SQLite which does not require any configuration.
Source: www.home-assistant.io/integrations/recorder/
For a direct access to the SQLite database, see also: Home Assistant SQlite - Change statistics data
If you still want to use MySQL, you can adjust the configuration as follows:
docker-compose.yml
version: "3"
services:
hass:
image: homeassistant/home-assistant:stable
container_name: home-assistant
depends_on:
- deconz
- mysql
environment:
VIRTUAL_HOST: 'ha.domain.tld'
VIRTUAL_PORT: '80'
LETSENCRYPT_HOST: 'ha.domain.tld'
LETSENCRYPT_EMAIL: 'admin@domain.tld'
restart: always
volumes:
- ./ha:/config
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
expose:
- "80"
ports:
- 8123:80
networks:
- default
- backend
mysql:
image: 'mysql'
container_name: ha-mysql
environment:
MYSQL_ROOT_PASSWORD: 'MyPassword'
MYSQL_DATABASE: 'hass_db'
MYSQL_USER: 'hass_user'
MYSQL_PASSWORD: 'MyPassword'
restart: always
volumes:
- './db:/var/lib/mysql'
- './mysql.cnf:/etc/mysql/conf.d/mysql.cnf'
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
networks:
- backend
deconz:
image: marthoc/deconz
container_name: deconz
environment:
DECONZ_DEVICE: '/dev/ttyACM0'
DECONZ_VNC_MODE: '1'
DECONZ_VNC_PORT: '5900'
DECONZ_VNC_PASSWORD: 'MyPassword4VNC'
restart: always
volumes:
- ./deCONZ/:/root/.local/share/dresden-elektronik/deCONZ
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
devices:
- /dev/ttyACM0
ports:
- 83:80
- 5983:5900
networks:
- backend
networks:
default:
name: webproxy
external: true
backend:
name: smart-home
external: true
configuration.yml
...
recorder:
db_url: mysql://hass_user:myPassword@ha-mysql/hass_db
...
Import existing entries: failed
The following command should import all entries from SQLite to MYSQL:
user@server:/var/homeassistant-Folder$ docker run --rm -it -v $(pwd):/db keinos/sqlite3 sqlite3 /db/home-assistant_v2.db .dump | \
sed -re 's/^PRAGMA .+OFF/SET FOREIGN_KEY_CHECKS=0;SET UNIQUE_CHECKS=0/' \
-e 's/^CREATE INDEX .+//' \
-e 's/^BEGIN TRANSACTION;\r$/SET autocommit=0;BEGIN;/' \
-e '/CREATE TABLE/,/\);/ d' \
-e 's/^INSERT INTO "([^"]+)"/INSERT INTO \1/' \
-e 's/\\n/\n/g' | \
perl -pe 'binmode STDOUT, ":utf8";s/\\u([0-9A-Fa-f]{4})/pack"U*",hex($1)/ge' | \
docker exec -i ha-mysql mysql --default-character-set=utf8 -u hass_user -pMyPassword hass_db
Initially the command aborted relatively quickly, a look into the keinos/sqlite3 container with:
sqlite3 /db/home-assistant_v2.db .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
/**** ERROR: (8) attempt to write a readonly database *****/
ROLLBACK; -- due to errors
Cause: missing write permission in root folder of Home Assistant
ERROR 1451 (23000) at line 1: Cannot delete or update a parent row: a foreign key constraint fails (`hass_db`.`states`, CONSTRAINT `states_ibfk_2` FOREIGN KEY (`old_state_id`) REFERENCES `states` (`state_id`))
docker stop home-assistant
docker exec -it ha-mysql /bin/bash
mysql -uhass_user -pMypwd
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('hass_db');
mysql> SET FOREIGN_KEY_CHECKS = 1;
One step further, I failed because of this error:
ERROR 1062 (23000) at line 7250: Duplicate entry '1193928' for key 'events.PRIMARY'
write /dev/stdout: broken pipe
See also: www.alexsilcock.net/notes/migrating-home-assistant-from-sqlite3-to-mysql-8-0/ and gist.github.com/seidler2547/93012edf3c7a2414ec1d9a8ebbc9c1a6
{{percentage}} % positive