Home / Community / Blog

My ESP8266 devices are generating huge amount of logs so after some time LogAnalyzer database had over 5M records.

I've decided to delete old data, but before run purge script I want to backup these records.

The solution was quite simple:

mysqldump Syslog SystemEvents --where \
'FromHost LIKE "ESP" AND DATE(ReceivedAt) < "2018-01-01"' \
> /data/Dokumenty/Syslog-ESP-2017.sql

where Syslog is database, and SystemEvents is table.

You can also export to CSV (TSV) format if You prefer:

mysql -e "SELECT * FROM SystemEvents \
WHERE FromHost LIKE 'ESP' AND DATE(ReceivedAt) < '2018-01-01' \
INTO OUTFILE '/data/Dokumenty/Syslog-ESP-2017.csv' \
FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' \
LINES TERMINATED BY '\n'" Syslog

After this I could delete whole year, instead of using script:

mysql -e "DELETE FROM SystemEvents \
WHERE FromHost LIKE "ESP" AND DATE(ReceivedAt) < '2018-01-01'" \
Syslog

Now I've only about 600k records ;-)

If you want to visualise database structure you can use reverse engineering, i.e. SchemaSpy Graphical Database Schema Metadata Browser or mysqlviz (for MySQL only). SchemaSpy is written in Java and support several types of databases, mysqlviz is in PHP. Both use Graphviz which you have to install separately.

There is a GUI for SchemaSpy - SchemaSpyGUI. To work with MySQL you need MySQL Connector/J - it's a little bit tricky because it's install in x86 patch even if you install 64 bit version of MySQL - at least in MS Windows.

In my case "Patch to DB driver" looks like this:

C:\Program Files (x86)\MySQL\Connector J 5.1.28\mysql-connector-java-5.1.28-bin.jar

The output is browsable "web page" about structure of analysed database.

Mysqlviz is simple PHP script - you have to prepare database dump in special format - special means different than generated by MySQL Workbench. You have to omit schema in dump (it is simple option in export options), but you have also check if CONSTRAINT are in single line. Dump generated by Workbench divide it into few lines. So you have to (I did it manually but I would prefer sed/awk) change this:

  CONSTRAINT `categories_ibfk_1`
    FOREIGN KEY (`parent_id`)
    REFERENCES `categories` (`category_id`)
    ON DELETE SET NULL
    ON UPDATE CASCADE,

into (long) single-line entry:

CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`category_id`) ON DELETE SET NULL ON UPDATE CASCADE

then you can generate DOT file:

./mysqlviz -f model.sql > output.dot

and open created in Graphviz.

Szukając narzędzi do projektowania baz w PostgreSQL'u natknąłem się na program do tworzenia aplikacji WaveMaker.

Wygląda przyzwoicie i jest OpenSource. Standardowo działa także z bazą PostgreSQL. Nie mam teraz czasu mu się dokładnie przyjrzeć i potestować, ale może kiedyś się przyda.

Dawno tego nie robiłem, więc już zapomniałem co począć ze świeżo zaistalowanym serwerem PostgreSQL'a. To to pokolei:

  • inicjuję bazę

    /etc/init.d/postgresql initdb
    
  • podłączam się do bazy

    su - postgres -c psql template1
    

    taka konstrukacja to dla tego, że użytkownik root nie ma dostępu do bazy

  • zakładam użytkowninka

    CREATE USER firstuser;
    
  • ustawiam mu hasło

    ALTER USER firstuser PASSWORD 'jegohaslo';
    
  • zakładam bazę

    CREATE DATABASE firstdb WITH OWNER firstuser \
                                TEMPLATE template0 \
                                LC_COLLATE 'pl_PL.UTF-8' \
                                LC_CTYPE 'pl_PL.UTF-8';

Zamiast tworzyć użytkowników i bazy z poziomu użytkownika postgres można zmienić w pliku /var/lib/pgsql/data/pg_hba.conf metodę autoryzacji z ident na trust w wierszu

host    all         all         127.0.0.1/32          ident

,ale to rozwiązanie nie jest bezpieczne, bo autoryzuje każdego użytkownika podłączającego się lokalnie. Docelowo można zmienić metodę autoryzacji na md5.

Żeby wymusić połączenie po IP a nie po gniazdach (ang. socket) można dodać parametr -h localhost.

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31