MySQL Datenbank in utf8 konvertieren

Als Erstes wird ein Dump der Datenbank erstellt. Mit folgendem Oneliner werden auch gleichzeitig alle Definitionen in utf8 geändert:

mysqldump --opt -Q -u <deinuser> -p<deinpass> -h <deinhost> <deinedatenbank> | sed s'/DEFAULT CHARSET=.*;/DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;/g''> mysql_dump.sql

Als nächstes muß die aktuelle Kodierung der Dump-Datei festgestellt werden:

file -i mysql_dump.sql

Sollte die Datei bereits in utf8 vorliegen muß diese nicht mehr geändert werden, andernfalls wird die Kodierung der Datei mit folgendem Befehl auf utf8 geändert:

iconv -f <altescharset> -t utf8 mysql_dump.sql > mysql_dump.utf8.sql

Um den Dump wieder einzuspielen wird nun folgender Befehl genutzt:

mysql -u <deinuser> -p<deinpass> -h <deinhost> --default-character-set=utf8 <deinedatenbank> < mysql_dump.sql (oder mysql_dump.utf8.sql)

In MySQL sollte die Datenbank nun in utf8 vorliegen.

Alle MySQL-Verbindungen eines users beenden

Oft hat man das Problem in MySQL aus irgendeinem Grund alle Verbindungen eines users beenden zu müssen. Da eine Syntax wie „kill where user like …“ nicht existiert muß man sich mit einem kleinen Workaround behelfen. Man läßt MySQL sozusagen selber ein Killscript schreiben und sendet dieses dann an die Datenbank. Das Killscript erhält man mit folgender Abfrage:

mysql: select concat("KILL ",id,";") from information_schema.processlist where user="root";
 +------------------------+
 | concat("KILL ",id,";") |
 +------------------------+
 | KILL 1234;             |
 | KILL 1235;             |
 +------------------------+
 2 rows in set (0.00 sec)

Um das Script direkt in einer Form zu bekommen die ich sofort wieder an die Datenbank senden kann benutze ich „into outfile“:

mysql: select concat("KILL ",id,";") from information_schema.processlist where user="root" into outfile "/tmp/killscript.sql";
 Query OK, 2 rows affected (0.00 sec)

Nun brauche ich das Ganze nur noch mit „source“ als Abfragefolge wieder an die Datenbank senden:

mysql: source /tmp/killscript.sql;
 Query OK, 0 rows affected (0.00 sec)

Diese Vorgehensweise funktioniert natürlich auch wenn ich z.B. alle Verbindungen zu einer Datenbank oder alle Verbindungen von einem Host beenden möchte, hierzu muß ich nur meinen Select entsprechend anpassen.

Veröffentlicht unter MySQL | Verschlagwortet mit

MySQL-Datenbanken leeren

Es existiert kein MySQL-Befehl mit dem man auf einen Schlag alle Tabellen einer MySQL Datenbank löschen kann, aber es gibt mehrere Workarounds für dieses Problem. Mit einem einfachen

DROP DATABASE zuleerendedatenbank;
 CREATE DATABASE zuleerendedatenbank;

kann man auf einfache und schnelle Weise die Datenbank leeren. Diese Vorgehensweise hat allerdings einige kleine Nachteile. Zum Einen benötigt man hierfür das Recht die Datenbank zu löschen bzw. auch wieder neu anzulegen (was in Hostingprovider-Umgebungen eher selten gegeben ist) zum Anderen wird wirklich die komplette Datenbank gelöscht und neu erstellt was natürlich auch sämtliche Einstellungen die man auf Datenbankebene getätigt hat (z.B. Zeichensatzeinstellungen der Datenbank) wieder auf default zurück setzt. Eine Möglichkeit das zu umgehen hat man mit folgendem Einzeiler

mysqldump -ubenutzer -ppasswort --no-data --add-drop-table zuleerendedatenbank | grep DROP | mysql  -ubenutzer -ppasswort zuleerendedatenbank

bei dem man einfach mit mysqldump einen Datenbankdump mit DROP TABLE Anweisungen (–add-drop-table) und ohne Tabelleninhalte (–no-data) zieht und alle Zeilen die mit DROP beginnen mit mysql wieder an die Datenbank sendet.

Veröffentlicht unter MySQL | Verschlagwortet mit

Suchen und Ersetzen in MySQL-Datenbanken

Suchen und Ersetzen in einer Datenbanktabelle:

UPDATE tabelle SET spalte = REPLACE(spalte, suchmuster, ersatz);

Wobei:
tabelle = zu durchsuchende Tabelle
spalte = zu durchsuchende Spalte
suchmuster = zu ersetzender String
ersatz = Ersatzstring

Veröffentlicht unter MySQL | Verschlagwortet mit