Schlagwort-Archive: mysql

PHP effektiv gegen Hacker-Angriffe absichern

PHP kann Dateien auf den Server schreiben, ausführbaren Code von Webadressen nachladen oder Linux-Systemkommandos mit den Rechten des Webservers ausführen. Meist sind diese Möglichkeiten nützlich und notwendig. Doch viel zu oft lässt sich, dank Fehlern, eine Funktion von außen missbrauchen, um Schädlingsprogramme auf dem Webserver zu installieren.

Deshalb sollte sich jeder Webserver-Administrator dringend mit den Konfigurationsmöglichkeiten von PHP4 beziehungsweise PHP5 vertraut machen, und nur so viele Funktionen zulassen, wie auf dem Server auch tatsächlich benötigt werden. Die dafür zuständige Datei heißt php.ini und liegt, je nach Version von Webserver und PHP, in einem der folgenden Verzeichnisse:

/etc/php4/apache/

/etc/php4/apache2/

/etc/php5/apache/

/etc/php5/apache2/

Nach jeder Änderung empfiehlt sich ein

apachectl restart

oder

apache2ctl restart

Erst mit dem Neustart werden die Änderungen wirksam. Das graceful-Kommando des Skripts apachectl reicht dazu nicht immer aus.

Gehen Sie die folgenden Anweisungen Schritt für Schritt durch und setzen Sie den vorgeschlagenen Wert in Ihrer php.ini. Setzen Sie den Wert auch, wenn er die Voreinstellung (default) ist. Denn die jeweils gültigen Voreinstellungen ändern sich des öfteren von PHP-Version zu PHP-Version. Angegeben sind die Defaults für PHP5, bei PHP4 sind sie sehr versionsabhängig.

Und das sind die Befehle:

register_globals = off ;(php5-default: off)

verhindert, dass beliebige Variable im PHP-Code durch GET- oder POST-Parameter überschrieben werden können. Beim Aufruf der URL http://server/page.php?login=true ist beispielsweise der Wert in der Variablen $_GET[„login“] abgelegt. Mit

register_globals=on

wird zusätzlich alleine über den URL-Parameter die PHP-Variable $login gesetzt. Dieser Parameter sollte darum heutzutage unter keinen Umständen mehr auf on gesetzt werden.

memory_limit = 12M ;(default: 8M)

begrenzt den Speicher (in Megabyte), der bei jedem einzelnen Aufruf eines Skripts verbraucht werden darf. So wird beispielsweise verhindert, dass eine versehentlich programmierte Endlosschleife den kompletten verfügbaren Speicher belegt. Viele PHP-Anwendungen sind recht speicherhungrig, so dass der Wert eventuell höher gewählt werden muss. Das CMS Typo3 benötigt beispielsweise eine Grenze von mindestens 16MB.

max_execution_time = 60 ;(default: 30)

begrenzt die Zeit, die ein Script für die Ausführung bekommt. Auch das verhindert Probleme mit versehentlichen Endlosschleifen. Allerdings darf der Wert nicht zu niedrig sein – schließlich soll auch bei voller Serverlast etwa eine aufwendige Datenbankabfrage ohne Fehlermeldung bearbeitet werden.

max_input_time = 60 ;(default: 60)

begrenzt die Zeit, die ein Script mit dem Einlesen der übergebenen Parameter verbringen darf.

default_socket_timeout = 60 ;(default: 60)

begrenzt die Zeit, die PHP bei der Ãœbertragung von Streams auf die Gegenseite wartet.

allow_url_fopen = off ;(default: on)

Defaultmäßig erlaubt es PHP, bei allen Befehlen, die Dateien öffnen, statt eines lokalen Dateinamen auch eine URL anzugeben. Das betrifft beispielsweise die Befehle require, include oder fopen. Setzen Sie diesen Wert nur auf on, wenn Sie diese Funktionalität unbedingt benötigen. Denn schon ein include($_GET[„filename“]) stellt ein erstklassiges Sicherheitsrisiko dar. Hier sind allerdings auch die PHP-Programmierer gefragt. Denn solche Konstruktionen sind leichtsinnig.

open_basedir = /var/www/:/usr/share/pear/ ;(default:nicht gesetzt)

Dieser Parameter schränkt das Öffnen von Dateien weiter ein. PHP läßt nur noch den Zugriff auf solche Dateien zu, die in oder unterhalb der angegebenen Pfade gespeichert sind. Allerdings sollten Sie hier nicht zu restriktiv sein: Liegt ein PHP-Programmpaket, wie etwa phpMyAdmin, in einem Pfad außerhalb des üblichen www-Verzeichnisses, muss dieser Pfad mit aufgeführt werden, sonst wird das Programmpaket nicht mehr funktionieren.

session.save_path = /var/tmp/www ;(default: nicht gesetzt)

gibt das Verzeichnis an, in dem PHP seine Session-Informationen ablegt.

Aus Sicherheitsgründen sollte dafür nicht das Standard-Tempverzeichnis genutzt werden.

upload_tmp_dir = /var/tmp/www ;(default: nicht gesetzt)

gibt das Verzeichnis an, in dem PHP hochgeladene Dateien ablegt. Auch dafür sollte keinesfalls das Standard-Tempverzeichnis verwendet werden.

upload_max_filesitze = 2M ;(default: 2M)

begrenzt die Größe der Dateien in Megabyte, die via PHP-Funktionen hochgeladen werden können. Der ideale Wert hängt davon ab, für welche Anwendungen PHP eingesetzt wird. Sie können auch einen größeren Wert, etwa 20M wählen, nur unbegrenzt sollte die Dateigröße nicht sein.

