🐬 MariaDB / MySQL

MariaDB / MySQL w AIS

image

:warning: Opis ten ma charakter edukacyjny
Podobnie jak w przypadku Node-RED, PostgreSQL, InfluxDB i innych rzeczy, które można instalować na bramce, nie jest to coś, co w AI-Speaker rekomendujemy czy wspieramy.
Jeśli instalujesz bazę danych na bramce to pamiętaj, że jesteś jej administratorem i sam dbasz o ilość danych które są generowane w Twoim systemie i zapisywane w Twojej bazie.

Historia MariaDB

MariaDB to fork(kopia kodu) MySQL.

Michael Monty Widenius (założyciel MySQL) zdecydował się na fork MySQL i stworzenie dla niego firmy o nazwie Monty Program AB. Po tym jak MySQL został przejęty przez Sun Microsystems w 2008 roku. Następnie Oracle nabył Sun Microsystems w 2010 roku wraz z MySQL.

Tak narodziła się MariaDB (Maria to imię drugiej córki Michaela Monty Wideniusa).

W grudniu 2012 r. utworzono fundację MariaDB, aby uniknąć przejęcia firmy, jak miało to miejsce w przeszłości w przypadku MySQL.

MariaDB ma nowe interesujące funkcje: lepsze testowanie, ulepszenia wydajności i poprawki błędów, które nie są dostępne w MySQL. Wiele optymalizacji w MariaDB pochodzi z firm które używają tej bazy - z Google, Facebooka, Twittera i tak dalej.

Instalacja MariaDB na bramce AIS

Binarkę MariaDB mamy w naszym repozytorium apt, instalacja sprowadza się do wykonania w konsoli komendy:

apt install mariadb

Uruchomienie bazy MariaDB jako usługi

Za każdym razem, gdy chcemy uzyskać dostęp do bazy danych MySQL ręcznie za pomocą wiersza poleceń lub za pomocą jakiegoś programu (aplikacji internetowej), musimy uruchomić serwer MySQL poleceniem:

mysqld_safe

Zatrzymanie bazy

jeżeli uruchomiliśmy serwer w konsoli poleceniem mysqld_safe to żeby go zatrzymać możemy zabić proces bazy danych poleceniem:

killall mysqld mysqld_safe

następnie odczekać 10 sekund i upewnić się, że proces nie działa w tle, polecniem:

ps aux | grep mysqld

jeżeli nadal będzie widać więcej procesów niż tylko jedna linijka ( uruchomienie powyższej komendy) to możemy do polecenia killall dodać flagę -9 to powinno zatrzymać proces bazy:

killall -9 mysqld mysqld_safe*

Uruchomienie bazy MariaDB jako usługi

Żeby serwer MySQL był automatycznie uruchamiany podczas startu systemu dodamy skrypt uruchamiający do managera procesów PM2.

Tworzymy najpierw w folderze AIS plik/skrypt bash uruchamiający bazę:

nano ~/AIS/start_mysql_db.sh

w pliku dodajemy ma takie dwie linijki:

echo "Start Bazy Danych"
mysqld_safe

następnie dodajemy uprawnienie do uruchamiania tego pliku, komendą

chmod +x ~/AIS/start_mysql_db.sh

Żeby serwer MySQL był automatycznie uruchamiany podczas startu systemu dodajemy skrypt uruchamiający do managera procesów PM2:

pm2 start ~/AIS/start_mysql_db.sh --name mysql --output  /dev/null --error  /dev/null --restart-delay=150000

następnie zapisujemy stan procesów poleceniem:

pm2 save

Tworzenie nowej bazy

Teraz dodamy nową bazę, nowego użytkownika i temu nowemu użytkownikowi nadamy pełny dostęp do tej nowej bazy.
W tym celu na początek logujemy się do serwera bazodanowego na swoją nazwą użytkownika w AIS.

Jaką mamy nazwę użytkownika w systemie Linux można sprawdzić komendą:

id -un 

albo

whoami

Czyli logujemy się taką komendą:

mysql -u $(whoami)

Po zalogowaniu się do serwera MySQL tworzymy nową bazę z odpowiednim kodowaniem, poleceniem:

CREATE DATABASE ha CHARACTER SET utf8;

następnie dodajemy nowego użytkownika bazodanowego:

CREATE USER 'ais'@'localhost' IDENTIFIED  BY 'dom';

i nadajemy mu uprawnienia do bazy ha:

GRANT ALL PRIVILEGES ON ha.* TO 'ais'@'localhost';

robimy exit i kontrolnie logujemy się do nowej bazy ha już jako użytkownik ais z hasłem dom:

mysql -h 127.0.0.1 -u ais -pdom ha

Włączenie zapisu zdarzeń do lokalnej bazy MySQL

Instalujemy jeszcze pakiet pythona do komunikacji z bazą MySQL / MariaDB:

pip install pymysql

Teraz w aplikacji możemy skonfigurować bazę na bramce jako bazę do zapisu zdarzeń:

Oczywiście lepiej nie przesadzać z ilością dni - szczególnie na bramkach DEV1.

Żeby system przełączył się na zapis do nowej bazy restartujemy proces ais:

pm2 restart ais

Po ponownym uruchomieniu procesu ais w bazie zostaną utworzone tabele do których system będzie zapisywał zdarzenia.
Możemy to sprawdzić, łączymy się do bazy:

mysql -h 127.0.0.1 -u ais -pdom ha

i uruchamiamy komendę:

SHOW TABLES;

zmieniamy jeszcze kodowanie tabel żeby nie było problemu z polskimi znakami:

ALTER TABLE states CONVERT TO CHARACTER SET utf8;
ALTER TABLE events CONVERT TO CHARACTER SET utf8; 

