MySQL позволяет настраивать binlog и восстанавливать данные через binlog.

1. Основные понятия логов binlog

   Binlog — это двоичный журнал, поддерживаемый уровнем сервера MySQL. Binlog — это двоичный журнал, в котором фиксируются все изменения структуры таблицы базы данных (такие как CREATE, ALTER TABLE, DROP и т. д.) и изменения данных таблицы (INSERT, UPDATE, DELETE, TRUNCATE, и т. д.). Такие операции, как SELECT и SHOW, не будут записываться, поскольку такие операции не изменяют сами данные.

Основные функции:

  • Репликация «главный-подчиненный»: включите binlog на главном узле MySQL. Главный передает свой двоичный журнал подчиненным устройствам и воспроизводит его для достижения согласованности данных «главный-подчиненный».
  • Восстановление данных: восстановите данные с помощью инструмента mysqlbinlog.

2. Включить ведение журнала binlog.

2.1. Проверьте статус включения ведения журнала binlog.

После завершения установки MySQL binlog по умолчанию не включен в MySQL версии 5.7, а binlog включен по умолчанию в MySQL 8. После входа в MySQL вы можете использовать SHOW VARIABLES LIKE '%log_bin%'; команда, чтобы проверить, включен ли binlog.

# 登录 mysql
mysql -h127.0.0.1 -P3306 -uroot -p123456
# 查看是否开启binlog
mysql> SHOW VARIABLES LIKE '%log_bin%';

Вставьте сюда описание изображения

Если значение log_bin включено, это означает, что он включен. Если оно выключено, это означает, что он выключен. Я использую здесь MySQL 8.0, и он включен по умолчанию. Если он не включен, он может включить следующим образом:

2.2. Включение и настройка журналов binlog

Измените файл конфигурации MySQL. Файл конфигурации в Linux — my.conf, а в Windows — my.ini. В качестве примера ниже используется centos:

  • Редактировать файл конфигурации
# 在centos中mysql的配置文件一般都在/etc/mysql目录下,如果不在可以通过 find / -name "my.cnf" 查找
vi /etc/mysql/my.cnf
  • Добавить конфигурацию
# 服务ID
server-id=1
# binlog 配置 只要配置了log_bin地址 就会开启
log_bin = /var/lib/mysql/mysql_bin
# 日志存储天数 默认0 永久保存
# 如果数据库会定期归档,建议设置一个存储时间不需要一直存储binlog日志,理论上只需要存储归档之后的日志
expire_logs_days = 30
# binlog最大值
max_binlog_size = 1024M
# 规定binlog的格式,binlog有三种格式statement、row、mixad,默认使用statement,建议使用row格式
binlog_format = ROW
# 在提交n次事务后,进行binlog的落盘,0为不进行强行的刷新操作,而是由文件系统控制刷新日志文件,如果是在线交易和账有关的数据建议设置成1,如果是其他数据可以保持为0即可
sync_binlog = 1
  • Перезапустите службу MySQL, чтобы конфигурация вступила в силу.
systemctl restart mysqld
  • Войдите в MySQL, чтобы проверить, вступила ли конфигурация в силу.
mysql> SHOW VARIABLES LIKE '%log_bin%';

Вставьте сюда описание изображения
log_bin включен, что означает, что MySQL включил ведение журнала binlog.
log_bin_basename настраивает путь к файлу binlog и имя префикса файла.
log_bin_index настраивает индексный файл binlog. путь

  • Посмотреть список журналов
mysql> SHOW MASTER LOGS;

Вставьте сюда описание изображения

  • Просмотрите конкретный файл binlog по пути log_bin_basename.
ls -l /var/lib/mysql/mysql_bin.*

Вставьте сюда описание изображения

3. Создайте тестовые данные (выполнить сейчас нельзя. Это для подготовки к последующему восстановлению данных. Сначала рассмотрим процесс восстановления данных)

После входа в MySQL создайте базу данных, создайте таблицу и вставьте некоторые данные.

  • Вход в базу данных
mysql -h127.0.0.1 -P3306 -uroot -p123456
  • Создать библиотеку
CREATE DATABASE binlog_test_db;
  • Переключитесь на созданную вами базу данных
USE binlog_test_db;
  • Создать таблицу
