4.6.7.3 Использование mysqlbinlog для резервного копирования файлов бинарного журнала
По умолчанию, mysqlbinlog считывает файлы бинарного журнала и отображает их содержимое в текстовом формате. Это позволяет вам легче изучать события в файлах и повторно выполнять их (например, используя вывод в качестве входных данных для mysql). mysqlbinlog может считывать файлы журнала непосредственно из локальной файловой системы или, с помощью опции --read-from-remote-server, подключаться к серверу и запрашивать содержимое бинарного журнала у этого сервера. mysqlbinlog записывает текстовый вывод в стандартный вывод или в файл, указанный в качестве значения опции --result-file=, если эта опция задана. file_name
Возможности резервного копирования mysqlbinlog
mysqlbinlog может считывать файлы бинарного журнала и записывать новые файлы, содержащие то же содержимое — то есть в двоичном формате, а не в текстовом. Эта возможность позволяет легко создавать резервную копию бинарного журнала в его исходном формате. mysqlbinlog может выполнить статическую резервную копию, резервируя набор файлов журнала и останавливаясь при достижении конца последнего файла. Он также может выполнять непрерывную (“динамическую”) резервную копию, оставаясь подключенным к серверу при достижении конца последнего файла журнала и продолжая копировать новые события по мере их генерации. В режиме непрерывной резервной копии mysqlbinlog работает до тех пор, пока соединение не будет завершено (например, при выходе сервера) или mysqlbinlog не будет принудительно завершен. При завершении соединения mysqlbinlog не ожидает и не пытается повторно подключиться, в отличие от сервера репликации. Для продолжения динамической резервной копии после перезапуска сервера необходимо также перезапустить mysqlbinlog.
Опции резервного копирования mysqlbinlog
Для резервного копирования бинарного журнала вам необходимо вызвать mysqlbinlog как минимум с двумя опциями:
Опция
--read-from-remote-server(или-R) сообщает mysqlbinlog подключиться к серверу и запросить его бинарный журнал. (Это аналогично подключению сервера репликации к его серверу репликации.)Опция
--rawсообщает mysqlbinlog записывать сырой (двоичный) вывод, а не текстовый.
Наряду с --read-from-remote-server, обычно указываются и другие опции: --host указывает, где запущен сервер, а вам также могут потребоваться опции подключения, такие как --user и --password.
Несколько других опций полезны в сочетании с --raw:
--stop-never: Оставаться подключенным к серверу после достижения конца последнего файла журнала и продолжать чтение новых событий.--stop-never-slave-server-id=: Идентификатор сервера, который mysqlbinlog сообщает серверу при использованииid--stop-never. По умолчанию 65535. Это можно использовать для предотвращения конфликта с идентификатором сервера репликации или другого процесса mysqlbinlog. См. Раздел 4.6.7.4, «Указание идентификатора сервера mysqlbinlog».--result-file: Префикс для имён файлов вывода, как описано ниже.
Статические и динамические резервные копии
Для резервного копирования файлов бинарного журнала сервера с помощью mysqlbinlog, необходимо указать имена файлов, которые фактически существуют на сервере. Если вы их не знаете, подключитесь к серверу и используйте оператор SHOW
BINARY LOGS, чтобы увидеть текущие имена. Предположим, что оператор выдал такой вывод:
mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000130 | 27459 |
| binlog.000131 | 13719 |
| binlog.000132 | 43268 |
+---------------+-----------+
С этой информацией вы можете использовать mysqlbinlog для резервного копирования бинарного журнала в текущую директорию следующим образом (вводите каждую команду в отдельной строке):
-
Для создания статической резервной копии с
binlog.000130поbinlog.000132, используйте одну из этих команд:mysqlbinlog --read-from-remote-server --host=
host_name--raw binlog.000130 binlog.000131 binlog.000132 mysqlbinlog --read-from-remote-server --host=host_name--raw --to-last-log binlog.000130Первая команда указывает каждое имя файла явно. Вторая указывает только первый файл и использует
--to-last-logдля чтения до последнего. Различие между этими командами заключается в том, что если сервер откроетbinlog.000133до того, как mysqlbinlog достигнет концаbinlog.000132, первая команда его не прочитает, а вторая — прочитает. -
Для создания динамической резервной копии, в которой mysqlbinlog начнёт с
binlog.000130для копирования существующих файлов журнала, а затем останется подключенным для копирования новых событий по мере их генерации сервером:mysqlbinlog --read-from-remote-server --host=
host_name--raw --stop-never binlog.000130С
--stop-never, нет необходимости указывать--to-last-logдля чтения до последнего файла журнала, потому что эта опция подразумевается.
Именование файлов вывода
Без --raw, mysqlbinlog генерирует текстовый вывод, а опция --result-file, если указана, определяет имя единственного файла, в который записывается весь вывод. С --raw, mysqlbinlog записывает один двоичный файл вывода для каждого файла журнала, передаваемого с сервера. По умолчанию mysqlbinlog записывает файлы в текущем каталоге с теми же именами, что и исходные файлы журналов. Для изменения имён файлов вывода используйте опцию --result-file. В сочетании с --raw, значение опции --result-file обрабатывается как префикс, который изменяет имена файлов вывода.
Предположим, что на сервере в настоящее время имеются файлы двоичного журнала с именами binlog.000999 и далее. Если вы используете mysqlbinlog --raw для резервного копирования файлов, опция --result-file создаёт имена файлов вывода, как показано в следующей таблице. Вы можете записать файлы в определённый каталог, начав значение --result-file с пути к каталогу. Если значение --result-file состоит только из имени каталога, значение должно заканчиваться символом разделителя пути. Файлы вывода перезаписываются, если они существуют.
--result-file Опция | Имена файлов вывода |
|---|---|
--result-file=x |
xbinlog.000999 и далее |
--result-file=/tmp/ |
/tmp/binlog.000999 и далее |
--result-file=/tmp/x |
/tmp/xbinlog.000999 и далее |
Пример: mysqldump + mysqlbinlog для резервного копирования и восстановления
В следующем примере описана простая ситуация, показывающая, как использовать mysqldump и mysqlbinlog совместно для резервного копирования данных и двоичного журнала сервера, а также как использовать резервную копию для восстановления сервера в случае потери данных. Пример предполагает, что сервер работает на хосте host_name, а его первый файл двоичного журнала называется binlog.000999. Введите каждую команду в отдельной строке.
Используйте mysqlbinlog для непрерывного резервного копирования двоичного журнала:
mysqlbinlog --read-from-remote-server --host=host_name --raw
--stop-never binlog.000999
Используйте mysqldump для создания файла дампа как моментальной копии данных сервера. Используйте --all-databases, --events и --routines для резервного копирования всех данных, и --master-data=2 для включения текущих координат двоичного журнала в файл дампа.
mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file
Периодически выполняйте команду mysqldump, чтобы создавать новые моментальные снимки по мере необходимости.
Если произошла потеря данных (например, если сервер неожиданно завершил работу), используйте самый последний файл дампа для восстановления данных:
mysql --host=host_name -u root -p < dump_file
Затем используйте резервную копию двоичного журнала для повторного выполнения событий, записанных после координат, указанных в файле дампа. Предположим, что координаты в файле выглядят так:
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.001002', MASTER_LOG_POS=27284;
Если самый последний резервный файл журнала имеет имя binlog.001004, повторно выполните события журнала так:
mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004
| mysql --host=host_name -u root -p
Вам может быть проще скопировать файлы резервной копии (файл дампа и файлы двоичного журнала) на серверный хост, чтобы упростить операцию восстановления, или если MySQL не позволяет удалённый root доступ.
Ограничения резервного копирования mysqlbinlog
Резервные копии двоичных журналов с помощью mysqlbinlog подчиняются следующим ограничениям:
mysqlbinlog не автоматически подключается к серверу MySQL, если соединение потеряно (например, если произошёл перезапуск сервера или есть сетевой сбой).
До MySQL 5.7.19, mysqlbinlog не получает все события по мере их фиксации, даже если сервер настроен с
sync_binlog=1. Это означает, что некоторые из самых последних событий могут отсутствовать. Чтобы убедиться, что mysqlbinlog видит самые последние события, сбросьте двоичный журнал на сервере, который вы резервируете.Задержка для резервного копирования аналогична задержке для сервера-реплики.
© 2025 Oracle
Licensed under the GPLv2 License.