Rechercher dans le manuel MySQL
7.5 Point-in-Time (Incremental) Recovery Using the Binary Log
[+/-]
Point-in-time recovery refers to recovery of data changes made since a given point in time. Typically, this type of recovery is performed after restoring a full backup that brings the server to its state as of the time the backup was made. (The full backup can be made in several ways, such as those listed in Section 7.2, “Database Backup Methods”.) Point-in-time recovery then brings the server up to date incrementally from the time of the full backup to a more recent time.
Many of the examples here use the mysql
client to process binary log output produced by
mysqlbinlog. If your binary log contains
\0
(null) characters, that output cannot be
parsed by mysql unless you invoke it with the
--binary-mode
option.
The source of information for point-in-time recovery is the set of
incremental backups represented by the binary log files generated
subsequent to the full backup operation. Therefore, the server
must be started with the --log-bin
option to enable binary logging (see
Section 5.4.4, “The Binary Log”).
To restore data from the binary log, you must know the name and
location of the current binary log files. By default, the server
creates binary log files in the data directory, but a path name
can be specified with the --log-bin
option to place the files in a different location.
Section 5.4.4, “The Binary Log”.
To see a listing of all binary log files, use this statement:
To determine the name of the current binary log file, issue the following statement:
The mysqlbinlog utility converts the events in the binary log files from binary format to text so that they can be executed or viewed. mysqlbinlog has options for selecting sections of the binary log based on event times or position of events within the log. See Section 4.6.8, “mysqlbinlog — Utility for Processing Binary Log Files”.
Executing events from the binary log causes the data modifications they represent to be redone. This enables recovery of data changes for a given span of time. To execute events from the binary log, process mysqlbinlog output using the mysql client:
shell> mysqlbinlog binlog_files | mysql -u root -p
If binary log files have been encrypted, which can be done from
MySQL 8.0.14 onwards, mysqlbinlog cannot read
them directly as in the above example, but can read them from the
server using the
--read-from-remote-server
(-R
) option. For example:
shell> mysqlbinlog --read-from-remote-server --host=host_name --port=3306 --user=root --password --ssl-mode=required binlog_files | mysql -u root -p
Here, the option --ssl-mode=required
has been
used to ensure that the data from the binary log files is
protected in transit, because it is sent to
mysqlbinlog in an unencrypted format.
Viewing log contents can be useful when you need to determine event times or positions to select partial log contents prior to executing events. To view events from the log, send mysqlbinlog output into a paging program:
shell> mysqlbinlog binlog_files | more
Alternatively, save the output in a file and view the file in a text editor:
shell> mysqlbinlog binlog_files > tmpfile
shell> ... edit tmpfile ...
Saving the output in a file is useful as a preliminary to
executing the log contents with certain events removed, such as an
accidental DROP DATABASE
. You can
delete from the file any statements not to be executed before
executing its contents. After editing the file, execute the
contents as follows:
shell> mysql -u root -p < tmpfile
If you have more than one binary log to execute on the MySQL server, the safe method is to process them all using a single connection to the server. Here is an example that demonstrates what may be unsafe:
shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!
Processing binary logs this way using different connections to the
server causes problems if the first log file contains a
CREATE TEMPORARY
TABLE
statement and the second log contains a statement
that uses the temporary table. When the first
mysql process terminates, the server drops the
temporary table. When the second mysql process
attempts to use the table, the server reports “unknown
table.”
To avoid problems like this, use a single connection to execute the contents of all binary logs that you want to process. Here is one way to do so:
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
Another approach is to write all the logs to a single file and then process the file:
shell> mysqlbinlog binlog.000001 > /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -u root -p -e "source /tmp/statements.sql"
When writing to a dump file while reading back from a binary log
containing GTIDs (see Section 17.1.3, “Replication with Global Transaction Identifiers”), use
the --skip-gtids
option with
mysqlbinlog, like this:
shell> mysqlbinlog --skip-gtids binlog.000001 > /tmp/dump.sql
shell> mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql
shell> mysql -u root -p -e "source /tmp/dump.sql"
Document created the 26/06/2006, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/mysql-rf-point-in-time-recovery.html
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.
References
These references and links indicate documents consulted during the writing of this page, or which may provide additional information, but the authors of these sources can not be held responsible for the content of this page.
The author This site is solely responsible for the way in which the various concepts, and the freedoms that are taken with the reference works, are presented here. Remember that you must cross multiple source information to reduce the risk of errors.