MySQL MySQL Risiken bei Stromausfall minimieren

Hallo zusammen!

Bin aktuell mit mit einem Hausautomations-System beschäftigt, wo u.A. MySQL eingesetzt wird. Nun ist es so, dass dieses nicht auf einem “normalen” Computer läuft sondern auf einem embedded-System. Und dort läuft Linux (auf ext4) sowie MySQL (InnoDB) drauf.

Frage: Wie lässt sich das Risiko minimieren falls der Anwender dem Gerät den Strom entfernt? Es ist dabei nicht vorgesehen dass man einen Zugriff auf das Linux-System hat - weder über “normale” Ein- und Ausgabemöglichkeiten wie Tastatur und Bildschirm (hat sowieso kein Desktop, die Maus ist nicht mal für die Entwickler ein Thema) noch über SSH.

Zwar ist es vorgesehen dass im Web-GUI (für die Administration) ein Button zum Herunterfahren drin sein soll, aber was ist wenn das Gerät “einfach so” vom Stromnetz getrennt wird?

Welche MySQL-Optionen hätte man dafür, um ein solches Risiko möglichst klein zu halten? Mir ist natürlich klar, dass relationale Datenbanken grundsätzlich nicht dafür geeignet sind - insbesondere dann wenn oft geschrieben, und nicht nur hauptsächlich gelesen wird.

  • Alle DB-Operationen welche aus mehreren Schritten nacheinander bestehen als Transaktion auszuführen. Aber was passiert dann, angenommen der Strom wird zwischen mehrerern SQL-Anweisungen in der Art lesen/ändern/löschen gekappt? Ich gehe von einem Rollback aus nach einem Stromausfall, und nicht von einer erneuten Ausführung der ganzen Transaktion?

  • Welche InnoDB-Optionen könnte man zwecks Risiko-Minimierung (NICHT “Verhinderung”) anpassen? https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html

  • Ich habe mir überlegt, sämtliche Caching-Features für InnoDB auszuschalten, aber so einfach ist das leider nicht. Z.B. Macht das Ausschalten der Option “innodb_doublewrite” das Problem nur noch grösser - kann offenbar sogar zum Problem werden wenn das System noch mit Strom versorgt wird. -> https://dba.stackexchange.com/quest...-safe-to-disable-innodb-doublewrite-buffering-> “Only if data are not important. Disabling double write buffer not only breaks ACID compliance, but also can (and eventually will) corrupt InnoDB tablespace”
(Natürlich muss dabei in der Doku für den Endbenutzer ausdrücklich darauf hingewiesen werden dass man UNBEDINGT das System per Web-GUI herunterfahren muss!!)

Danke für eure Tipps!

Mit freundlichen Grüssen,
Jan
 

temi

Top Contributor
Sorry, zur eigentlichen Frage kann ich leider nichts beitragen, aber meiner Ansicht nach, wäre es eine sinnvolle Lösung einen Stromausfall hardwaretechnisch zu erkennen und z.B. über einen Akku oder Goldcap zu puffern, so dass das System in einen sicheren Zustand gebracht werden kann.
 

looparda

Top Contributor
Ich denke im Datenbank-Forum deiner Wahl kommst du besser an Expertenwissen, gerade weil es um die spezielle Konfiguration und das Verhalten der Datenbank geht und nicht wirklich um die Programmierung.
 

mihe7

Top Contributor
Mir ist natürlich klar, dass relationale Datenbanken grundsätzlich nicht dafür geeignet sind
?!?

Alle DB-Operationen welche aus mehreren Schritten nacheinander bestehen als Transaktion auszuführen.
Grundsätzlich finden alle (DML) Statements im Rahmen einer Transaktion statt. Beim "autocommit" wird nach jedem Statement automatisch ein Commit ausgeführt.

Aber was passiert dann, angenommen der Strom wird zwischen mehrerern SQL-Anweisungen in der Art lesen/ändern/löschen gekappt?
Transaktionen sind atomar. Wurden sie erfolgreich abgeschlossen wurden, dann sind die Änderungen dauerhaft gespeichert. Werden sie nicht erfolgreich abgeschlossen, dann sind die Änderungen praktisch nicht existent.