enable_dl = off ;(default: on)

Die Standardeinstellung aktiviert den PHP-Befehl dl(), der PHP-Extensions im Programmcode nachlädt. So verlieren Sie aber die Kontrolle, welche Extensions auf Ihrem Webserver verwendet werden. Stellen Sie diesen Parameter also besser auf off und laden Sie Extensions über die php.ini, etwa

extension=mysql.so

PHP-Parameter individuell einstellen

Aufwendiger wird die Einstellung, wenn nicht für den Webserver einheitliche Werte gelten sollen, etwa, weil der Server unter verschiedenen URLs verschiedene PHP-Anwendungen anbietet. Doch auch dann ist es möglich, sichere Einstellungen zu erreichen. Dazu setzt man zunächst in der php.ini alle global geltenden Werte. Alles Weitere passiert dann in den Config-Dateien des Apache-Werbservers. Dafür gibt es zwei Config-Befehle:

php_admin_flag

php_admin_value

Diese beiden Befehle können auch innerhalb eines

Blocks verwendet werden, so dass sie für einen virtuellen Server gelten. Beispiel:

(…)

php_admin_flag allow_url_fopen off

php_admin_value memory_limit 10M

php_admin_value open_basedir /home/ vserver1/:/usr/share/ pear/

Beachten Sie die Schreibweise ohne =-Zeichen.

Wenn auf Apache mehrere virtuelle Server laufen, sollten Sie open_basedir, session.save_path und upload_tmp_dir für jeden Host getrennt setzen.

Achtung, Fußangel

Nicht alle Beschränkungen, die Sie in der php.ini setzen, können in der Apache-Config wieder aufgehoben werden. Ist in der php.ini etwa allow_url_fopen auf off gesetzt, bleibt es auf off, was auch immer Sie in Apache einstellen.

Verwenden Sie in diesem Fall folgenden Trick:

allow_url_fopen = on

in der php.ini.

php_admin_flag allow_url_fopen off

in der globalen Apache-Konfiguration. Und dann wiederum

php_admin_flag allow_url_fopen = on

innerhalb des Virtualhosts, der diese Funktion benötigt. Um zu überprüfen, welche Einstellungen innerhalb eines Hosts tatsächlich gelten, verwenden Sie ein kurzes Skript mit dem Befehl phpinfo().

Noch mehr Sicherheit für PHP

Darüber hinaus gibt es weitere Parameter, um PHP noch stärker abzusichern, etwa

safe_mode =

disable_functions =

Setzt man allerdings diese Parameter auf sichere Werte, schränkt man die Funktionalität von PHP so stark ein, dass viele Anwendungen nicht mehr oder nur noch eingeschränkt funktionieren. Wer diese Parameter ändert, sollte deshalb danach seine Anwendungen ausführlich testen.

Add to Del.icio.us

SQL-Referenz Mini

Datentypen in SQL

Die wichtigsten SQL-Datentypen sind

bool TRUE oder FALSE
int Ganzzahlen
char () String fester Länge
varchar () String variabler Länge mit festgesetztem Maximum
long varchar (unter einigen Datenbanken: Text mit mehr als 2048 Zeichen)
dec (, ) Offensichtlich Festkomma. übersteigt ein Wert die Zahl der möglichen Stellen wird der höchstmögliche Wert gespeichert (bei dec(3,3) und 4321.4321 ist das z.B. 999.999).
float () Fließkommazahl
date Datumsangabe. Vorsicht: Datumsformate unterscheiden sich in den Datenbanken, MySQL möchte z.B. Daten in der Form 4 Zeichen für Jahr, 2 für Monat und 2 für Tag in der Formatierung YYYY-MM-DD. Außerdem werden Daten meist als Strings übergeben (also bei INSERT unbedingt auf Hochkomma achten). Angesichts all dieser Probleme und den Schwierigkeiten, z.B. herauszufinden wie viele Tage zwischen zwei DATEs lagen, beschränke ich meine Programmierung auf Unix-Timestamps: Die haben den Wert int.

SELECT

Einfaches SELECT
select ist der erste Schritt für eine Ausgabe aus einer Datenbank. Die Syntax ist
SELECT FROM [WHERE ]. Es werden immer alle Zeilen einer Datenbank angesprochen, sind alle Spalten gemeint genügt ein *, ansonsten werden Spaltennamen (genau wie Tabellennamen) durch ein Komma getrennt. example.
select * from hauptbuchselektiert alle Zeilen mit allen Spalten aus hauptbuch. Mit Funktionen, die die Programmiersprachen dann zur Verfügung stehen, können selektierte Einträge z.b. in Strings gespeichert werden (siehe: Eine kleine ODBC-Referenz).
select transaktion, datum from hauptbuchgewährt dann nur Zugriff auf die Spalten transaktion und datum (nur wenige Spalten auszuwählen vergrößert oft übersicht und verschnellert).

SELECT mit Bedingungen

select * from hauptbuch where (transaktion>40000)selektiert nur die Zeilen (alle Spalten, da *) einer Tabelle, bei denen Transaktion>40000 ist. Ein weiteres Beispiel ist
select kundennr, letztebestellung from faktura where
(kundennr=192)

SELECT mit Sortierung

Syntax ist
order by [ascending/descending]select * from hauptbuch where (transaktion>40000) order by transaktion descendingselektiert z.b. bei einer Tabelle mit den Werten
wobei descending eine fallende Reihenfolge symbolisiert, ascending oder keine Angabe der Reihenfolge sortiert die Selektion in die andere Richtung.

