暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL误删库如何恢复

MySQLDBA修炼之路 2020-03-04
858

假设数据库备份策略是一周一次全备,每天一次增量备份,如果发生误删数据,在不使用第三方工具类似美团MyFlash以及binlog2sql 那么如何恢复?

1、找到离故障最近的一次备份,先将备份进行恢复。

2、然后利用截取binlog日志,找到最近一次备份到发生故障之间的二进制日志提交记录,截取日志进行备份到故障期间的提交事务进行恢复。

模拟全备

    mysqldump -ucjr -pcjr -h47.107.168.31 -P 3306 -A -R -E --triggers --master-data=2 --single-transaction --max_allowed_packet=64M >/tmp/full_`date +%F`.sql

    假设最近的一次备份中存在如下数据

    database mdp下存在表t1 数据

    在全备之后发生了如下操作,创建了t2 t3表

    但是在之后有个误操作,删除了database mdp (mdp下有t1 t2 t3表)

    t1 t2 t3 表未进行备份,在不使用第三方工具类似美团MyFlash以及binlog2sql等闪回工具的情况下如何进行恢复呢。

    先利用最新的全备先恢复大部分数据

    截取日志要先确认起点

      [root@iZwz91m0zmp2djat3behgbZ tmp]# head -30 full_2020-03-04.sql 
      -- MySQL dump 10.13 Distrib 5.7.23, for linux-glibc2.12 (x86_64)
      --
      -- Host: 47.107.168.31 Database:
      -- ------------------------------------------------------
      -- Server version 5.7.23-log

      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8 */;
      /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
      /*!40103 SET TIME_ZONE='+00:00' */;
      /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
      /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
      /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
      /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
      SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
      SET @@SESSION.SQL_LOG_BIN= 0;

      --
      -- GTID state at the beginning of the backup
      --

      SET @@GLOBAL.GTID_PURGED='db0c3952-5475-11ea-9f45-00163e109fc5:1-6';

      --
      -- Position to start replication or point-in-time recovery from
      --

      -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1052;

        SET @@GLOBAL.GTID_PURGED='db0c3952-5475-11ea-9f45-00163e109fc5:1-6';

        从这里看出备份中已经有1-6的事务提交号了,那么起点应该从7开始。

        查看当前GTID执行到多少号了

        查到删除库的事务是11号

        因此截取日志的起始点是7,终点是10,因为11是删除操作,所以不能包含11

        截取日志,生成sql

           mysqlbinlog --skip-gtids --include-gtids='db0c3952-5475-11ea-9f45-00163e109fc5:7-10' data/3306/binlog/mysql-bin.000003 > /tmp/binlog.sql

          恢复

             source tmp/full_2020-03-04.sql
            source /tmp/binlog.sql


            完成故障恢复

            文章转载自MySQLDBA修炼之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论