Dabei ist "dauerhaft gespeichert" mit etwas Vorsicht zu genießen, weil man es vom Standpunkt des DBMS aus betrachten muss. Wenn ein anderer Bestandteil des Systems (OS/Hardware) meldet, dass die Daten geschrieben seien obwohl dies nicht der Fall ist, dann kann das DBMS natürlich nichts dagegen tun.

Ich habe mir überlegt, sämtliche Caching-Features für InnoDB auszuschalten
Wozu?

Z.B. Macht das Ausschalten der Option “innodb_doublewrite” das Problem nur noch grösser - kann offenbar sogar zum Problem werden wenn das System noch mit Strom versorgt wird.
Soweit ich das verstehe:

Der doublewrite-Buffer ist kein in-memory-Cache zum verzögerten Schreiben sondern ein persistenter Zwischenspeicher für das Crash-Recovery.

Während einer Transaktion werden die Änderungen im Redo- bzw. Undo-Log protokolliert. Spätestens beim Commit werden die Log-Files geschrieben.

Die im Redo-Log festgehaltenen Änderungen werden auf die Seiten der Datendateien übertragen. Eine Seite der Datendatei kann in der Regel nicht atomar geschrieben werden, d. h. es wäre z. B. beim Stromausfall möglich, dass nur ein Teil einer Seite geschrieben wird und somit inkonsistent würde. Daher fügt MySQL die geänderten Seiten erst einmal zum doublewrite-Buffer hinzu. Nachdem dieser weggeschrieben (inkl. sync) wurde, werden die Seiten in die Datendateien übertragen. Wird mysql dabei unerwartet beendet (z. B. Stromausfall) können auch unvollständig geschriebene Seiten dem doublewrite-Buffer entnommen werden. Sind die Daten in der Datendatei wird das Redo-Log korrigiert.

Standardeinstellungen dürften auf größtmögliche ACID-Kompatibilität ausgelegt sein, recht viel mehr wird nicht gehen.
 

JuKu

Top Contributor
@mihe7 hat eig. schon fast alles gesagt.
Grundsätzlich: Du machst dir zu viele Gedanken über Probleme, die so eig. gar nicht relevant sind.
Darüber haben sich schon viele Datenbank Engineers vor dir Gedanken gemacht und entsprechende Technologien entwickelt. z.B. liest MySQL beim Start die Logs ein und kann sich so in gewisser Hinsicht selbst reparieren, falls es notwendig sein sollte.
Mit Transaktionen bist du immer auf der sicheren Seite, da erst beim Abschluss (commit) wirklich persistent gespeichert wird --> entweder werden die Daten vollständig geschrieben, oder gar nicht. Ein teilweises Schreiben gibt es normalerweise nicht und falls doch, merkt das MySQL dank der Logs normalerweise beim nächsten Start und korrigiert dies entsprechend / führt einen rollback aus.
 
@mihe7:

"?!?"

Ich habe die Sache ursprünglich nicht konzipiert, erst als ich in diesem Projekt angestellt wurde habe ich das hinterfragt. Deshalb meine Beiträge...


"Grundsätzlich finden alle (DML) Statements im Rahmen einer Transaktion statt. Beim "autocommit" wird nach jedem Statement automatisch ein Commit ausgeführt."

Es geht mir darum, wenn es einen Stromausfall gibt bei einem Statement mit mehreren delete, update und/oder insert-Anweisungen. Dann all diese besser innerhalb EINER Transaktion ausführen...


"Wozu?"

Weil ich geadacht habe, dass sich der Schreibcache evtl. ausschalten lässt und es so sicherer wird. Aber wie bereits erwähnt, die einzige Sache welche man diesbezüglich ändern (deaktivieren) kann ist "innodb_doublewrite" - und das macht es noch unsicherer: https://dba.stackexchange.com/quest...-safe-to-disable-innodb-doublewrite-buffering ("Only if data are not important. Disabling double write buffer not only breaks ACID compliance, but also can (and eventually will) corrupt InnoDB tablespace")

"Der doublewrite-Buffer ist kein in-memory-Cache zum verzögerten Schreiben sondern ein persistenter Zwischenspeicher für das Crash-Recovery."

"Standardeinstellungen dürften auf größtmögliche ACID-Kompatibilität ausgelegt sein, recht viel mehr wird nicht gehen."

Vielen Dank!
 
@JuKu:

