MySQL数据库没备份,误删后怎么恢复?!

228 阅读2分钟

预备知识

==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

实验环境

  • Ubuntu18.04

  • MySQL 8.0

  • MySQL Binary Log配置,具体配置更改参考

    mysql> show VARIABLES like 'binlog_format';+---------------+-------+| Variable_name | Value |+---------------+-------+| binlog_format | ROW   |+---------------+-------+1 row in set (0.00 sec)mysql> SHOW VARIABLES LIKE 'log_bin%';+---------------------------------+-------------------------+| Variable_name                   | Value                   |+---------------------------------+-------------------------+| log_bin                         | ON                      || log_bin_basename                | /log/mysql/binlog       || log_bin_index                   | /log/mysql/binlog.index |+---------------------------------+-------------------------+
    

    注意两点

  • log_bin_basename这是更改过的,默认路径是 /var/lib/mysql

  • binlog_format如果不是ROW,请修改为ROW

    set global binlog_format = "ROW" ;
    

=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

基本知识

Binlog简介

Binlog也叫binary log,俗称二进制日志。是MySQL的一种重要的日志文件。他会记录MySQL中的各种操作。在MySQL Binlog眼中这些操作都是发生的事件。

===========================================================================================

Binlog中常见的事件类型

  • QUERY_ EVENT 与数据无关的操作,begin、drop table、truncate table等

  • TABLE MAP EVENT 记录下一个操作所对应的表信息,存储了数据库名和表名

  • XID_ EVENT 标记事务提交

  • WRITE ROWS EVENT 插入数据,即insert操作

  • UPDATE ROWS EVENT 更新数据,即update操作

  • DELETE ROWS EVENT 删除数据,即delete操作

============================================================================================================================================================================================================================================================================================

回复操作

假数据构建

//创建数据库DROP DATABASE IF EXISTS `dbtest`;CREATE DATABASE  `dbtest` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;//创建tableuse dbtest;DROP TABLE IF EXISTS `employee`;CREATE TABLE `employee`  (  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT,  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,  `age` int(0) NOT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;//插入数据INSERT INTO `employee` VALUES (1, '展昭', 20);INSERT INTO `employee` VALUES (2, '王朝', 20);INSERT INTO `employee` VALUES (3, '马汉', 20);

==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

查看Binarylog Events

登陆到MySQL中,查看 binlog events

文中使用的客户端工具是 Navicat,安装激活教程www.bilibili.com/video/BV1yE…

SHOW BINLOG EVENTS;

图片

image-20210226162418715

SHOW BINARY LOGS; 查看binlog文件名称

SHOW MASTER STATUS; 查看当前的binlog文件名称

========================================================================================================================================================================================================================================================================================================================================================================

模拟误删数据并查看binlog的变化

DELETE FROM employee WHERE id = 1

图片

image-20210226175440791

由于我当前的binlog是binlog.000001,所以我执行下面的命令

SHOW BINLOG EVENTS IN 'binlog.000001'

image-20210226174515050

可以看出 Pos=3031处执行了删除操作

============================================================================================================================================================================================================================================================================================================================

开始恢复数据

  • 全量备份要操作的数据库数据库

    $ mysqldump --databases dbtest > dump.sql -uroot -p
    
  • 全量恢复

    // --stop-position=2889是因为2889是删除执行之前的一个操作的结尾$ sudo mysqlbinlog /log/mysql/binlog.000001   --stop-position=2889 | mysql -uroot -p
    

    图片

    image-20210226175534007

需要注意的是,实验环境中数据比较少。生产环境中数据量比较大,通常情况下,log并不会保存在同一个文件中,而是保存在 binlog.000001 binlog.000002等依次类推。

命令行可以这么写

sudo mysqlbinlog {yourpath}/binlog.000001 {yourpath}/binlog.000002  --stop-position={position} | mysql -uroot -p

目前为止,该文章只是提供了一个思路,让大家明白binary log可以用作数据库备份。下篇文章我们将继续介绍,线上环境如何监听MySQL Binary Log。通过监听我们又可以做哪些事情。

=====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================