[MySQL]-删库后恢复

sen格 | 2022年11月

本文旨在记录个人在数据库的删库恢复演练过程中的一些总结,如有不足,欢迎指正。


一、恢复场景

1)假设生产实例MySQL端口为:3306

2)本地实例MySQL端口为:3307

在这里的两个端口分别模拟生产和本地数据库

步骤一

在3306上创建数据库tpcc

mysql3306>create database tpcc;

查看当前数据库

mysql3306>show databases;

创建表

在tpcc数据库上创建9张表,使用tpcc-mysql自带的建表语句

mysql3306>use tpcc;
mysql3306>source /usr/local/tpcc-mysql/create_table.sql

create_table.sql 文件内容

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;drop table if exists warehouse;create table warehouse (
w_id smallint not null,
w_name varchar(10),
w_street_1 varchar(20),
w_street_2 varchar(20),
w_city varchar(20),
w_state char(2),
w_zip char(9),
w_tax decimal(4,2),
w_ytd decimal(12,2),
primary key (w_id) ) Engine=InnoDB;drop table if exists district;create table district (
d_id tinyint not null,
d_w_id smallint not null,
d_name varchar(10),
d_street_1 varchar(20),
d_street_2 varchar(20),
d_city varchar(20),
d_state char(2),
d_zip char(9),
d_tax decimal(4,2),
d_ytd decimal(12,2),
d_next_o_id int,
primary key (d_w_id, d_id) ) Engine=InnoDB;drop table if exists customer;create table customer (
c_id int not null,
c_d_id tinyint not null,
c_w_id smallint not null,
c_first varchar(16),
c_middle char(2),
c_last varchar(16),
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2),
c_zip char(9),
c_phone char(16),
c_since datetime,
c_credit char(2),
c_credit_lim bigint,
c_discount decimal(4,2),
c_balance decimal(12,2),
c_ytd_payment decimal(12,2),
c_payment_cnt smallint,
c_delivery_cnt smallint,
c_data text,
PRIMARY KEY(c_w_id, c_d_id, c_id) ) Engine=InnoDB;drop table if exists history;create table history (
h_c_id int,
h_c_d_id tinyint,
h_c_w_id smallint,
h_d_id tinyint,
h_w_id smallint,
h_date datetime,
h_amount decimal(6,2),
h_data varchar(24) ) Engine=InnoDB;drop table if exists new_orders;create table new_orders (
no_o_id int not null,
no_d_id tinyint not null,
no_w_id smallint not null,
PRIMARY KEY(no_w_id, no_d_id, no_o_id)) Engine=InnoDB;drop table if exists orders;create table orders (
o_id int not null,
o_d_id tinyint not null,
o_w_id smallint not null,
o_c_id int,
o_entry_d datetime,
o_carrier_id tinyint,
o_ol_cnt tinyint,
o_all_local tinyint,
PRIMARY KEY(o_w_id, o_d_id, o_id) ) Engine=InnoDB ;drop table if exists order_line;create table order_line (
ol_o_id int not null,
ol_d_id tinyint not null,
ol_w_id smallint not null,
ol_number tinyint not null,
ol_i_id int,
ol_supply_w_id smallint,
ol_delivery_d datetime,
ol_quantity tinyint,
ol_amount decimal(6,2),
ol_dist_info char(24),
PRIMARY KEY(ol_w_id, ol_d_id, ol_o_id, ol_number) ) Engine=InnoDB ;drop table if exists item;create table item (
i_id int not null,
i_im_id int,
i_name varchar(24),
i_price decimal(5,2),
i_data varchar(50),
PRIMARY KEY(i_id) ) Engine=InnoDB;drop table if exists stock;create table stock (
s_i_id int not null,
s_w_id smallint not null,
s_quantity smallint,
s_dist_01 char(24),
s_dist_02 char(24),
s_dist_03 char(24),
s_dist_04 char(24),
s_dist_05 char(24),
s_dist_06 char(24),
s_dist_07 char(24),
s_dist_08 char(24),
s_dist_09 char(24),
s_dist_10 char(24),
s_ytd decimal(8,0),
s_order_cnt smallint,
s_remote_cnt smallint,
s_data varchar(50),
PRIMARY KEY(s_w_id, s_i_id) ) Engine=InnoDB ;SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

步骤二

删除数据库tpcc

mysql3306>drop database tpcc;

步骤三

库都删除了,那下面就是恢复了

二、恢复!

在恢复之前,我们肯定要查看现在使用的binlog,因为场景比较简单,所以创建库和删除库大差不差的在一个binlog里。

查看当前正在写入的binlog文件:

mysql3306>show master status;

由上图,我们得知当前正在写mysql-bin.000017这个文件

还可以查看binlog文件列表:

mysql3306>show binary logs;

既然如此了,我们先拷贝出来一份到别的目录,不然生产的文件被搞坏,那就准备跑路吧~

centos7>cp /usr/local/mysql/data/binlog/mysql-bin.000017 /data/bakcup/mysql-bin.000017

简单查看下是否有数据库创建和删除语句

centos7>cd /data/bakcup/backup>mysqlbinlog mysql-bin.000017 | grep -n  "create database"backup>mysqlbinlog mysql-bin.000017 | grep -n  "drop database"

因为场景比较单一,所以我们这里可以使用 --start-position 和 --stop-position 两个参数来恢复数据

