DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) binary-log

Info Catalog (mysql.info) query-log (mysql.info) log-files (mysql.info) slow-query-log
 
 5.12.3 The Binary Log
 ---------------------
 
 The binary log contains all statements that update data or 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 replaced the old update log, which is no
 longer available as of MySQL 5.0. 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.
 
 The binary log does not contain statements that do not modify any data.
 If you want to log all statements (for example, to identify a problem
 query), use the general query log. See  query-log.
 
 The primary purpose of the binary log is to be able to update databases
 during a restore operation as fully as possible, because the binary log
 contains all updates done after a backup was made. The binary log is
 also used on master replication servers as a record of the statements
 to be sent to slave servers. See  replication.
 
 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[=BASE_NAME] option, `mysqld' writes a
 log file containing all SQL commands that update data. If no BASE_NAME
 value is given, the default name is the name of the 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  open-bugs, for the
 reason.
 
 If you supply an extension in the log name (for example,
 -log-bin=BASE_NAME.EXTENSION), the extension is silently removed and
 ignored.
 
 `mysqld' appends a numeric extension to the binary log basename. The
 number increases each time the server creates a new log file, thus
 creating an ordered series of files. The server creates a new binary
 log file 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[=FILE_NAME] option. You
 should not manually edit this file while `mysqld' is running; doing so
 would confuse `mysqld'.
 
 Writes to the binary log file and binary log index file are handled in
 the same way as writes to `MyISAM' tables. See  full-disk.
 
 You can delete all binary log files with the `RESET MASTER' statement,
 or a subset of them with `PURGE MASTER LOGS'. See  reset, and
  replication-master-sql.
 
 The binary log format has some known limitations that can affect
 recovery from backups. See  replication-features.
 
 Binary logging for stored routines and triggers is done as described in
  stored-procedure-logging.
 
 You can use the following options to `mysqld' to affect what is logged
 to the binary log. See also the discussion that follows this option
 list.
 
 If you are using replication, the options described here affect which
 statements are sent by a master server to its slaves.  There are also
 options for slave servers that control which statements received from
 the master to execute or ignore. For details, see 
 replication-options.
 
    * -binlog-do-db=DB_NAME
 
      Tell the server to restrict binary logging to updates for which
      the default database is DB_NAME (that is, the database selected by
      `USE'). All other databases that are not explicitly mentioned are
      ignored. If you use this option, you should ensure that you do
      updates only in the default database.
 
      There is an exception to this for `CREATE DATABASE', `ALTER
      DATABASE', and `DROP DATABASE' statements. The server uses the
      database named in the statement (not the default database) to
      decide whether it should log the statement.
 
      An example of what does not work as you might expect: If the
      server is started with `binlog-do-db=sales', and you run `USE
      prices; UPDATE sales.january SET amount=amount+1000;', this
      statement is _not_ written into the binary log.
 
      To log multiple databases, use multiple options, specifying the
      option once for each database.
 
    * -binlog-ignore-db=DB_NAME
 
      Tell the server to suppress binary logging of updates for which
      the default database is DB_NAME (that is, the database selected by
      `USE'). If you use this option, you should ensure that you do
      updates only in the default database.
 
      As with the -binlog-do-db option, there is an exception for the
      `CREATE DATABASE', `ALTER DATABASE', and `DROP DATABASE'
      statements. The server uses the database named in the statement
      (not the default database) to decide whether it should log the
      statement.
 
      An example of what does not work as you might expect: If the
      server is started with `binlog-ignore-db=sales', and you run `USE
      prices; UPDATE sales.january SET amount=amount+1000;', this
      statement _is_ written into the binary log.
 
      To ignore multiple databases, use multiple options, specifying the
      option once for each database.
 
 The server evaluates the options for logging or ignoring updates to the
 binary log according to the following rules. As described previously,
 there is an exception for the `CREATE DATABASE', `ALTER DATABASE', and
 `DROP DATABASE' statements. In those cases, the database being
 _created, altered, or dropped_ replaces the default database in the
 following rules.
 
   1. 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.
 
   2. 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.
 
   3. 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.
 
   4. 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.
 
 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 MASTER LOGS', which
 also safely updates the binary log index file for you (and which can
 take a date argument). See  replication-master-sql.
 
 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 
 set-option.
 
 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  mysqlbinlog, 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.
 
 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) can be used
 to restrict the total size used to cache a multiple-statement
 transaction. If a transaction is larger than this, it fails and rolls
 back.
 
 If you are using the binary log, concurrent inserts are converted to
 normal inserts for `CREATE ...  SELECT' or `INSERT ... SELECT'
 statement. This is done to ensure that you can re-create an exact copy
 of your tables by applying the log during a backup operation.
 
 Note that the binary log format is different in MySQL 5.0 from previous
 versions of MySQL, due to enhancements in replication. See 
 replication-compatibility.
 
 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  server-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, which adds
 consistency between the content of `InnoDB' tables and the binary log.
 (Note: -innodb-safe-binlog is unneeded as of MySQL 5.0; it was made
 obsolete by the introduction of XA transaction support.)
 
 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.
 
Info Catalog (mysql.info) query-log (mysql.info) log-files (mysql.info) slow-query-log
automatically generated byinfo2html