JOINS

Oft werden die Einträge aus einer Tabelle in einer anderen Tabelle als Schlüsselwerte benutzt. Schlüsselwerte sind Werte, die in jeweils nur einer Zeile der Tabelle vorkommen. Z.B. wäre einen Kundendatenbank, in der jedem Kunden eine eindeutige Kundennummer zugeordnet ist, eine Datenbank mit Schlüsselwerten. Haben wir zwei Tabellen Können wir in SQL auch in einem Schritt nach einem Kundennamen suchen und den Zeitpunkt der letzten Bestellung ausgeben. Das nennt man dann einen JOIN aus beiden Tabellen.
Um gleichnamige Spaltennamen in verschiedenen Tabellen unterscheiden zu können schreibt man den Tabellennamen mit einem Punkt vor den Spaltenname:
select hauptbuch.transaktion, hauptbuch.datum from
hauptbuch
sieht zwar dumm aus, das ändert sich aber bei
select * from kunden, bestellungen where ((kunden.kundennr=bestellungen.kundennr) AND (kundenname=’Fr. Brisbois‘)) liefert Kundennr und Bestellzeitpunkt von Andreas Mühl zurück.
Die letzte anweisung ist für konventionelle Programmierer (zumindest ging es mir so) erst einmal schwer zu verdauen. Es zeit aber auch, das ein where kein if ist: where wird alle Spalten aller Datenbanken angewendet. So funktioniert die Geschichte auch wenn z.B. Anderas Mühl in der Kundendatenbank die erste Zeile innehat, in der Bestelldatenbank aber nur die 5te oder 1000ste.

CREATE

create ist für uns nur im Zusammenhang mit create table interessant. Es erzeugt eine neue Tabelle in einer Datenbank. der Syntax ist
create table [,(… ] )z.B.:
create table kunden (kundennr int, name varchar(50))

INSERT

insert into < Tabellenname > values ([,…])Beachten Sie, dass der Wert sowohl bei Datumsangaben (i.d.r in der Form ‚JAHR-MO-TG‘) als auch bei Varchars (Strings) in Hochkomma (‚) eingeschlossen sein muss.
Eine Insert-Anweisung führt logischerweise zu Fehlern, falls nicht die gleiche Anzahl Werte in die Tabelle eingefügt werden soll, wie Spalten vorhanden sind.
Hin und wieder passiert es, dass ein Programmierer insert into tabelle1 value (2001, ‚Jahr‘) schreibt. Ein fehlendes s mach es dem Programmierer da bei der Fehlersuche schwer weil (nicht das korrekte values) value auch als Schlüsselwort erkannt wird.

DELETE

Zeilen löscht man in SQL mit
DELETE FROM WHERE < Bedingung >Beispiel:
DELETE FROM ANTIQUES WHERE ITEM = ‚Ottoman‘;

DROP

Drop ist das delete für ganze Tabellen. Mit
DROP löschen Sie die ganze Tabelle. Ich verwende es oft in den setup-Dateien, den Dateien, die Tabellen in den Datenbanken aufbauen. Vor dem Erstellen der Tabellen versuche man sie oft zu löschen, da ein Erstellen mit geänderten Spalten nicht möglich ist wenn die Tabelle noch in anderer Form existiert.

ALTER

Mit ALTER TABLE ADD/DROP COLUMN /kann man Tabellen im Nachhinein ändern — praktisch.
Spalten hinzufügen
Spalten hinzufügen kann man z.B. mit
ALTER TABLE ANTIQUES ADD COLUMN (PRICE INT); Spalten löschen
… und Spalten löscht man mit ALTER….DROP:
ALTER TABLE ANTIQUES DROP COLUMN PRICE;

UPDATE

UPDATE SET = WHERE ändert einen Eintrag in einer Datenbank (und ist als solches sehr praktisch in Administrationsseiten wo desöfteren in den Datenbankinhalten etwas geändert wird. Man denke nur an Preisänderungen in Online-Shops.)
UPDATE ANTIQUES SET PRICE = 500.00 WHERE ITEM = ‚Chair‘;

mysqlbinlog — Hilfsprogramm für die Verarbeitung binärer Logdateien

Die Binärlogdateien, die der Server erzeugt, sind im Binärformat geschrieben. Um diese Dateien in Textform zu untersuchen, verwenden Sie das Hilfsprogramm mysqlbinlog.

Rufen Sie mysqlbinlog wie folgt auf:

shell> mysqlbinlog [options] log_file …

Um beispielsweise den Inhalt einer Binärlogdatei namens binlog.000003 anzuzeigen, verwenden Sie folgenden Befehl:

shell> mysqlbinlog binlog.0000003

Die Ausgabe enthält alle Ereignisse, die in binlog.000003 enthalten sind. Zu den einzelnen Ereignisdaten gehören u. a. die ausgeführte Anweisung, die Ausführungsdauer der Anweisung, die Thread-Kennung des absetzenden Clients und der Zeitstempel der Ausführung.

Die Ausgabe von mysqlbinlog kann – beispielsweise durch Verwendung als Eingabe für mysql – neu ausgeführt werden, um die Anweisungen im Log erneut anzuwenden. Dies ist etwa zur Wiederherstellung nach einem Serverabsturz praktisch. Mehr Anwendungsbeispiele finden Sie im weiteren Verlauf dieses Abschnitts.

