MySQL

MariaDB-Server remote erreichbar machen

16. Mai 2021 · Anwendungen · andreas · Kein Kommentar

Im abgeschotteten Intranet manchmal ein zeitsparender Faktor bei der Entwicklung, sollte man sich trotzdem genau überlegen, ob man Verbindungen von Systemen außer localhost zulassen möchte.

Auf einem Debian 10-System muß zuerst die Datei “50-server.cnf” im Verzeichnis “/etc/mysql/mariadb.conf.d/” angepasst werden:

$ cd /etc/mysql/mariadb.conf.d/
$ sudo vi 50-server.cnf

In der Datei dann die Zeile beginnend mit “bind-address” suchen und wie folgt ändern:

bind-address = 0.0.0.0

Diese Änderung bewirkt, daß der Server ab sofort über alle verfügbaren Netzwerkinterfaces erreichbar ist. Anschließend wird der Dienst neu gestartet:

$ sudo systemctl restart mariadb

Als nächster (und letzter) Schritt muß noch ein Benutzer für den externen Zugriff angelegt werden:

$ sudo mysql -u root
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' IDENTIFIED BY 'remotepassword';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> EXIT
Bye

Anschließend kann von beliebigen Quelladressen mit dem Benutzer “remote” auf alle Datenbanken zugegriffen werden. Sinnvollerweise sollte man die Berechtigungen nicht so weitreichend vergeben, sondern auf einzelne Datenbanken (“Datenbank.*”) und Rechner (‘remote’@‘1.2.3.4’) beschränken.


Groß- und Kleinschreibung von MySQL-Tabellennamen

25. Dezember 2012 · Programmierung · andreas · 2 Kommentare

Eine “schöne” Stolperfalle, wenn Projekte aus einer Windows- in eine Unix-Umgebung geschoben werden, sind die Tabellennamen in MySQL. Egal, ob die Tabelle unter dem Namen “Kosten”, “kosten” oder “Kosten” angelegt wurde, unter Windows ignoriert ein Statement wie

SELECT * FROM kOsTeN;

jegliche Groß- und Kleinschreibung und liefert die selektierten Zeilen, während MySQL unter Unix in einen Fehler läuft.


Groß- und Kleinschreibung bei SQLite

20. März 2011 · Programmierung · andreas · Kein Kommentar

Eine der Stolperfallen beim Wechsel zwischen MySQL und SQLite ist, daß SQLite in der Standardeinstellung z.B. bei SELECT-Statements zwischen Groß- und Kleinschreibung unterscheidet. Ein

SELECT * FROM meinetabelle WHERE meinfeld = 'test';

wird zwar eine Zeile mit meinfeld = ’test’ finden, für eine vorhandene Zeile mit meinfeld = ‘Test’ aber kein Ergebnis zurückliefern. Möchte man das SELECT ohne Berücksichtigung von Groß - und Kleinschreibung durchführen, so kann dies durch das Anhängen von ‘COLLATE NOCASE’ erfolgen, also

SELECT * FROM meinetabelle WHERE meinfeld = 'test' COLLATE NOCASE;

womit auch ‘Test’, ’tEst’, ‘TEST’ und noch ein paar andere Schreibweisen gefunden werden.

Möchte man das Verhalten für einzelne Tabellen von Anfang an umstellen, so kann ‘COLLATE NOCASE’ auch entweder direkt bei der Spaltendefinition oder beim Erzeugen eines Indexes angegeben werden.


MySQL-Tabellen nach Crash reparieren

15. März 2011 · Anwendungen · andreas · Kein Kommentar

Sollte sich MySQL mit einem Fehler wie

Table '<Tabellenname>' is marked as crashed and should be repaired

zu Wort melden, so hilft in der Regel ein

mysql> check table <Tabellenname>;

mysql> repair table <Tabellenname>;

damit die Welt wieder in Ordnung ist:

+----------------+-------+----------+----------+
| Table          | Op    | Msg_type | Msg_text |
+----------------+-------+----------+----------+
| <Tabellenname> | check | status   | OK       |
+----------------+-------+----------+----------+
1 row in set (0.01 sec)

Schnelle Übersicht in MySQL

12. September 2010 · Programmierung · andreas · Kein Kommentar

Manchmal sind es die einfachen Dinge, die man immer wieder nachschlagen muß …

Eine Liste der Datenbanken eines MySQL-Servers spuckt der Befehl

SHOW DATABASES;

aus, währen die vorhandenen Tabellen einer Datenbank mit dem Befehl

SHOW TABLES IN <datenbankname>;

ermittelt werden können. Wahlweise kann an letzteren auch noch eine LIKE-Bedingung angehängt werden.

Alternativ zu den oben genannten Befehlen kann auch die Datenbank “information_schema” befragt werden. So liefert ein

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;

ebenfalls eine Liste der Datenbanken, während man die Tabellen einer Datenbank mittels

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='<datenbankname>';

ermitteln kann.