查看 mysql-bin.000017,binlog为二进制类型不能直接查看,借助mysqlbinlog工具导致查看

backup>mysqlbinlog --set-charset=utf8mb4 mysql-bin.000017 > tmp.sql

然后我们可以在vim里查找

backup>vim tmp.sql

按 / ,输入create database tpcc,查看开始位置(由图的开始位置6162)

按 / ,输入drop database tpcc,查看结束位置(有图得结束位置为11841)

根据这个binlog的翻译文件,查看完开始和结束位置后,我们就可以对binlog进行截取

backup>mysqlbinlog -v mysql-bin.000017 --start-position=6162 --stop-position=11841 > tmp_tpcc.sql

在本地实例上执行

backup>mysql -P3307 0-uroot -p < tmp_tpcc.sql

查看后,我们发现3307端口的数据库已经有了tpcc数据库和创建表了

下面我们用mysqldump来把tpcc这个库拉出来

backup>mysqldump -uroot -p -h 127.0.0.1 -P3307 --single-transaction --skip-lock-tables --default-character-set=utf8mb4 --set-gtid-purged=OFF > back_tpcc_3307.sql

最后就是通知业务不要对生产库做操作,以免影响业务写入数据被刷

然后开始恢复

backup>mysql -P3306 -uroot -p -h 127.0.0.1 < back_tpcc_3307.sql

最后结果:

三、总结

该案例比较简单,在实际生产过程中还是要根据场景具体分析,但是恢复过程以及原理和本文大致相似。

在这里积极欢迎各位大佬指出不足之处。

[MySQL]-删库后恢复相关推荐

  1. mysql删库后恢复数据流程

    目录 前言 binlog 准备 备份 总结 前言 本文将介绍当我们使用mysql不小心删库之后,或者恶意被删库后,如何进行数据恢复 binlog 我们进行数据恢复的前提是: 1.必须开启binlog日 ...

  2. mysql删库后恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  3. mongodb删库后恢复

    mongodb删库后恢复 模拟删库恢复 1.重置mongo数据库副本集,准备干净环境 rm -rf /data/mongo_28017/* rm -rf /data/mongo_28018/* rm ...

  4. mysql被删库如何恢复_mysql整个数据库被删除了怎么恢复

    展开全部 每个 DBA 是不是都有过删库的经e68a84e8a2ad62616964757a686964616f31333433626437历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表 ...

  5. 【数据库】mysql删库恢复

    删库跑路撤回手册 1.binlog恢复 1.查看mysql是否开启binlog日志 mysql> show variables like 'log_%'; 2.查看logs文件并查看二进制操作日 ...

  6. 手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜

    我们常常听人说,只要你愿意,MySQL 可以恢复至半个月甚至一个月以内的任何一个状态.网上也有很多删库跑路的段子... 那么今天松哥想和大家来聊一聊 MySQL 中的 binlog,来手把手教大家如何 ...

  7. 删库后,除了跑路还能怎么办?

    阅读本文大概需要 1.4 分钟. 当年悟空学艺于菩提祖师门下,老师遣他下山,悟空觉得自己蒙受师傅传授大恩,还没有报答.菩提祖师就说:不要提什么报答之恩,只要你日后闯出祸来不把为师说出来就行了. 我听说 ...

  8. MySQL删库数据延迟恢复策略

    stop slave; change master to master_delay = 1800; #1800s后才同步 start slave;

  9. github mysql 数据恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

最新文章

  1. 基础数据结构【二】————动态数组,单向链表及链表的反转
  2. 【云计算】Docker删除名称为none的Image镜像
  3. mysql SQLyog导入导出csv文件
  4. 计算机的硬件技能,计算机的最基础——软硬件
  5. 1.4编程基础之逻辑表达式与条件分支 07 收集瓶盖赢大奖
  6. 年赚133亿!中国平安旗下陆金所向SEC递交招股书
  7. Java的Socket编程
  8. Java Web ConnectionPool (连接池技术)
  9. python爬虫源代码_【Python每日一问】Python爬虫能做什么?
  10. 一体化方案解决大数据处理的两个难题
  11. 管理感悟:学会推论及验证
  12. MATS-2010H硬磁测量装置产品详细介绍
  13. 计算机组成原理试题和答案2017,【2017年整理】计算机组成原理试题及答案9.doc...
  14. EI/scopus推荐-智能交通与智慧城市会议
  15. 新版风格收款码三合一制作生成系统源码 附多个模板
  16. 《云计算技术与应用基础》课程标准
  17. qq音乐for linux,[Linux] QQ音乐官方上线 For Linux V1.0.5-1 [2020.12.2]
  18. vue 调起浏览器打印
  19. T02 - 005、上海微创软件股份有限公司
  20. 华为强推996工作制,程序员们的变态加班何时休?

热门文章

  1. 邮箱服务之阿里云平台
  2. UG8.5 正式版安装方法
  3. C# 实时监控线程类
  4. 武汉创业者声讨网易:占用我们LOGO 还大张旗鼓做起销售
  5. docker安装kafka镜像
  6. 无线WiFi破解教程(转载)
  7. ggplot2中1单位线条和字体的究竟相当于多少pt?
  8. 教你如何打造一个适合学生党的学习型iPad
  9. 手写springIOC、AOP
  10. 什么是 Batch normalization