Normalerweise verwenden Sie mysqlbinlog zum direkten Auslesen von Binärlogdateien und zu deren Anwendung auf den lokalen MySQL Server. Es ist ferner möglich, Binärlogs von einem entfernten Server auszulesen, indem Sie die Option –read-from-remote-server verwenden. Wenn Sie entfernte Binärlogs auslesen, kann mit Verbindungsparameteroptionen angegeben werden, wie die Verbindung zum Server herzustellen ist. Diese Optionen sind –host, –password, –port, –protocol, –socket und –user; sie werden allerdings ignoriert, wenn Sie nicht auch die Option –read-from-remote-server angeben.

Sie können mit mysqlbinlog auch Relay-Logdateien auslesen, die von einem Slave-Server in einer Replikationskonfiguration geschrieben wurden. Relay-Logs haben das gleiche Format wie Binärlogdateien.

Weitere Informationen zu Binär- und Relay-Logs finden Sie in Abschnitt 5.12.3, „Die binäre Update-Logdatei“, und Abschnitt 6.4.4, „Relay- und Statusdateien bei der Replikation“.

mysqlbinlog unterstützt die folgenden Optionen:

* –help, -?Zeigt eine Hilfemeldung an und wird dann beendet.
* –base64-outputGibt alle Binärlogeinträge unter Verwendung der base64-Kodierung aus. Dies dient nur Debugzwecken. Logs, die mithilfe dieser Option erzeugt wurden, sollten nicht auf Produktionssysteme angewendet werden. Diese Option wurde in MySQL 5.1.5 hinzugefügt.
* –database=db_name, -d db_nameListet Einträge nur für genau diese Datenbank auf (nur lokales Log).
* –force-read, -fMit dieser Option gibt mysqlbinlog, wenn es ein Binärlogereignis liest, das es nicht erkennt, eine Warnung aus, ignoriert das Ereignis und fährt fort. Ohne diese Option beendet sich mysqlbinlog beim Lesen eines solchen Ereignisses.
* –hexdump, -HZeigt einen hexadezimalen Speicherauszug des Logs in Kommentaren an. Diese Ausgabe kann für das Debuggen der Replikation hilfreich sein. Das Format des hexadezimalen Speicherauszugs wird im weiteren Verlauf dieses Abschnitts beschrieben. Diese Option wurde in MySQL 5.1.2 hinzugefügt.
* –host=host_name, -h host_nameHolt das Binärlog vom MySQL Server des angegebenen Hosts.
* –local-load=path, -l pathBereitet lokale Temporärdateien für LOAD DATA INFILE im angegebenen Verzeichnis vor.
* –offset=N, -o NÃœberspringt die ersten N Einträge im Log.
* –password[=password], -p[password]Verwendet das angegebene Passwort zur Verbindung mit dem Server. Wenn Sie die Kurzform der Option (-p) verwenden, dürfen Sie kein Leerzeichen zwischen Option und Passwort setzen. Lassen Sie den Wert password auf die Option –password bzw. -p folgend weg, dann werden Sie zur Eingabe des Passworts aufgefordert.

Die Angabe eines Passworts direkt auf der Befehlszeile ist als nicht sicher einzuordnen. Siehe auch Abschnitt 5.9.6, „Wie Sie Ihre Kennwörter sicher halten“.
* –port=port_num, -P port_numDie TCP/IP-Portnummer, die zur Verbindung mit einem entfernten Server verwendet werden soll.
* –position=N, -j NVeraltet. Verwenden Sie stattdessen –start-position.
* –protocol={TCP|SOCKET|PIPE|MEMORY}Das zu verwendende Verbindungsprotokoll.
* –read-from-remote-server, -RLiest das Binärlog von einem MySQL Server, statt eine lokale Logdatei auszulesen. Sofern diese Option nicht angegeben ist, werden auch alle weiteren Verbindungsparameteroptionen ignoriert. Diese Optionen sind –host, –password, –port, –protocol, –socket und –user.
* –result-file=name, -r nameDie Ausgabe erfolgt direkt in die angegebene Datei.
* –server-id=idExtrahiert nur diejenigen Ereignisse, die vom Server mit der angegebenen Serverkennung stammen. Diese Option wurde in MySQL 5.1.4 hinzugefügt.
* –short-form, -sZeigt nur die im Log enthaltenen Anweisungen (d. h. keine zusätzlichen Informationen) an.
* –socket=path, -S pathBei Verbindungen mit localhost ist dies die zu verwendende Unix-Socketdatei bzw. (unter Windows) der Name der zu verwendenden Named Pipe.
* –start-datetime=datetimeStartet das Auslesen des Binärlogs beim ersten Ereignis, dessen Zeitstempel dem durch datetime angegebenen oder einem späteren Zeitpunkt entspricht. Der datetime-Wert ist relativ zur lokalen Zeitzone des Computers, auf dem Sie mysqlbinlog ausführen. Der Wert sollte in einem Format angegeben sein, das für die DATETIME- oder TIMESTAMP-Datentypen unterstützt wird. Zum Beispiel:

shell> mysqlbinlog –start-datetime=“2005-12-25 11:25:56″ binlog.000003