"Grundsätzlich: Du machst dir zu viele Gedanken über Probleme, die so eig. gar nicht relevant sind.
Darüber haben sich schon viele Datenbank Engineers vor dir Gedanken gemacht und entsprechende Technologien entwickelt. z.B. liest MySQL beim Start die Logs ein und kann sich so in gewisser Hinsicht selbst reparieren, falls es notwendig sein sollte.
Mit Transaktionen bist du immer auf der sicheren Seite, da erst beim Abschluss (commit) wirklich persistent gespeichert wird --> entweder werden die Daten vollständig geschrieben, oder gar nicht. Ein teilweises Schreiben gibt es normalerweise nicht und falls doch, merkt das MySQL dank der Logs normalerweise beim nächsten Start und korrigiert dies entsprechend / führt einen rollback aus."


Dir ebenfalls vielen Dank!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
Juelin MySQL Datenbankmit glassfish und Netbeans Datenbankprogrammierung 18
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
M MySQL Datenbank in Array Datenbankprogrammierung 2
P MySQL- Neues Passwort Datenbankprogrammierung 1
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
sserio SQL oder MySQL Datenbankprogrammierung 44
OnDemand Mysql Query Builder Datenbankprogrammierung 1
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
OnDemand MySql Foreign Key nötig oder unnötig Datenbankprogrammierung 3
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
OnDemand MySQL und mongoDB wann macht was Sinn? Datenbankprogrammierung 11
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
D MYSQL goorm IDE - Wie speichern? Datenbankprogrammierung 0
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
J MySQL - Primary Key Date,Time vs ID Datenbankprogrammierung 16
ruutaiokwu MySQL: Messwerte, welche stagnieren interpolieren? Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
D MySQL Zeilen kumulieren Datenbankprogrammierung 8
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
K Servlet-MySQL DB Datenbankprogrammierung 2
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
D Datumsformat aus MySQL ändern Datenbankprogrammierung 15
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K MySQL LAN-MySQL Server mit XAMPP Datenbankprogrammierung 2
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
X MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern? Datenbankprogrammierung 9
K Anfängerfrage CSV in MySQL Datenbankprogrammierung 41
I MySQL Wert nachträglich bearbeiten Datenbankprogrammierung 1
N MySQL Datenbank lokal Datenbankprogrammierung 3
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
B MySQL installieren - silent / User anlegen Datenbankprogrammierung 3
X MySQL Verbindungdsaufbau MySql auf Ubuntu-Server Datenbankprogrammierung 10
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
M MySQL MySQL DATETIME-Import Datenbankprogrammierung 9
P MySQL Connection Global Datenbankprogrammierung 13
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
D MySQL Grundsätzliche Fragen zu MySQL Datenbankprogrammierung 3
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
M MySQL-Syntax-Fehler Datenbankprogrammierung 1
M In MySql Datenbank schreiben Datenbankprogrammierung 6
D mySQL Timestamp in RegularTimePeriod bzw Second Datenbankprogrammierung 3
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
windl MySQL und HSQLDB Datenbankprogrammierung 4
S Anbindung zur mysql von mit Swing und AWT Datenbankprogrammierung 22
F MySQL+ Netbeans: Datenbanken mit Automatisch generierten Entity Classes get und set Datenbankprogrammierung 2
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
F BPlaced MySql Datenbank ansprechen Datenbankprogrammierung 5
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
M MySQL Datenbank durchsuchen Datenbankprogrammierung 5
Z MySQL mysql Facharbeit: Tipps und Ideen gesucht Datenbankprogrammierung 5
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
Z MySQL Shopsystem mit mysql und Java Datenbankprogrammierung 8
S [MySQL] Topliste Datenbankprogrammierung 2
H Datenbank-Anbindung Java/MySQL Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
J Dateien in MySQL speichern & indizieren Datenbankprogrammierung 2
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
K MySQL Datenbankbackups Datenbankprogrammierung 5
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
kaoZ HyperSQL vs. MYSQL Datenbankprogrammierung 4
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
V Internationalization mit MySql Datenbankprogrammierung 1
K Adressverwaltung mit MySql und Java? Datenbankprogrammierung 11
M Java Mysql verbinden Datenbankprogrammierung 3
L Zugriff auf lokal gespeicherte mySQL Datenbank Datenbankprogrammierung 3
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben