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-output
            
Gibt 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_name
Listet Einträge nur für genau diese Datenbank auf (nur lokales Log).
              --force-read, -f
            
Mit 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, -H
            
Zeigt 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_name
Holt das Binärlog vom MySQL Server des angegebenen Hosts.
              --local-load=,
              path-l 
            path
              Bereitet 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_num
Die TCP/IP-Portnummer, die zur Verbindung mit einem entfernten Server verwendet werden soll.
              --position=,
              N-j 
            N
              Veraltet. Verwenden Sie stattdessen
              --start-position.
            
              --protocol={TCP|SOCKET|PIPE|MEMORY}
            
Das zu verwendende Verbindungsprotokoll.
              --read-from-remote-server,
              -R
            
              Liest 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 
            name
Die Ausgabe erfolgt direkt in die angegebene Datei.
              --server-id=
            id
Extrahiert nur diejenigen Ereignisse, die vom Server mit der angegebenen Serverkennung stammen. Diese Option wurde in MySQL 5.1.4 hinzugefügt.
              --short-form, -s
            
Zeigt nur die im Log enthaltenen Anweisungen (d. h. keine zusätzlichen Informationen) an.
              --socket=,
              path-S 
            path
              Bei Verbindungen mit localhost ist dies
              die zu verwendende Unix-Socketdatei bzw. (unter Windows)
              der Name der zu verwendenden Named Pipe.
            
              --start-datetime=
            datetime
              Startet 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=
            datetime
              Beendet 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=
            N
              Startet das Auslesen des Binärlogs beim ersten Ereignis,
              dessen Position dem Argument N
              entspricht.
            
              --stop-position=
            N
              Beendet das Auslesen des Binärlogs beim ersten Ereignis,
              dessen Position N oder höher
              ist.
            
              --to-last-log, -t
            
              Beendet 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, -D
            
              Deaktiviert 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_name
Verwendet den angegebenen MySQL-Benutzernamen zur Verbindung mit dem entfernten Server.
              --version, -V
            
Zeigt die Versionsinformation an und wird dann beendet.
          Sie können mit der Syntax
          --
          auch die folgenden Variablen einstellen:
        var_name=value
          Es ist ferner möglich, Variablen über die Syntax
          --set-variable=
          oder var_name=value-O
          
          einzustellen. Diese Syntax ist jedoch
          veraltet.
        var_name=value
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.sqlshell>mysqlbinlog binlog.000002 >> /tmp/statements.sqlshell>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 dieLAST_INSERT_ID()-Funktion in
                      der Anweisung verwendet wird. | 
| 06 | LOAD_EVENT | Wird für LOAD DATA INFILEin 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 INFILEin 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_EVENTverwendet.) Wenn bei einem EreignisFORMAT_DESCRIPTION_EVENTdas
                      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.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.

