The world's most popular open source database
The binary log contains all statements that update data or
(starting from MySQL 4.1.3) potentially could have updated it
(for example, a DELETE which
matched no rows). Statements are stored in the form of
“events” that describe the modifications. The
binary log also contains information about how long each
statement took that updated data. The binary log has two
important purposes:
For replication, the binary log is used on master replication servers as a record of the statements to be sent to slave servers. The master server sends the events contained in its binary log to its slaves, which execute those events to make the same data changes that were made on the master. See Section 14.2, “Replication Implementation Overview”.
Certain data recovery operations require use of the binary log. After a backup file has been restored, the events in the binary log that were recorded after the backup was made are re-executed. These events bring databases up to date from the point of the backup. See Section 6.2.2, “Using Backups for Recovery”.
The binary log has replaced the old update log, which is being phased out of future MySQL release series after 4.1. The binary log contains all information that is available in the update log in a more efficient format and in a manner that is transaction-safe. If you are using transactions, you must use the MySQL binary log for backups instead of the old update log.
For information about server options and variables affecting the operation of binary logging, see Section 14.8.4, “Binary Log Options and Variables”.
The binary log is not used for statements such as
SELECT or SHOW
that do not modify data. If you want to log all statements (for
example, to identify a problem query), use the general query
log. See Section 5.3.2, “The General Query Log”.
MySQL Enterprise. The binary log can also be used to track significant DDL events. Analyzing the binary log in this way is an integral part of the MySQL Enterprise Monitor. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
Running the server with the binary log enabled makes performance about 1% slower. However, the benefits of the binary log for restore operations and in allowing you to set up replication generally outweigh this minor performance decrement.
When started with the
--log-bin[=
option, mysqld writes a log file containing
all SQL statements that update data (both DDL and DML
statements). If no base_name]base_name value is
given, the default name is the value of the
pid-file option (which by default is the name
of host machine) followed by -bin. If the
basename is given, but not as an absolute pathname, the server
writes the file in the data directory. It is recommended that
you specify a basename; see Section A.1.8.4, “Open Issues in MySQL”, for the
reason.
If you supply an extension in the log name (for example,
--log-bin=),
the extension is silently removed and ignored.
base_name.extension
mysqld appends a numeric extension to the
binary log basename to generate binary log filenames. The number
increases each time the server creates a new log file, thus
creating an ordered series of files. The server creates a new
file in the series each time it starts or flushes the logs. The
server also creates a new binary log file automatically when the
current log's size reaches max_binlog_size. A
binary log file may become larger than
max_binlog_size if you are using large
transactions because a transaction is written to the file in one
piece, never split between files.
To keep track of which binary log files have been used,
mysqld also creates a binary log index file
that contains the names of all used binary log files. By
default, this has the same basename as the binary log file, with
the extension '.index'. You can change the
name of the binary log index file with the
--log-bin-index[=
option. You should not manually edit this file while
mysqld is running; doing so would confuse
mysqld.
file_name]
You can delete all binary log files with the
RESET MASTER statement, or a
subset of them with PURGE BINARY
LOGS. See Section 12.5.6.5, “RESET Syntax”, and
Section 12.6.1.1, “PURGE BINARY LOGS Syntax”.
Before MySQL 4.1.9, writes to a binary log file or binary log
index file that failed due to a full disk or an exceeded quota
resulted in corruption of the file. Starting from MySQL 4.1.9,
writes to the binary log file and binary log index file are
handled the same way as writes to MyISAM
tables. See Section A.1.4.3, “How MySQL Handles a Full Disk”.
The binary log format has some known limitations that can affect
recovery from backups, especially in old versions. These
caveats, which also affect replication, are listed at
Section 14.7, “Replication Features and Known Problems”. One caveat which does
not affect replication but only recovery with
mysqlbinlog: before MySQL 4.1,
mysqlbinlog could not prepare output suitable
for mysql if the binary log contained
interlaced statements originating from different clients that
used temporary tables of the same name. This is fixed in MySQL
4.1. However, the problem still existed for
LOAD DATA
INFILE statements until it was fixed in MySQL 4.1.8.
A replication slave server by default does not write to its own
binary log any data modifications that are received from the
replication master. To log these modifications, start the slave
with the --log-slave-updates option (see also
Section 14.8.3, “Replication Slave Options and Variables”).
Evaluation of update selection options. The server evaluates the options for logging or ignoring updates to the binary log according to the following rules:
Are there --binlog-do-db or
--binlog-ignore-db rules?
No: Write the statement to the binary log and exit.
Yes: Go to the next step.
There are some rules (--binlog-do-db,
--binlog-ignore-db, or both). Is there a
default database (has any database been selected by
USE?)?
No: Do not write the statement, and exit.
Yes: Go to the next step.
There is a default database. Are there some
--binlog-do-db rules?
Yes: Does the default database match any of the
--binlog-do-db rules?
Yes: Write the statement and exit.
No: Do not write the statement, and exit.
No: Go to the next step.
There are some --binlog-ignore-db rules.
Does the default database match any of the
--binlog-ignore-db rules?
Yes: Do not write the statement, and exit.
No: Write the query and exit.
An exception is made in the rules just given for the
CREATE DATABASE,
ALTER DATABASE, and
DROP DATABASE statements (see
Section 14.8.4, “Binary Log Options and Variables”). In those
cases, the database being created, altered, or
dropped replaces the default database when
determining whether to log or ignore updates.
For example, a slave running with only
--binlog-do-db=sales does not write to the
binary log any statement for which the default database is
different from sales (in other words,
--binlog-do-db can sometimes mean “ignore
other databases”).
If you are using replication, you should not delete old binary
log files until you are sure that no slave still needs to use
them. For example, if your slaves never run more than three days
behind, once a day you can execute mysqladmin
flush-logs on the master and then remove any logs that
are more than three days old. You can remove the files manually,
but it is preferable to use PURGE BINARY
LOGS, which also safely updates the binary log index
file for you (and which can take a date argument as of MySQL
4.1). See Section 12.6.1.1, “PURGE BINARY LOGS Syntax”.
A client that has the SUPER
privilege can disable binary logging of its own statements by
using a SET sql_log_bin=0 statement. See
Section 5.1.4, “Session System Variables”.
You can display the contents of binary log files with the mysqlbinlog utility. This can be useful when you want to reprocess statements in the log. For example, you can update a MySQL server from the binary log as follows:
shell> mysqlbinlog log_file | mysql -h server_name
See Section 4.6.6, “mysqlbinlog — Utility for Processing Binary Log Files”, for more information on the mysqlbinlog utility and how to use it. mysqlbinlog also can be used with relay log files because they are written using the same format as binary log files.
Binary logging is done immediately after a statement completes but before any locks are released or any commit is done. This ensures that the log is logged in execution order.
Updates to non-transactional tables are stored in the binary log
immediately after execution. Within an uncommitted transaction,
all updates (UPDATE,
DELETE, or
INSERT) that change transactional
tables such as BDB or
InnoDB tables are cached until a
COMMIT statement is received by
the server. At that point, mysqld writes the
entire transaction to the binary log before the
COMMIT is executed. When the
thread that handles the transaction starts, it allocates a
buffer of binlog_cache_size to buffer
statements. If a statement is bigger than this, the thread opens
a temporary file to store the transaction. The temporary file is
deleted when the thread ends.
Modifications to non-transactional tables cannot be rolled back.
If a transaction that is rolled back includes modifications to
non-transactional tables, the entire transaction is logged with
a ROLLBACK
statement at the end to ensure that the modifications to those
tables are replicated. This is true as of MySQL 4.0.15.
The Binlog_cache_use status variable shows
the number of transactions that used this buffer (and possibly a
temporary file) for storing statements. The
Binlog_cache_disk_use status variable shows
how many of those transactions actually had to use a temporary
file. These two variables can be used for tuning
binlog_cache_size to a large enough value
that avoids the use of temporary files.
The max_binlog_cache_size system variable
(default 4GB, which is also the maximum) can be used to restrict
the total size used to cache a multiple-statement transaction.
If a transaction is larger than this many bytes, it fails and
rolls back. The minimum value is 4096.
If you are using the update log or binary log, concurrent
inserts are converted to normal inserts for CREATE ...
SELECT or INSERT ... SELECT
statements. This is done to ensure that you can re-create an
exact copy of your tables by applying the log during a backup
operation.
The binary log format differs between versions 3.23 and 4.0. (These format changes were required to implement enhancements to replication.) However, MySQL 4.1 has the same binary log format as 4.0. See Section 14.5, “Replication Compatibility Between MySQL Versions”.
By default, the binary log is not synchronized to disk at each
write. So if the operating system or machine (not only the MySQL
server) crashes, there is a chance that the last statements of
the binary log are lost. To prevent this, you can make the
binary log be synchronized to disk after every
N writes to the binary log, with the
sync_binlog system variable. See
Section 5.1.3, “System Variables”. 1 is the safest value
for sync_binlog, but also the slowest. Even
with sync_binlog set to 1, there is still the
chance of an inconsistency between the table content and binary
log content in case of a crash. For example, if you are using
InnoDB tables and the MySQL server processes
a COMMIT statement, it writes the
whole transaction to the binary log and then commits this
transaction into InnoDB. If the server
crashes between those two operations, the transaction is rolled
back by InnoDB at restart but still exists in
the binary log. This problem can be solved with the
--innodb-safe-binlog option (available starting
from MySQL 4.1.3), which adds consistency between the content of
InnoDB tables and the binary log.
For this option to provide a greater degree of safety, the MySQL
server should also be configured to synchronize the binary log
and the InnoDB logs to disk at every
transaction. The InnoDB logs are synchronized
by default, and sync_binlog=1 can be used to
synchronize the binary log. The effect of this option is that at
restart after a crash, after doing a rollback of transactions,
the MySQL server cuts rolled back InnoDB
transactions from the binary log. This ensures that the binary
log reflects the exact data of InnoDB tables,
and so, that the slave remains in synchrony with the master (not
receiving a statement which has been rolled back).
Note that --innodb-safe-binlog can be used even
if the MySQL server updates other storage engines than
InnoDB. Only statements and transactions that
affect InnoDB tables are subject to removal
from the binary log at InnoDB's crash
recovery. If the MySQL server discovers at crash recovery that
the binary log is shorter than it should have been, it lacks at
least one successfully committed InnoDB
transaction. This should not happen if
sync_binlog=1 and the disk/filesystem do an
actual sync when they are requested to (some don't), so the
server prints an error message The binary log
<name> is shorter than its expected size. In
this case, this binary log is not correct and replication should
be restarted from a fresh snapshot of the master's data.


User Comments
IF using binlog-format=ROW
and
binlog-do-db=sales
and you run
USE prices; UPDATE sales.january SET amount=amount+1000;
The record WILL be written to the binary log. Notice binlog-format is ROW not STATEMENT.
Add your own comment.