Kategorien

Suchen


Aktuelle Artikel

Archiv

MySQL

« Vorherige Beiträge

mySQL: root Passwort ändern

Mittwoch, 21.07.2010

Mit folgenden Befehlen können Sie das root Passwort Ihres mySQL Server ändern:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h YourDomain.com password 'new-password'

Beachten Sie dazu auch unsere anderen Artikel:

mySQL: Eindeutige ID (UID) erzeugen

Sonntag, 18.07.2010

Damit Sie in einem SQL Statement eine eindeutige ID (unique ID = UID) nutzen können, steht Ihnen der Befehl “uuid()” zur Verfügung:

SELECT UUID();

Ergebnis:

f15be048-dfb8-102d-b15d-88b2e2560827

Hinweis:
In Verbindung mit einer aktiven Replikation kann diese Funktion derzeit noch nicht genutzt werden.

mySQL: IP Adresse in Integer umrechnen (und zurück)

Samstag, 17.07.2010

Netzwerkadressen werden üblicherweise als String (vier punktgetrennte Oktette) übergeben.
Um diesen Text in eine Zahl (integer) umzurechnen, nutzen Sie die Funktion “inet_aton()”.
Natürlich kann diese Funktion auch nur Teil-IP-Adresse umwandeln.
Das folgende Beispiel zeigt die Anwendung:

SELECT INET_ATON('192.168.0.200');

Ergebnis:

3232235720

Die Zahl berechnet sich aus folgender Formel:

192×2563 + 168×2562 + 0×256 + 200 = 3232235720

Um diese Zahl wieder in eine gültige IP Adresse zu konvertieren, zeigen wir im folgenden Beispiel
die Anwendung des mySQL Befehls “inet_ntoa()”:

SELECT INET_NTOA(3232235720);

Ergebnis:

192.168.0.200

mySQL: Aktuelle mySQL Version auslesen

Freitag, 16.07.2010

Benutzen Sie direkt in Ihrem SQL Statement die Funktion “version()”:

SELECT VERSION();

Ergebnis (Beispiel):

5.1.5-alpha-standard

Hinweis:
Endet die angezeigte Version mit dem Text “-log”, ist das Loggen (Logging) auf dem Server aktiviert.

mySQL: Aktuell angemeldeten Benutzer anzeigen

Donnerstag, 15.07.2010

Um innerhalb eines mySQL Befehles den aktuell angemeldeten Benutzer zu erhalten, nutzen Sie einfach die Funktion “current_user()”. Das folgende, einfache Beispiel zeigt die Anwendung:

SELECT CURRENT_USER();

Gleichzeitig wird der Hostname ausgegeben.
Ergebnis (Beispiel):

test@localhost

Eine weitere Funktion ist “user()”. Die Funktion liefert Ihnen den Benutzernamen, welchen Sie beim Herstellen der Verbindung zu Ihrem mySQL Server eingegeben haben. Zusätzlich wird der Clienthost ausgegeben, über den die Verbindung hergestellt wurde. Der Wert kann sich von dem von der o.a. Funktion “current_user()” unterscheiden.

SELECT USER();

Um aus der Funktion “user()” nur den aktuellen Benutzernamen zu erhalten, nutzen Sie folgenden SQL Befehl:

SELECT SUBSTRING_INDEX(USER(),'@',1);

mySQL: Vergessenes (root) Passwort zurücksetzen

Sonntag, 11.07.2010

Wenn Sie Ihr mySQL Masterpasswort (das “root-Passwort”) vergessen haben, können Sie es neu setzen (resetten). Dafür stellen wir Ihnen drei Alternativen zur Verfügung.

Diese Technik können Sie auch nutzen, um Ihr root-Passwort zu ändern. Wir möchten Ihnen für die Änderung des mySQL root Passwortes jedoch einer unserer anderen Anleitungen anbieten. Dafür müssen Sie jedoch das aktuelle root-Passwort noch kennen: mySQL: Root Passwort ändern.

Möglichkeit 1 (unsicherer als Methode 2 & 3)