Diese Option ist für eine Point-in-Time-Wiederherstellung nützlich. Siehe auch Abschnitt 5.10.2, „Beispielhaftes Vorgehen zur Datensicherung und Wiederherstellung“.
* –stop-datetime=datetimeBeendet das Auslesen des Binärlogs beim ersten Ereignis, dessen Zeitstempel dem durch datetime angegebenen oder einem späteren Zeitpunkt entspricht. Diese Option ist für eine Point-in-Time-Wiederherstellung nützlich. Informationen zum datetime-Wert finden Sie weiter oben in der Beschreibung zur Option –start-datetime.
* –start-position=NStartet das Auslesen des Binärlogs beim ersten Ereignis, dessen Position dem Argument N entspricht.
* –stop-position=NBeendet das Auslesen des Binärlogs beim ersten Ereignis, dessen Position N oder höher ist.
* –to-last-log, -tBeendet die Verarbeitung nicht am Ende des bei einem MySQL Server angeforderten Binärlogs, sondern fährt mit der Ausgabe bis zum Ende des letzten Binärlogs fort. Wenn Sie die Ausgabe zum selben MySQL Server leiten, kann dies eine Endlosschleife verursachen. Diese Option erfordert –read-from-remote-server.
* –disable-log-bin, -DDeaktiviert das binäre Loggen. Dies ist nützlich zur Vermeidung einer Endlosschleife, wenn Sie die Option –to-last-log verwenden und die Ausgabe an denselben MySQL Server senden. Ferner ist die Option praktisch bei der Datenwiederherstellung nach einem Absturz: Sie vermeiden hiermit eine Duplizierung der protokollierten Anweisungen.

Für diese Option benötigen Sie die Berechtigung SUPER. Sie sorgt dafür, dass mysqlbinlog in seine Ausgabe eine SET SQL_LOG_BIN=0-Anweisung einfügt, um das binäre Loggen der restlichen Ausgabe zu deaktivieren. Die SET-Anweisung wird nur dann ausgeführt, wenn Sie die Berechtigung SUPER haben.
* –user=user_name, -u user_nameVerwendet den angegebenen MySQL-Benutzernamen zur Verbindung mit dem entfernten Server.
* –version, -VZeigt die Versionsinformation an und wird dann beendet.

Sie können mit der Syntax –var_name=value auch die folgenden Variablen einstellen:

* open_files_limitGibt die Anzahl der Deskriptoren für offene Dateien an, die reserviert werden müssen.

Es ist ferner möglich, Variablen über die Syntax –set-variable=var_name=value oder -O var_name=value einzustellen. Diese Syntax ist jedoch veraltet.

Sie können die Ausgabe von mysqlbinlog in den Client mysql umleiten, um die im Binärlog enthaltenen Anweisungen auszuführen. Diese Vorgehensweise dient der Wiederherstellung nach einem Absturz bei Vorhandensein eines alten Backups (siehe Abschnitt 5.10.1, „Datenbank-Datensicherungen“). Zum Beispiel:

shell> mysqlbinlog binlog.000001 | mysql

Oder:

shell> mysqlbinlog binlog.[0-9]* | mysql

Sie können die Ausgabe von mysqlbinlog stattdessen auch in eine Textdatei umleiten, wenn Sie das Anweisungslog zunächst modifizieren müssen (indem Sie beispielsweise Anweisungen entfernen, deren Ausführung Sie aus irgendeinem Grund nicht wünschen). Nach der Editierung der Datei führen Sie die enthaltenen Anweisungen aus, indem Sie sie als Eingabe für das Programm mysql verwenden.

mysqlbinlog verfügt über eine Option –start-position, die nur diejenigen Anweisungen ausgibt, deren Position mindestens der angegebenen Position entspricht (die angegebene Position muss mit dem Start genau eines Ereignisses zusammenfallen). Ferner sind Optionen zum Beenden und Starten bei Erkennung eines Ereignisses mit einem angegebenen Zeitpunkt (Datum und Uhrzeit) vorhanden. Dies ermöglicht Ihnen die Durchführung einer Point-in-Time-Wiederherstellung mithilfe der Option –stop-datetime: Sie können so etwa eine Wiederherstellung nach dem Prinzip „Datenbanken auf den Stand von heute, 10:30 Uhr, setzen“ durchführen.

Wenn Sie mehr als nur ein Binärlog auf dem MySQL Server ausführen wollen, besteht die sichere Methode darin, alle Logs über dieselbe Serververbindung zu verarbeiten. Das folgende Beispiel veranschaulicht, welche Vorgehensweise unsicher sein könnte:

shell> mysqlbinlog binlog.000001 | mysql # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql # DANGER!!

Eine derartige Verarbeitung von Binärlogs über verschiedene Serververbindungen verursacht Probleme, wenn die erste Logdatei eine CREATE TEMPORARY TABLE-Anweisung und das zweite Log eine Anweisung enthält, die die Temporärtabelle verwendet. Wenn der erste mysql-Prozess beendet wird, löscht der Server die Temporärtabelle. Versucht der zweite mysql-Prozess nun auf die Tabelle zuzugreifen, dann meldet der Server eine „unbekannte Tabelle“.

Um solche Probleme zu vermeiden, verwenden Sie stets die gleiche Verbindung zur Ausführung der Inhalte aller Binärlogs, die Sie verarbeiten wollen. Nachfolgend ist eine Möglichkeit beschrieben, dies zu erreichen:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql

Ein weiterer Ansatz besteht darin, alle Logs in eine einzelne Datei zu schreiben und diese Datei dann zu verarbeiten:

shell> mysqlbinlog binlog.000001 > /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -e „source /tmp/statements.sql“

mysqlbinlog kann eine Ausgabe erzeugen, die eine LOAD DATA INFILE-Operation ohne die ursprüngliche Datendatei reproduziert. mysqlbinlog kopiert die Daten in eine Temporärdatei und schreibt eine LOAD DATA LOCAL INFILE-Anweisung, die diese Datei referenziert. Die Standardposition des Verzeichnisses, in das diese Dateien geschrieben werden, ist systemspezifisch. Um ein Verzeichnis explizit anzugeben, verwenden Sie die Option –local-load.

