通过日志进行恢复误删的表、数据、mysql库

(希望大家在工作中永远不要用到)执行什么命令都要对自己负责具备工匠精神

linux下开启mysql的binlog日志功能

1.配置mysql配置文件my.cnf(内容如下)。

  #配置文件储存的位置
  log-bin=mysql-bin
  #5.7以及以上版本需要配置这一行(保证唯一性,可随意输入)
  server-id=123
  #binlog的格式 :statement(保存语句)、row(保存执行后的结果)、mixed(同时保存语句和结果)
  binlog-format=ROW
  #表示每执行一次就同步
  sync-binlog=1

2.重启mysql服务后。查看日志功能是否正常开启

   mysql> show variables like 'log_%';

恢复数据

创建新的日志控制开始点(创建新的日志文件) mysql

  mysql> flush logs;

查看创建的日志文件(如下图最新生成的mysql-bin.00003) mysql

  mysql> show master status;

创建数据库 mysql

  DROP DATABASE IF EXISTS `study1`; CREATE DATABASE `study1`;

创建数据表 mysql

  DROP TABLE IF EXISTS `study1`.`tb_class`;
  CREATE TABLE `study1`.`tb_class` (
    `id` int(11) NOT NULL,
    `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `score` int(255) NULL DEFAULT NULL,
    `grade` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

插入数据 mysql

  INSERT INTO `study1`.`tb_class` VALUES (1, 'a', 10, 'a');
  INSERT INTO `study1`.`tb_class` VALUES (2, 'a', 10, 'a');
  INSERT INTO `study1`.`tb_class` VALUES (3, 'a', 10, 'cc');
  INSERT INTO `study1`.`tb_class` VALUES (4, 'a', 10, 'dd');
  INSERT INTO `study1`.`tb_class` VALUES (5, 'a', 10, 'ee');
  INSERT INTO `study1`.`tb_class` VALUES (6, 'a', 10, 'ff');

删除表数据,插入新数据 mysql

  DELETE from `study1`.`tb_class`;
  INSERT INTO `study1`.`tb_class` VALUES (99999, 'a', 10, 'a');
  INSERT INTO `study1`.`tb_class` VALUES (999995, 'a', 10, 'b');
  INSERT INTO `study1`.`tb_class` VALUES (999996, 'a', 10, 'c');
查找恢复点,即删除数据之前的备份点(mysql-bin.000003为上面生成的日志文件) linux

  /usr/bin/mysqlbinlog --no-defaults  -v  --start-datetime="2022-06-08 10:00:00" --stop-datetime="2022-06-09 17:35:00"   /var/lib/mysql/mysql-bin.000003  (可以使用find命令查找mysqlbinlog、mysql-bin.000003路径) 

  • --no-defaults 读取没有选项的文件, 指定的原因是由于 mysqlbinlog 无法识别 BINLOG 中的 default-character-set=utf8 指令
  • --start-datetime="2022-06-08 10:00:00" 开始时间
  • --stop-datetime="2022-06-09 17:35:00" 结束时间
  • | grep XXXX   进行过滤

恢复数据(恢复点如上截图,此处找到删除前备份点为2766) linux

  /usr/bin/mysqlbinlog --no-defaults -v /var/lib/mysql/mysql-bin.000003  --stop-position=2766 -v | mysql -uroot -p密码

可以看到已经恢复的数据

 删除表 mysql

  DROP TABLE IF EXISTS `study1`.`tb_class`;

恢复 linux

  /usr/bin/mysqlbinlog --no-defaults -v /var/lib/mysql/mysql-bin.000003 --stop-position=2766 -v | mysql -uroot -p密码

删库 mysql

  DROP DATABASE `study1`;

恢复 linux

  /usr/bin/mysqlbinlog --no-defaults -v /var/lib/mysql/mysql-bin.000003 --stop-position=2766 -v | mysql -uroot -p密码

总结

日志恢复过程中,主要靠备份点进行备份还原,如果遇到报错表已存在库、已存在表时因为建库建表时没规范的执行一次库、表的判断删除

  DROP DATABASE IF EXISTS `库名`;

  DROP TABLE IF EXISTS `库名`.`表名`;

 

posted @ 2022-06-08 15:32  ganfd  阅读(565)  评论(0编辑  收藏  举报