DROP TABLE IF EXISTS `binlog_test_table`;
CREATE TABLE `binlog_test_table`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nick_name` varchar(255) DEFAULT NULL,
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ;
  • Вставить данные
INSERT INTO `binlog_test_table` VALUES (1, 'Alia', NOW());
INSERT INTO `binlog_test_table` VALUES (2, 'Kerwin', NOW());
INSERT INTO `binlog_test_table` VALUES (3, 'Hilaria', NOW());
INSERT INTO `binlog_test_table` VALUES (4, 'Coco', NOW());
  • Посмотреть созданную библиотеку
mysql> SHOW DATABASES;

Вставьте сюда описание изображения

  • Просмотр созданных таблиц и данных
# 切换到binlog_test_db库
mysql> USE binlog_test_db;
# 查看库中所有的表
mysql> SHOW TABLES;
# 查看表中的数据
mysql> SELECT * FROM binlog_test_table;

Вставьте сюда описание изображения

4. Используйте журналы binlog для восстановления данных.

При изменении базы данных binlog будет записывать все изменения в базе данных. При необходимости восстановления вы можете использовать инструмент mysqlbinlog для восстановления исходной части операции на основе начальной позиции и конечной позиции или времени начала и времени окончания в binlog. Конечная позиция или время окончания обычно представляет собой местоположение данных до того, как они были уничтожены или удалены.

4.1. Подготовка

Если вы тестируете самостоятельно, вы должны сначала обеспечить чистоту среды, чтобы не тратить время из-за некоторых странных проблем. Здесь сделайте некоторые предварительные приготовления. То есть лучше всего иметь в своем binlog только текущие записи тестовых данных. файл, чтобы избежать помех.

  • 1. Войдите в MySQL и выполните следующую команду, чтобы обновить журнал.С этого момента будет создан файл журнала binlog с новым номером.

    # 注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志
    mysql> FLUSH LOGS;
    
  • 2. Просмотр текущего файла binlog.

    ls -l /var/lib/mysql/mysql_bin.*
    

    Вставьте сюда описание изображения
    До обновления binlog здесь был mysql_bin.000003. После обновления был сгенерирован новый mysql_bin.000004. Последующие журналы будут записываться в этот новый файл.

4.2. Восстановить все данные

Прежде чем восстанавливать данные, необходимо сначала создать тестовые данные.Восстановление всех данных означает выполнение полного бинлога.Например, когда мы создаем тестовые данные, такие операции, как создание библиотеки, создание таблицы и вставка данных, будут записываться в бинлог. Используйте этот binlog для восстановления. Данные эквивалентны повторному выполнению описанной выше операции.

Демонстрационный процесс восстановления данных:

  • 1. Выполните операции из 4.1 Подготовка для создания нового файла binlog. Предположим, что новый файл, который я создаю здесь, называется mysql_bin. .000004, последующие журналы операций с данными будут записываться в этот файл журнала.

  • 2. Подготовьте данные и непосредственно выполните SQL, описанный в третьем пункте этой статьи.Создайте тестовые данные.

  • 3. Архивируйте журнал binlog mysql_bin.000004. Поскольку нам необходимо восстановить все данные через журнал mysql_bin.000004, нам необходимо заархивировать его перед удалением базы данных. Если оператор удаления базы данных также записан в mysql_bin.000004, то mysql_bin Библиотека 000004 будет снова удалена.

    # 登录数据库执行刷新log日志,自此刻开始产生一个新编号的binlog日志文件
    mysql> FLUSH LOGS;
    

    Вставьте сюда описание изображения

  • 4. Удалить базу данных

    mysql> DROP DATABASE binlog_test_db;
    

    Вставьте сюда описание изображения
    Здесь вы можете видеть, что библиотека binlog_test_db удалена.

  • 5. Восстановить все через выполнение mysqlbinlog.

    # mysqlbinlog是MySQL自带的一个工具,一般在安装MySQL时mysqlbinlog也会被放入可执行目录下,可以直接执行
    # 如果不能直接使用mysqlbinlog命令,可以通过 find / -name "mysqlbinlog" 查找一下这个工具在什么位置
    # 然后指定全路径执行即可:如 /usr/bin/mysqlbinlog --no-defaults ...
    mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.000004 | mysql -h127.0.0.1 -P3306 -uroot -p123456
    
  • 6. Проверьте статус восстановления данных.

    # 查看全部库
    mysql> SHOW DATABASES;
    # 切换到binlog_test_db库
    mysql> USE binlog_test_db;
    # 查看库中所有的表
    mysql> SHOW TABLES;
    # 查看表中的数据
    mysql> SELECT * FROM binlog_test_table;
    

    Вставьте сюда описание изображения

На этом этапе вы можете видеть, что все данные восстановлены, но есть еще несколько проблем:

  • 1. Как восстановить все данные, если файлов бинлогов несколько
    • Существует несколько файлов binlog, которые можно восстановить последовательно. Они должны быть восстановлены в соответствии с серийным номером журнала. Предположим, что существует три серийных номера файла журнала: 000001, 000002 и 000003. Тогда первый восстановленный файл должен быть 000001, второй один 000002 и, наконец, 000003.
  • 2. Как восстановиться, если мы еще и базу данных удалили в том же лог-файле?
    • Принцип любого восстановления заключается в выполнении всех операций, выполненных ранее. Если происходит операция удаления базы данных, она будет выполнена снова. Это определенно противоречит нашим потребностям. Решение на самом деле состоит в том, чтобы не выполнять операции после определенного узла, например поскольку операция удаления базы данных выполняется на узле 5, поэтому нам нужно восстановить ее только на узле 4, что будет подробно объяснено позже.

4.3. Восстановление через указанный интервал местоположения.

В отличие от восстановления всех данных, вы можете указать интервал расположения для восстановления данных. Таким образом, если операция удаления базы данных и операция вставки данных находятся в одном файле журнала, восстановление данных также может быть выполнено, и это очень гибко.

Демонстрационный процесс восстановления данных:

  • 1. Выполните операции из 4.1 Подготовка для создания нового файла binlog. Предположим, что новый файл, который я создаю здесь, называется mysql_bin. .000006, последующие журналы операций с данными будут записываться в этот файл журнала.

  • 2. Подготовьте данные и непосредственно выполните SQL, описанный в третьем пункте этой статьи.Создайте тестовые данные.

  • 3. Удалить базу данных

    mysql> DROP DATABASE binlog_test_db;
    

    Вставьте сюда описание изображения
    Здесь вы можете видеть, что библиотека binlog_test_db удалена.

  • 4. Архивируйте журнал binlog mysql_bin.000006. Чтобы предотвратить влияние последних событий после восстановления данных, необходимо выполнить очистку журналов для создания нового файла binlog. В это время старый файл binlog больше не будет написано.

    # 登录数据库执行刷新log日志,自此刻开始产生一个新编号的binlog日志文件
    mysql> FLUSH LOGS;
    

    Вставьте сюда описание изображения

  • 5. Преобразуйте binlog в sql через mysqlbinlog, чтобы облегчить запрос конкретного местоположения.

    mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.000006>binlog_000006.sql
    
  • 6. Проверьте сгенерированный файл binlog_000006.sql, чтобы определить начальную и конечную позиции, которые необходимо восстановить, а также время начала и время окончания.

    # 打开 binlog_000006.sql 文件,搜索自己的创建库语句确认起始位置和时间,在搜索删除库语句确认结束位置和时间
    vi binlog_000006.sql
    

    Подтвердите, что начальная позиция — 232, а время начала — 17:17:23 27 и 23 сентября.
    Вставьте сюда описание изображения
    Подтвердите, что конечная позиция — 2220, а время окончания — 27, 23 сентября 17 :18:36
    Вставьте сюда описание изображения

  • 7. Выполните операции восстановления через mysqlbinlog.

    # 通过位置区间恢复 
    mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.000006 --start-position=232 --stop-position=2220 | mysql -h127.0.0.1 -P3306 -uroot -p123456
    

    /var/lib/mysql/mysql_bin.000006: Для работы с файлом binlog
    –start-position=232: Начальная позиция восстановления данных
    –stop-position=2220: Конечная позиция восстановления данных
    mysql -h127.0.0.1 -P3306 -uroot -p123456: Для восстановления данных требуется вход в базу данных

    Вставьте сюда описание изображения

Guess you like

Origin blog.csdn.net/weixin_44606481/article/details/133344235