Da mysqlbinlog LOAD DATA INFILE- in LOAD DATA LOCAL INFILE-Anweisungen konvertiert (d. h. LOCAL ergänzt), müssen sowohl der Client als auch der Server, den Sie zur Verarbeitung der Anweisungen verwenden, so konfiguriert sein, dass LOCAL unterstützt wird. Siehe auch Abschnitt 5.7.4, „Sicherheitsprobleme mit LOAD DATA LOCAL“.

Warnung: Die für die LOAD DATA LOCAL-Anweisungen erstellten Temporärdateien werden nicht automatisch gelöscht, weil sie benötigt werden, bis Sie diese Anweisungen tatsächlich ausführen. Sie sollten die Temporärdateien also selbst entfernen, wenn Sie das Anweisungslog nicht mehr benötigen. Die Dateien befinden sich im Temporärdateiverzeichnis und haben Namen wie original_file_name-#-#.

Die Option –hexdump erzeugt einen hexadezimalen Speicherauszug („Hex-Dump“) des Loginhalts in Kommentaren:

shell> mysqlbinlog –hexdump master-bin.000001

Beim obigen Befehl sieht die Ausgabe etwa so aus:

/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
# at 4
#051024 17:24:13 server id 1 end_log_pos 98
# Position Timestamp Type Master ID Size Master Pos Flags
# 00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00
# 00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
# 00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og…………..|
# 00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |…………….|
# 00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |…….C.8……|
# 00000057 04 04 04 04 12 00 00 4b 00 04 1a |…….K…|
# Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
# at startup
ROLLBACK;

Die Hex-Dump-Ausgabe enthält derzeit die nachfolgend aufgeführten Elemente. Das Format kann sich allerdings bei zukünftigen Versionen ändern.

* Position: Byteposition in der Logdatei.
* Timestamp: Zeitstempel des Ereignisses. Im gezeigten Beispiel ist ‚9d fc 5c 43‘ die Darstellung von ‚051024 17:24:13‘ in hexadezimaler Form.
* Type: Typ des Logereignisses. Im gezeigten Beispiel bedeutet ‚0f‘, dass das Beispielereignis FORMAT_DESCRIPTION_EVENT ist. Die nachfolgende Tabelle listet mögliche Typen auf.
Geben Sie nun Folgendes ein: Name Bedeutung
00 UNKNOWN_EVENT Dieses Ereignis sollte keinesfalls im Log vorhanden sein.
01 START_EVENT_V3 Zeigt den Anfang einer Logdatei an, die von MySQL 4 oder früher geschrieben wurde.
02 QUERY_EVENT Der häufigste Ereignistyp. Er bezeichnet Anweisungen, die auf dem Master-Server ausgeführt wurden.
03 STOP_EVENT Gibt an, dass der Master beendet wurde.
04 ROTATE_EVENT Wird geschrieben, wenn der Master eine neue Logdatei eröffnet.
05 INTVAR_EVENT Wird hauptsächlich für AUTO_INCREMENT-Werte und in Situationen verwendet, in denen die LAST_INSERT_ID()-Funktion in der Anweisung verwendet wird.
06 LOAD_EVENT Wird für LOAD DATA INFILE in MySQL 3.23 verwendet.
07 SLAVE_EVENT Für zukünftige Verwendung reserviert.
08 CREATE_FILE_EVENT Wird für LOAD DATA INFILE-Anweisungen verwendet. Hiermit wird der Start der Ausführung einer solchen Anweisung angezeigt. Auf dem Slave-Server wird eine Temporärdatei erstellt. Wird nur in MySQL 4 verwendet.
09 APPEND_BLOCK_EVENT Enthält Daten, die in einer LOAD DATA INFILE-Anweisung verwendet werden. Die Daten werden in einer Temporärdatei auf dem Slave gespeichert.
0a EXEC_LOAD_EVENT Wird für LOAD DATA INFILE-Anweisungen verwendet. Der Inhalt der Temporärdatei wird in der Tabelle auf dem Slave gespeichert. Wird nur in MySQL 4 verwendet.
0b DELETE_FILE_EVENT Rollback einer LOAD DATA INFILE-Anweisung. Die Temporärdatei auf dem Slave sollte gelöscht werden.
0c NEW_LOAD_EVENT Wird für LOAD DATA INFILE in MySQL 4 und früher verwendet.
0d RAND_EVENT Wird für den Versand von Informationen zu Zufallswerten benutzt, wenn die Funktion RAND() in der Anweisung verwendet wird.
0e USER_VAR_EVENT Dient der Replikation von Benutzervariablen.
0f FORMAT_DESCRIPTION_EVENT Zeigt den Anfang einer Logdatei an, die von MySQL 5 oder später geschrieben wurde.
10 XID_EVENT Ereignis, welches das Schreiben einer XA-Transaktion anzeigt.
11 BEGIN_LOAD_QUERY_EVENT Wird für LOAD DATA INFILE-Anweisungen in MySQL 5 und höher verwendet.
12 EXECUTE_LOAD_QUERY_EVENT Wird für LOAD DATA INFILE-Anweisungen in MySQL 5 und höher verwendet.
13 TABLE_MAP_EVENT Für zukünftige Verwendung reserviert.
14 WRITE_ROWS_EVENT Für zukünftige Verwendung reserviert.
15 UPDATE_ROWS_EVENT Für zukünftige Verwendung reserviert.
16 DELETE_ROWS_EVENT Für zukünftige Verwendung reserviert.
* Master ID: Serverkennung des Masters, der das Ereignis erstellt hat.
* Size: Größe des Ereignisses in Byte.
* Master Pos: Position des Ereignisses in der ursprünglichen Logdatei auf dem Master.
* Flags: 16 Flags. Zurzeit werden die nachfolgend aufgeführten Flags verwendet. Die übrigen sind für zukünftige Verwendung reserviert.
Flag Name Bedeutung
01 LOG_EVENT_BINLOG_IN_USE_F Logdatei korrekt geschlossen. (Wird nur in FORMAT_DESCRIPTION_EVENT verwendet.) Wenn bei einem Ereignis FORMAT_DESCRIPTION_EVENT das Flag gesetzt ist (d. h. wenn der Flagwert beispielsweise ’01 00′ lautet), dann wurde die Logdatei nicht korrekt geschlossen. In aller Regel liegt dies an einem Absturz des Masters (etwa aufgrund eines Stromausfalls).
02 Für zukünftige Verwendung reserviert.
04 LOG_EVENT_THREAD_SPECIFIC_F Ist gesetzt, wenn das Ereignis von der Verbindung abhängig ist, über die es erfolgte (z. B. ’04 00′). Ein solcher Fall liegt etwa vor, wenn das Ereignis Temporärtabellen verwendet.
08 LOG_EVENT_SUPPRESS_USE_F Wird unter bestimmten Umständen gesetzt, wenn das Ereignis nicht von der Standarddatenbank abhängt.