Sie können das root Passwort auf jeder Plattform (Windows, Linux, …) auch mit der offiziellen Client-Software “mysql” einstellen:

  1. Stoppen Sie “mysqld” (mySQL Service / Dienst) und starten Sie ihn erneut. Dabei geben Sie als Option “–skip-grant-tables –user=root” mit. Als Windowsbenutzer lassen Sie bitte “–user=root” weg
    mysqld --skip-grant-tables --user=root
  2. Nun verbinden Sie sich mit dem mySQL-Server (dem mysqld Service):
    mysql -u root
  3. Geben Sie im mySQL-Client die folgende SQL Anweisungen ein:
    1
    2
    
    UPDATE mysql.user SET Password=PASSWORD('NeuesPasswort') WHERE User='root';
    FLUSH PRIVILEGES;

    Ersetzen Sie im vorherigen Befehl bitte den Text “NeuesPasswort” durch Ihr neues root-Passwort. Achten Sie dabei vorerst darauf, dass Sie keine Sonderzeichen, Umlaute und andere besondere Zeichen eingeben. Diese führen später häufig zu Problemen. Testen Sie zuerst das Zurücksetzen des root-Passwortes mit einem einfachen Passwort.

  4. Ihr neues root-Passwort sollte nun funktionieren

Möglichkeit 2 (unter Windows)

  1. Melden Sie sich bitte als Administrator an Ihrem Computer an. Bei neu Windows-Versionen können Sie sich als Benutzer mit Administratorrechten anmelden.
  2. Sollte der mySQL Server laufen, stoppen Sie ihn bitte.
    Wenn er als Windows-Dienst gestartet ist, benutzen Sie bitte den Microsoft Dienstmanager:

    Start > Systemsteuerung (ggf. auf Symbolansicht umstellen) > Verwaltung > Dienste

    In der Liste der Dienste suchen Sie den “MySQL-Dienst”. Klicken Sie den Eintrag einmal an und anschließend auf das Stop-Symbol oberhalb der Liste.
    Sollte der mySQL-Server nicht als Dienst läufen, benötigen Sie ggf. die Hilfe des Task-Managers (Strg+Alt+Entf) um das Programm unsanft zu beenden.

  3. Erstellen Sie nun eine neue Textdatei und tragen Sie folgende Zeile (nur eine !) ein:
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NeuesPasswort');

    Speichern Sie diese Datei jetzt unter einem beliebigen Namen. Für dieses Beispiel benutzen wir den Namen “C:\mysql-reset.txt”.

  4. Starten/Öffnen Sie die Kommandozeile:
    Start > Ausführen (oder Windowstaste + R) > cmd
  5. Starten Sie Ihren mySQL-Server neu und geben Sie ihm dabei Ihre gerade erstellte Datei mit an:
    C:\mysql\bin\mysqld-nt --init-file=C:\mysql-reset.txt

    Bei diesem Befehl wird davon aufgegangen, dass der mySQL Server auf Ihrem Computer unter “C:\mysql” installiert ist. Gerade auf neueren Windows-Versionen ist das nicht mehr allzu üblich und daher finden Sie den mySQL Server dort meistens unter “C:\Program Files (x86)\mysql\”. Dann lautet der Befehl:

    "C:\Program Files (x86)\bin\mysqld-nt" --init-file=C:\mysql-reset.txt

    Aufgrund der Leerzeichen im Pfad des Programmes muss der erste Befehlsteil in Anführungszeichen gesetzt werden!

    Nutzen Sie den mySQL Server als Dienst, starten Sie bitte jetzt den Dienst wieder.

  6. Ihr neues root-Passwort sollte nun funktionieren. Vergessen Sie bitte nicht, die Datei “C:\mysql-reset.txt” zu löschen.

