Kategorien

Suchen


Aktuelle Artikel

Archiv

MySQL

« Vorherige Beiträge

mySQL: Datensatz mit neuer ID duplizieren (kopieren, klonen)

Freitag, 18.02.2011

Um in mySQL einen Datensatz (record) in einer Tabelle (table) zu kopieren und dabei gleichzeitig eine neue ID zu vergeben, nutzen Sie folgenden SQL Befehl in einem Aufruf:

CREATE TEMPORARY TABLE tmp SELECT * FROM beispiel WHERE id = 123;
UPDATE tmp SET id = NULL;
INSERT INTO beispiel SELECT * FROM tmp;

Die Erklärung:

Sie erstellen eine temporäre Tabelle (“tmp”) aus dem Datensatz Nr. 123 der Tabelle “beispiel”. Dadurch werden gleichzeitig die Felder der Tabelle ausgelesen und zwischengespeichert. Dann setzen Sie die ID in der Kopie auf “null” (das Feld wird geleert) und fügen diesen modifizierten Datensatz gleich wieder ein.

Weitere Möglichkeiten:

Natürlich können Sie im mittleren Schritt (hier das Setzen der ID auf “null”) auch andere Veränderungen am Datensatz durchführen. Wenn Sie z.Bsp. das Feld “name” mit “Max Muster” füllen möchten, nutzen Sie folgenden Befehl:

CREATE TEMPORARY TABLE tmp SELECT * FROM beispiel WHERE id = 123;
UPDATE tmp SET id = NULL, name = 'Max Muster';
INSERT INTO beispiel SELECT * FROM tmp;

Auch das Verarbeiten / Kopieren mehrerer Datensätze in einem Aufruf ist möglich:

CREATE TEMPORARY TABLE tmp SELECT * FROM beispiel WHERE id > 123;
UPDATE tmp SET id = NULL;
INSERT INTO beispiel SELECT * FROM tmp;

Im Beispiel werden zuerst alle Datensätze (records) mit einer ID über 123 in die temporäre Tabelle kopiert, dann deren ID auf “null” gesetzt und anschließend alle wieder in die Tabelle eingefügt. Dabei beachten Sie bitte, dass evtl. sehr viele Datensätze erzeugt werden können. Haben Sie z.Bsp. 10.000 Einträge über der ID 123, dann haben Sie nach diesem SQL Befehl 20.000 in der Tabelle …

WordPress: Deine PHP-Installation scheint nicht über die von WordPress benötigte MySQL-Erweiterung zu verfügen

Dienstag, 28.09.2010

Beim Aufruf Ihrer Webseite erhalten Sie folgende Meldung ?

Deine PHP-Installation scheint nicht über die von WordPress benötigte MySQL-Erweiterung zu verfügen.

Prüfen Sie bitte, ob auf Ihrem Server die folgenden Programme (Module) richtig installiert sind:

Sollte z.Bsp. “php5-mysql” fehlen, dann können Sie unter Debian mithilfe des Befehles “apt-get install php5-mysql” dieses Modul nachinstallieren. Anschließend sollte Ihre Webseite (wieder) richtig funktionieren.

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.

« Vorheriger Beitrag