Die übrigen Flags sind für eine zukünftige Verwendung reserviert.

Mysql DB Check mit mysqlcheck

mysqlcheck — Hilfsprogramm für die Wartung und Reparatur von Tabellen

Der Client mysqlcheck prüft, repariert, optimiert und analysiert Tabellen.

mysqlcheck ähnelt hinsichtlich seines Funktionsumfangs myisamchk, funktioniert aber anders. Der wesentliche Unterschied besteht darin, dass mysqlcheck verwendet werden muss, wenn der Server mysqld ausgeführt wird, wohingegen myisamchk verwendet werden sollte, wenn er nicht läuft. Der Vorteil der Verwendung von mysqlcheck besteht darin, dass Sie den Server nicht beenden müssen, um Ihre Tabellen zu überprüfen oder zu reparieren.

mysqlcheck verwendet die SQL-Anweisungen CHECK TABLE, REPAIR TABLE, ANALYZE TABLE und OPTIMIZE TABLE auf eine für den Benutzer praktische Weise. Das Programm bestimmt, welche Anweisungen für die gewünschte Operation durchzuführen sind, und sendet diese Anweisungen dann zur Ausführung an den Server. Weitere Informationen dazu, bei welchen Speicher-Engines die jeweiligen Anweisungen funktionieren, finden Sie in Kapitel 13, SQL-Anweisungssyntax.

Die MyISAM-Speicher-Engine unterstützt alle vier Anweisungen, d. h., mysqlcheck kann zur Durchführung aller vier Operationen an MyISAM-Tabellen verwendet werden. Andere Speicher-Engines unterstützen nicht unbedingt alle Operationen. Gegebenenfalls wird eine Fehlermeldung angezeigt. Wenn beispielsweise test.t eine MEMORY-Tabelle ist, dann führt der Versuch, sie zu überprüfen, zu folgendem Ergebnis:

shell> mysqlcheck test t
test.t
note : The storage engine for the table doesn’t support check

Es gibt drei Möglichkeiten, mysqlcheck aufzurufen:

shell> mysqlcheck [options] db_name [tables]
shell> mysqlcheck [options] –databases db_name1 [db_name2 db_name3…]
shell> mysqlcheck [options] –all-databases

Wenn Sie auf db_name folgend keine Tabellen aufführen oder die Optionen –databases oder –all-databases verwenden, dann werden ganze Datenbanken überprüft.

mysqlcheck bietet eine im Vergleich zu anderen Clientprogrammen spezielle Funktion. Das Standardverhalten des Ãœberprüfens von Tabellen (–check) kann geändert werden, indem die Binärdatei umbenannt wird. Wenn Sie ein Tool benötigen, das Tabellen standardmäßig repariert, sollten Sie einfach eine Kopie von mysqlcheck namens mysqlrepair oder eine symbolische Verknüpfung zu mysqlcheck namens mysqlrepair erstellen. Wenn Sie dann mysqlrepair aufrufen, werden die Tabellen standardmäßig repariert.

Die folgenden Namen können verwendet werden, um das Standardverhalten von mysqlcheck zu ändern:
mysqlrepair Die Standardoption ist –repair.
mysqlanalyze Die Standardoption ist –analyze.
mysqloptimize Die Standardoption ist –optimize.

mysqlcheck unterstützt die folgenden Optionen:

* –help, -?Zeigt eine Hilfemeldung an und wird dann beendet.
* –all-databases, -AÃœberprüft alle Tabellen in allen Datenbanken. Dies entspricht der Option –databases bei gleichzeitiger Nennung aller Datenbanken auf der Befehlszeile.
* –all-in-1, -1Statt eine Anweisung für jede Tabelle einzeln abzusetzen, wird eine einzelne Anweisung für jede Datenbank ausgeführt, die alle zu verarbeitenden Tabellen aus dieser Datenbank benennt.
* –analyze, -aAnalysiert die Tabellen.
* –auto-repairWenn eine überprüfte Tabelle beschädigt ist, wird sie automatisch repariert. Reparaturarbeiten werden erledigt, nachdem alle Tabellen überprüft wurden.
* –character-sets-dir=pathDas Verzeichnis, in dem Zeichensätze installiert sind. Siehe auch Abschnitt 5.11.1, „Der für Daten und zum Sortieren benutzte Zeichensatz“.
* –check, -cÃœberprüft die Tabellen auf Fehler. Dies ist die Standardoperation.
* –check-only-changed, -CÃœberprüft nur solche Tabellen, die seit der letzten Ãœberprüfung geändert oder aber nicht korrekt geschlossen wurden.
* –compressKomprimiert alle Daten, die zwischen Client und Server ausgetauscht werden, sofern beide die Komprimierung unterstützen.
* –databases, -BVerarbeitet alle Tabellen in den aufgeführten Datenbanken. Normalerweise betrachtet mysqlcheck das erste Namensargument auf der Befehlszeile als Datenbank- und alle nachfolgenden Argumente als Tabellennamen. Bei dieser Option hingegen werden alle Namensargumente als Datenbanknamen behandelt.
* –debug[=debug_options], -# [debug_options]Schreibt ein Debuglog. Der String debug_options heißt häufig ‚d:t:o,file_name‘.
* –default-character-set=charset_nameVerwendet charset_name als Standardzeichensatz. Siehe auch Abschnitt 5.11.1, „Der für Daten und zum Sortieren benutzte Zeichensatz“.
* –extended, -eWenn Sie diese Option zur Ãœberprüfung von Tabellen einsetzen, ist sichergestellt, dass diese hundertprozentig konsistent sind; der Vorgang dauert allerdings sehr lange.Wenn Sie die Option bei der Reparatur von Tabellen einsetzen, wird eine erweiterte Reparatur durchgeführt, deren Ausführung nicht nur extrem lange dauert, sondern die auch eine Menge überflüssiger Datensätze erzeugt!
* –fast, -FÃœberprüft nur Tabellen, die nicht ordnungsgemäß geschlossen wurden.
* –force, -fDas Programm wird auch dann fortgesetzt, wenn ein SQL-Fehler auftritt.
* –host=host_name, -h host_nameStellt eine Verbindung zum MySQL Server auf dem angegebenen Host her.
* –medium-check, -mFührt eine Ãœberprüfung durch, die schneller ist als eine –extended-Operation. Hierdurch werden nur 99,99 Prozent aller Fehler gefunden (dies sollte allerdings in den meisten Fällen ausreichend sein).
* –optimize, -oOptimiert die Tabellen.
* –password[=password], -p[password]Verwendet das angegebene Passwort zur Verbindung mit dem Server. Wenn Sie die Kurzform der Option (-p) verwenden, dürfen Sie kein Leerzeichen zwischen Option und Passwort setzen. Lassen Sie den Wert password auf die Option –password bzw. -p folgend weg, dann werden Sie zur Eingabe des Passworts aufgefordert.Die Angabe eines Passworts direkt auf der Befehlszeile ist als nicht sicher einzuordnen. Siehe auch Abschnitt 5.9.6, „Wie Sie Ihre Kennwörter sicher halten“.
* –port=port_num, -P port_numDie TCP/IP-Portnummer, die für die Verbindung verwendet werden soll.
* –protocol={TCP|SOCKET|PIPE|MEMORY}Das zu verwendende Verbindungsprotokoll.
* –quick, -qWenn Sie mit dieser Option Tabellen überprüfen, wird verhindert, dass die Datensätze auf falsche Verknüpfungen geprüft werden. Dies ist die schnellste Prüfmethode.Wenn Sie die Option bei der Reparatur von Tabellen einsetzen, wird versucht, nur den Indexbaum zu reparieren. Dies ist die schnellste Reparaturmethode.
* –repair, -rFührt eine Reparatur durch, die fast alle Fehler beheben kann. Ausgenommen sind lediglich eindeutige Schlüssel, die nicht eindeutig sind.
* –silent, -sStummer Modus. Gibt nur Fehlermeldungen aus.
* –socket=path, -S pathBei Verbindungen mit localhost ist dies die zu verwendende Unix-Socketdatei bzw. (unter Windows) der Name der zu verwendenden Named Pipe.
* –tablesSetzt die Option –databases bzw. -B außer Kraft. Alle auf die Option folgenden Namensargumente werden als Tabellennamen betrachtet.
* –user=user_name, -u user_nameVerwendet den angegebenen MySQL-Benutzernamen zur Verbindung mit dem Server.
* –verbose, -vAusführlicher Modus. Gibt Informationen zu den verschiedenen Stufen des Programmablaufs aus.
* –version, -VZeigt die Versionsinformation an und wird dann beendet.

Mysql root Passwort vergessen?

Ein Reset des Mysql ROOT-Passwort ist recht einfach, solange man einen SSH Zugang zum Server hat. (Beispiel: SuSE)

  • Stop mysql service
    rcmysql stop
    
  • Start to MySQL server w/o password:
    mysqld_safe --skip-grant-tables &
    
  • Connect to mysql server using mysql client:
    mysql -u root
    
  • Setup new MySQL root user password
    mysql> use mysql;
    mysql> update user set password=PASSWORD("neues-passwort") where User='root';
    mysql> flush privileges;
    mysql> quit
    
  • 5: Stop MySQL Server:
    rcmysql stop
    
  • Start MySQL Server
     
    rcmysql start
    
  • Login Test
    mysql -u root -p