Möglichkeit 3 (unter Linux)

  1. Sie melden sich als root-Benutzer bzw. als derjenige Benutzer, unter dem der mysqld-Server läuft, auf Ihrem Linux (Unix) Computer an.
  2. Suchen Sie nun die .pid-Datei, welche die aktuelle Prozess-ID des mySQL-Servers enthält.
    Der genaue Pfad und der Name sint sehr stark von Ihrer Linux-Distribution, Ihrem Hostnamen und der Konfiguration Ihres System ab. Häufig liegen diese .pid-Dateien unter
    /var/lib/mysql/
    /var/run/mysqld/
    /usr/local/mysql/data/
    Meist hat die Datei den Suffix (die Erweiterung) “.pid” und fängt mit “mysqld” oder Ihrem Hostnamen des Computers an.
    Alternativ können Sie auch folgenden Befehl eingeben und in der dann ausgegebenen Liste die Datei suchen:

    find / -name *mysql*.pid
  3. Beenden Sie den mySQL Server durch einen normalen “kill”-Befehl (nicht “kill -9″).
    Übergeben Sie dabei den vollständigen Dateinamen der .pid-Datei:

    kill `cat /pfad/zur/datei.pid`

    Achten Sie bei der Eingabe bitte auf die sog. “Backticks” (Shift + `) anstelle der gewohnten Anführungszeichen um den “cat”-Befehl. Diese Zeichen sorgen dafür, dass die Ausgabe des Unterbefehles “cat /pfad/zur/datei.pid” automatisch in den “kill”-Befehl eingesetzt wird.

  4. Nun legen Sie eine neue Textdatei an. Schreiben Sie folgenden Befehl in einer einzigen Zeile hinein:
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NeuesPasswort');

    Speichern Sie diese neue Datei ab und merken Sie sich den Dateinamen. Für dieses Beispiel haben wir die Datei “~/mysql-reset” genannt. Durch die Tilde (~) wird diese Datei in Ihrem Home-Verzeichnis abgelegt.

  5. Jetzt starten Sie Ihren mySQL Server mit der Option “–init-file=~/mysql-reset” neu:
    mysqld_safe --init-file=~/mysql-reset

    Durch diesen Befehl wird der Inhalt der gerade erstellten Datei beim Start des mySQL Servers ausgeführt und ändert automatisch das Root-Passwort.
    Nachdem der Server hochgefahren ist, sollten Sie die Datei “~/mysql-reset” löschen.

  6. Ihr neues root-Passwort sollte nun funktionieren

mySQL: Update if exists else insert record (SQL statement)

Sonntag, 07.03.2010

Wenn Sie einen Datensatz in eine Datenbanktabelle einfügen möchten (wenn er noch nicht existiert) oder diesen updaten möchten (wenn er existiert), hilft dieser SQL Befehl:

1
INSERT INTO TABLE (FIELDS) VALUES (VALUES) ON DUPLICATE KEY UPDATE FIELD = value

Dieses Statement prüft, ob der Primary Key (PK) für den einzufügenden Datensatz bereits besteht, nutzt dann ein Update Befehl und ansonsten Ihren angegeben Insert Befehl.

Beispiel

Wir haben eine Tabelle “Test” mit den Feldern “A”, “B” (je vom Typ varchar) und “C” (integer). Die Felder “A” und “B” sind unser PK.

Ein normales SQL Insert Statement in die leere Tabelle:

1
2
INSERT INTO Test (A,B,C) VALUES ('Testtext A1','Texttext B1', 110);
INSERT INTO Test (A,B,C) VALUES ('Testtext A2','Texttext B2', 250);

Danach stehen folgende Daten in der Tabelle “Test”:

A B C
Testtext A1 Texttext B1 110
Testtext A2 Texttext B2 250

Nun möchten wir einen weiteren Datensatz einfügen. Werden unter dem PK Daten gefunden, sollen diese überschrieben (aktualisiert) werden – ansonsten wird der Datensatz normal eingefügt:

INSERT INTO Test (A,B,C) VALUES ('Testtext A2','Texttext B2', 285) 
    ON DUPLICATE KEY UPDATE C = 285;
INSERT INTO Test (A,B,C) VALUES ('Testtext A3','Texttext B3', 310) 
    ON DUPLICATE KEY UPDATE C = 310;

Jetzt sieht der Inhalt der Tabelle “Test” wie folgt aus:

A B C
Testtext A1 Texttext B1 110
Testtext A2 Texttext B2 285
Testtext A3 Texttext B3 310

Die roten Texte sind im Gegensatz zur ersten Ansicht verändert.

insert into Test (A,B,C) values (‘Testtext A2′,’Texttext B2′, 285) ON DUPLICATE KEY UPDATE C = 28

mySQL: In PHP vor SQL Injection schützen

Samstag, 06.03.2010

Wie wir in unserem Artikel “mySQL: Schutz vor Angriffen in Datenbankabfragen (SQL Injection)” bereits erklärt haben, ist es vergleichsweise einfach möglich, durch ungesicherte bzw. ungeprüfte Parameter schadhaften oder zerstörenden Code in Ihre SQL Statements einzufügen.

Wie Sie sich z.Bsp. in PHP einfach und schnell gegen solche Angriffe schützen können, zeigt folgender Codeausschnitt:

1
2
foreach ($_REQUEST as $key => $val)
  $_REQUEST["$key"] = mysql_real_escape_string($val);

Es werden alle übergebenen Parameter (GET und POST) durch die mySQL Funktion “mysql_real_escape_string” überarbeitet. Dadurch werden die für eine Injektion benötigten Zeichen unschädlich gemacht und der Datenbankserver wird im Normalfall mit der “kaputten” SQL Anweisung nichts anfangen können.

Für weitere Informationen zum Thema SQL Injektion besuchen Sie bitte unseren o.a. Artikel.

PHP: Unable to load dynamic library ‘/usr/lib/php5/extensions/mysql.so’

Freitag, 05.02.2010

Wenn im ErrorLog des Apache2 WebServers (“tail /var/log/apache2/error.log”) u.a. folgende Zeile zu finden ist, kann PHP die Extension (Erweiterung) nicht finden und laden:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/extensions/mysql.so' - /usr/lib/php5/extensions/mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Häufig wird dann angefangen, wild an der Konfiguration zu ändern und basteln. Dabei wird meist das naheliegendste übersehen:

Gibt es das angegebene Verzeichnis überhaupt ?
Erst recht, wenn mehrere (oder gar viele) Extensions nicht geladen werden können.

Wenn dann der Befehl

dir -l /usr/lib/php5/extensions/

die folgende Fehlermeldung anzeigt, sollte alles klar sein:

dir: Zugriff auf /usr/lib/php5/extensions/ nicht möglich: Datei oder Verzeichnis nicht gefunden

Lösung

Den Pfad für die Extensions in der “php.ini” anpassen. Diese kann, falls der Pfad nicht bekannt ist, mithilfe des folgenden Befehls gefunden werden.

find / -name php.ini

Dieser Befehl zeigt Ihnen ggf. auch andere “php.ini” Dateien auf ihrem System an. Manchmal konfiguriert man ein einer “php.ini” und wundert sich, dass keine Änderung eintritt. Wenn man zufällig die falsche Datei in den Händen hat, dann kann man auch lange auf ein Ergebnis warten ;)

Häufig fällt dieses Problem nach einer (Neu)Installation erst auf, wenn die mySQL / mySQLi Unterstützung fehlt. Grund ist dann (meist), dass die mysql.so Extension in PHP nicht geladen werden kann.

mySQL: Doppelte IDs auflisten / Doppelte Einträge finden

Donnerstag, 12.11.2009

Um in mySQL doppelte Einträge (Feldinhalte) aufzulisten, hilft Ihnen das folgende SQL Statement:

SELECT id FROM muster m WHERE (
SELECT count(*) FROM muster WHERE id = m.id
) >1

In diesem Beispiel werden alle IDs aus der Tabelle “muster” aufgelistet, die doppelt vorhanden sind.

Wenn Sie Ihre eigene Tabelle eintragen, achten Sie bitte darauf, beide Namen anzupassen.

« Vorheriger Beitrag