Kategorie-Archiv: Datenbanken

mysql Fehler – attempted to open a previously opened tablespace

Heute wollte ich ganz normal meine MAMP-Instanz starten um lokal weiter an meinem Magento 2 Shop zu arbeiten. Dabei konnte mySQL leider nicht gestartet werden. Im log stand dann der folgende Eintrag.

Nicht cool, immerhin startet mySQL dann gar nicht mehr. Meine Datenbanken hatte ich schon fast abgeschrieben. Auch, wenn es nur Entwicklungsdatenbanken sind, wäre ein Verlust doch extrem ärgerlich. Also ein wenig recherchiert und schnell auf die Lösung gekommen. Diese nennt sich „innodb_force_recovery“.

Dazu öffnet man einfach die my.cnf und fügt irgendwo unter [mysqld] den folgenden Eintrag ein:

Je höher der Wert gesetzt wird, desto wahrscheinlich ist es, dass die Datenbanken kaputt gehen! Also auf jeden Fall mit 1 starten.

Danach startet man mySQL. Sollte das klappen, wird der Dienst sofort wieder gestoppt und der Wert aus der Konfiguration entfernt. Danach kann mySQL erneut gestartet werden.

In meinem Fall war das Problem damit aus der Welt.

Weitere Details gibt es hier. Dort kann man auch nachlesen was die einzelnen Level genau tun.

Inkonsistente mySQL-Datenbank

Vor einiger Zeit wollte ich eine inkonsistente mySQL-Datenbank bereinigen. Diese wurde durch Unwissenheit mit den folgenden Befehlen von jedem Statement in den entsprechenden Zustand gebracht:

Die fehlerhaften Datensätze waren mit einem Script auch schnell ausgemacht (GROUP BY Primary-Key-Felder HAVING COUNT(*) > 0). Doch dann musste ich verwundert feststellen, dass ich diese doppelten Schlüssel mit einem einzelnen Statement nicht zu sehen bekam:

SQLQuery1

Nach einer kurzen Denkpause, und einer Query-Analyse mit dem Keyword EXPLAIN, wurde schnell klar, dass der Index des Primärschlüssels selbstverständlich nur einen der beiden Datensätze kannte. Um den Index zu umgehen / nicht zu nutzen, musste ich die Abfrage also anpassen:

SQLQuery2

Nun sieht man beide Datensätze und einer Bereinigung steht nichts mehr im Wege.

ERROR 2006: MySQL server has gone away

Diesen Fehler bekam ich bei einem Import eines 900MB großen .sql-Files unter MAMP nach wenigen Sekunden. Schuld ist die max_allowed_paket-Größe in der Konfiguration. Doch wo findet man diesen Wert? Angeblich in der my.cnf. Leider gibt es eine solche Datei unter MAMP nicht. Also muss man diese anlegen. Wo sie überall erstellt werden kann und gesucht wird, kann man mit folgendem Befehl ermitteln:

Der schönste Platz dafür (in meinen Augen) war logischerweise im folgenden Verzeichnis:

Doch wo bekommt man nun eine Datei her? Da haben die Macher von MAMP mitgedacht, und haben eine Reihe von Beispielkonfigurationen im folgenden Verzeichnis hinterlegt:

Also eine der Dateien kopiert, umbenannt und mit einem Editor geöffnet um den folgenden Wert zu ändern:

Nach einem Neustart des mySQL-Servers stand einem Import nichts mehr im Wege.

MAMP: MongoDB-Unterstützung hinzufügen

Um mit einer MongoDB kommunizieren zu können, benötigen wir eine entsprechende Schnittstelle aus PHP heraus. Wie diese eingerichtet wird kann man hier nachlesen. Die Informationen dort sind allerdings sehr rudimentär – also möchte ich hier etwas mehr ins Detail gehen.

In meiner Testumgebung (MAMP) nutze ich PHP 5.4.4. Damit PECL genutzt werden kann, müssen allerdings noch einige Vorkehrungen getroffen werden:

Als erstes müssen die „MAMP Serverkomponenten und Bibliotheken / MAMP Server components and libraries“ geladen werden (ca. 150MB). Diese werden im Downloadbereich bereitgestellt. Aus dem geladenen Paket braucht man allerdings nur die Qullen von PHP in der entsprechenden Version.

Alternativ kann man die nötigen Quellen auch von der offiziellen PHP-Seite herunterladen. Die geladenen Qullen müssen in in ein Include-Verzeichnis unter PHP entpackt werden:

Weiterlesen…

MAMP: Importieren von .sql-Dateien

Um unter Mac OS X (in meinem Fall Mountain Lion / 10.8.2) und MAMP eine .sql-Datei zu importieren muss man in das entsprechende Verzeichnis wechseln.

Danach kann man folgenden Befehl ausführen um die Datei zu importieren:

In diesem Fall ist root der Benutzername, localhost der Host und database_name unsere Datenbank in die wir importieren wollen. Durch die Eingabeumleitung wird der Inhalt aus file.sql dann an den Server gesendet. Da wir kein Passwort angegeben haben (aber -p), werden wir direkt nach dem Passwort gefragt.

mySQL: SUBSTRING_INDEX + GROUP_CONCAT

Vor einiger Zeit hatte ich das Problem, dass ich mit GROUP_CONCAT unter mySQL eine Gruppe zu einem einzelnen String zusammengeführt habe, aber die Gruppe sehr viele Elemente enthielt. Da das Ergebnis in einer Tabelle ausgegeben werden sollte, wurde der Wert entsprechend zu lang. Also wollte ich diesen, anhand eines Delimiters, auf eine gewisse Anzahl beschränken.

Um dies zu erreichen wollte ich allerdings weder PHP verwenden, noch die Datenbank mit komplexen und geschachtelten String-Funktionen belasten. Und auch für dieses Problem gab es tatsächliche eine sehr einfache Lösung: SUBSTRING_INDEX schmeißt ab einem vorgegebenen Trennzeichen an gewünschter Position (in diesem Fall die dritte) alles weg was noch kommt.

Hier noch ein Beispiel: Ich möchte aus einer Tabelle alle Benutzer und die dazugehörigen e-Mailadressen haben (maximal jedoch nur drei Stück). Ein Benutzer kann also mehrfach mit verschiedenen Adressen in der Tabelle Users eingetragen sein. Das ist zwar kein besonders schönes Datenmodell, zeigt jedoch sehr einfach die Verwendung der Funktionen.