Możemy też sprawdzić ile mamy rekordów w tabelach itd…

3 polubienia

Witam. Jak ustawić zapis bazy na dysku USB?

Dziękuję, to rozwiało moje wątpliwość co do nazewnictwa bazy danych.

u mnie po zainstalowaniu na nowej bramce dev3 termux

~ $ apt install mariadb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  mariadb
0 upgraded, 1 newly installed, 0 to remove and 110 not upgraded.
Need to get 0 B/11.8 MB of archives.
After this operation, 164 MB of additional disk space will be used.
Selecting previously unselected package mariadb.
(Reading database ... 29324 files and directories currently installed.)
Preparing to unpack .../mariadb_2%3a10.10.2_arm.deb ...
Unpacking mariadb (2:10.10.2) ...
Setting up mariadb (2:10.10.2) ...
Initializing mysql data directory...
Installing MariaDB/MySQL system tables in '/data/data/com.termux/files/usr/var/lib/mysql' ...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system


PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following command:

'/data/data/com.termux/files/usr/bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at https://mariadb.com/kb

You can start the MariaDB daemon with:
cd '/data/data/com.termux/files/usr' ; /data/data/com.termux/files/usr/bin/mysqld_safe --datadir='/data/data/com.termux/files/usr/var/lib/mysql'

You can test the MariaDB daemon with mysql-test-run.pl
cd '/data/data/com.termux/files/usr/mysql-test' ; perl mysql-test-run.pl

Please report any problems at https://mariadb.org/jira

The latest information about MariaDB is available at https://mariadb.org/.

Consider joining MariaDB's strong and vibrant community:
https://mariadb.org/get-involved/

~ $ nano ~/AIS/start_mysql_db.sh
~ $ chmod +x ~/AIS/start_mysql_db.sh
~ $ pm2 start ~/AIS/start_mysql_db.sh --name mysql --output  /dev/null --error  /dev/null --restart-delay=150000
[PM2] Starting /data/data/com.termux/files/home/AIS/start_mysql_db.sh in fork_mode (1 instance)
[PM2] Done.

próba konfiguracji kończy się chyba niepowodzeniem

~ $ whoami
u0_a58
~ $ mysql -u $(whoami)
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.10.2-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE ha CHARACTER SET utf8;
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ha'

czy coś jeszcze powinienem wcześniej wykonać aby móc to uruchomić?

1 polubienie

1


też mam problem po przejściu na binarki termux

1 polubienie

Właśnie zabrałem się za poprawę doświadczeń związanych z historią w AIS. Do tej pory miałem SQLite (memory) i nie byłem zadowolony, wieczne wczytywanie, czasem nieskuteczne, itd.

Zacząłem od bazy SQLite (file). Po włączeniu zapisu samej historii i dziennika, otrzymałem dokładnie tę samą sytuację w powiadomieniach, a w logach wyglądało to np. tak:

The database at ///data/data/com.termux/files/home/dom/dyski-wymienne/dysk_B886-B674/ais.db is corrupt or malformed
Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/homeassistant/components/recorder/util.py", line 270, in validate_sqlite_database
    run_checks_on_open_db(dbpath, conn.cursor())
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/homeassistant/components/recorder/util.py", line 281, in run_checks_on_open_db
    sanity_check_passed = basic_sanity_check(cursor)
  File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/homeassistant/components/recorder/util.py", line 259, in basic_sanity_check
    cursor.execute(f"SELECT * FROM {table} LIMIT 1;")  # nosec # not injection
sqlite3.OperationalError: no such table: states

Niby coś mi się na chwilę udało, jak na tej samej karcie włączyłem zapis logów, ale teraz znowu nie działa. Myślałem, że to coś nie tak z moją kartą SD, ale teraz widzę, że to problem AIS. Będę jeszcze chwilę z tym walczył, ale miło by było, gdyby ktoś oficjalnie się tym zajął.

Z tego co się orientuję to błąd androida, baza danych potrzebuje systemu w który zapisuje uprawnienia super by było ext4 bo ntsf nie do końca się sprawdza. Ja nie zdołałem dowiedzieć jak dodać w AIS obsługę tego systemu plików.

Mam dokładnie to samo, dołączam się do pytania.

MariaDB [(none)]> CREATE DATABASE ha CHARACTER SET utf8;
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ha'
MariaDB [(none)]> CREATE USER 'ais'@'localhost' IDENTIFIED  BY 'dom';
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation

Jak tu ostatnio często bywa, odpowiedziałem sobie sam. Poniżej rozwiązanie dla potomnych.

Wygląda na to, że MariaDB nie pozwala na tworzenie baz byle komu, trzeba być root’em. No to tworzymy użytkownika root:

mysqladmin -u root password 'root password goes here'

Po czym logujemy się jako nowo utworzony użytkownik (i podajemy hasło):

mysql -h localhost -u root -p

Później już wszystko działa zgodnie z instrukcją:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.10.3-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE ha CHARACTER SET utf8;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> CREATE USER 'ais'@'localhost' IDENTIFIED  BY 'dom';
Query OK, 0 rows affected (0.018 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON ha.* TO 'ais'@'localhost';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> exit
Bye

Ale to już w sumie nie jest tak naglący problem, bo wydaje się, że jakimś cudem najnowsza aktualizacja znacznie poprawiła działanie historii i już nie ma problemów z wczytywaniem się jej w interfejsie. Przynajmniej u mnie.

2 polubienia

Czy taka baza danych się nadaje aby na niej postawić jakąś stronę www np w WordPress na dev1 czy trzeba było coś jeszcze doinstalować czy lepiej będzie dev3 bo ma termuxa bo dev1 jest za słaba?