【mysql】mysql之数据误删恢复

2024-09-04 17:20

本文主要是介绍【mysql】mysql之数据误删恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》从问题中去学习k8s

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

《DBA》db的介绍使用(mysql、redis、mongodb...)

数据误删除恢复流程

前期介绍

1.正在运行的网站系统,MySQL数据库,数据量25G,日业务增量10-15M。
2.备份策略:每天23:00,计划任务调用mysqldump执行全备脚本 	
3.故障时间点:上午10点开发人员误删除一个核心业务表,如何恢复?

思路

1.停库,避免二次伤害
2.创建新库
3.倒入前一天的全备
4.通过binlog找到前一天23:00到第二天10点之间的数据
5.导入找到的新数据
6.恢复业务(A和B两种方式,按照实际环境选取其一方式即可)a.直接使用临时库顶替原生产库,前端应用割接到新库(数据量特别大的时候)b.将误删除的表单独导出,然后导入到原生产环境(数据量小的时候)

环境模拟

ip主机名角色
172.16.1.50db01误删除表主机
172.161.51db02迁移主机
环境准备
# 1. 查看db01主机数据库信息
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| student            |
| test               |
+--------------------+# 2. 查看student表信息
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| student           |
+-------------------+mysql> select * from student;
+----+-----------+-----+--------+---------------------+
| id | name      | age | gender | cometime            |
+----+-----------+-----+--------+---------------------+
|  1 | 戴佳栋    |  23 | M      | 2020-07-15 06:59:15 |
|  2 | 王张行    |  28 | M      | 2020-07-15 06:59:49 |
|  3 | 王启涵    |  24 | M      | 2020-07-15 07:00:16 |
|  4 | 陈建清    |  21 | M      | 2020-07-15 07:00:38 |
|  5 | 高松平    |  21 | M      | 2020-07-15 07:00:57 |
|  6 | 老掉牙    |  22 | F      | 2020-07-15 07:01:12 |
+----+-----------+-----+--------+---------------------+# 3. 模拟23点执行全量备份
[root@db01 ~]# mysqldump -A -R --triggers --master-data=2 --single-transaction > /tmp/full.sql# 4. 模拟23点全量备份后的数据写入()
mysql> insert into student values(7,'龚晓廖',88,'F','now()');
mysql> insert into student values(8,'好大',44,'F',now());
mysql> insert into student values(9,'邱导',33,'F',now());# 5. 查看数据
mysql> select * from student;
+----+-----------+-----+--------+---------------------+
| id | name      | age | gender | cometime            |
+----+-----------+-----+--------+---------------------+
|  1 | 戴佳栋    |  23 | M      | 2020-07-15 06:59:15 |
|  2 | 王张行    |  28 | M      | 2020-07-15 06:59:49 |
|  3 | 王启涵    |  24 | M      | 2020-07-15 07:00:16 |
|  4 | 陈建清    |  21 | M      | 2020-07-15 07:00:38 |
|  5 | 高松平    |  21 | M      | 2020-07-15 07:00:57 |
|  6 | 汤采玉    |  22 | F      | 2020-07-15 07:01:12 |
|  7 | 龚晓廖    |  88 | F      | 0000-00-00 00:00:00 |
|  8 | 好大      |  44 | F      | 2020-07-22 15:14:07 |
|  9 | 邱导      |  33 | F      | 2020-07-22 15:14:45 |
+----+-----------+-----+--------+---------------------+
故障重现
# 1.模拟误删除表student
mysql> drop table student;# 2. 查看student表已经不存在
mysql> show tables;
Empty set (0.00 sec)
故障恢复(A方案)
# 1.因核心表已删除,停止数据库对外服务
[root@db01 tmp]# systemctl stop mysqld# 2.使用新的临时库db02替代生产库,前段业务割接到新库(将全备数据拷贝到db02)
[root@db01 tmp]# scp full.sql root@172.16.1.52:/tmp# 3.找到二进制日志中全备23点后到删除数据前的数据,并且导出(查看日志,找到位置点)
[root@db01 data]# mysqlbinlog -d student --start-position=2728 --stop-position=3421 mysql-bin.000001 > /tmp/new.sql# 4.将二进制导出数据拷贝到db02
[root@db01 tmp]# scp new.sql root@172.16.1.52:/tmp# 5.在db02中将全备数据导入(在db02数据库启动后操作)
mysql> source /tmp/full.sql# 6.查看全备导入数据
mysql> select * from student;
+----+-----------+-----+--------+---------------------+
| id | name      | age | gender | cometime            |
+----+-----------+-----+--------+---------------------+
|  1 | 戴佳栋    |  23 | M      | 2020-07-15 06:59:15 |
|  2 | 王张行    |  28 | M      | 2020-07-15 06:59:49 |
|  3 | 王启涵    |  24 | M      | 2020-07-15 07:00:16 |
|  4 | 陈建清    |  21 | M      | 2020-07-15 07:00:38 |
|  5 | 高松平    |  21 | M      | 2020-07-15 07:00:57 |
|  6 | 汤采玉    |  22 | F      | 2020-07-15 07:01:12 |
+----+-----------+-----+--------+---------------------+# 7. 将二进制产生数据导入
mysql> source /tmp/new.sql# 8. 查看二进制后的数据(误删除表的数据已经恢复)
mysql> select * from student;
+----+-----------+-----+--------+---------------------+
| id | name      | age | gender | cometime            |
+----+-----------+-----+--------+---------------------+
|  1 | 戴佳栋    |  23 | M      | 2020-07-15 06:59:15 |
|  2 | 王张行    |  28 | M      | 2020-07-15 06:59:49 |
|  3 | 王启涵    |  24 | M      | 2020-07-15 07:00:16 |
|  4 | 陈建清    |  21 | M      | 2020-07-15 07:00:38 |
|  5 | 高松平    |  21 | M      | 2020-07-15 07:00:57 |
|  6 | 汤采玉    |  22 | F      | 2020-07-15 07:01:12 |
|  7 | 龚晓廖    |  88 | F      | 0000-00-00 00:00:00 |
|  8 | 好大      |  44 | F      | 2020-07-22 15:14:07 |
|  9 | 邱导      |  33 | F      | 2020-07-22 15:14:45 |
+----+-----------+-----+--------+---------------------+# 9. 因将数据库迁移,所以在前端业务中需将数据库地址重新指定
故障恢复(B方案)
# 此操作仅针对数据量级别不大环境,因删除数据只有一个表,所以只需要将全备单独导入到db02,然后将误删除表单独拿出来备份,就实现了十一点前对数据库的恢复,再将二进制数据导出,就就实现了十一点后的数据恢复。# 1.将全备数据拷贝致db02
[root@db01 tmp]# scp new.sql root@172.16.1.52:/tmp# 2. 针对删除的student表进行备份
[root@db02 tmp]# mysqldump student student > /tmp/student.sql# 3. 将数据student表的备份转移到db01
[root@db02 tmp]# scp student.sql root@172.16.1.51:/tmp# 4. 在二进制数据中找到数据起始点,导出数据
[root@db01 data]# mysqlbinlog -d student --start-position=2728 --stop-position=3421 mysql-bin.000001 > /tmp/new.sql# 5. 进入数据库student中,导入数据,实现对十一点前数据的还原
mysql> source /tmp/student.sql# 6. 将二进制数据导入,实现十一点后的数据还原
mysql> source /tmp/new.sql# 7. 查看数据(已成功恢复)
mysql> select * from student;
+----+-----------+-----+--------+---------------------+
| id | name      | age | gender | cometime            |
+----+-----------+-----+--------+---------------------+
|  1 | 戴佳栋    |  23 | M      | 2020-07-15 06:59:15 |
|  2 | 王张行    |  28 | M      | 2020-07-15 06:59:49 |
|  3 | 王启涵    |  24 | M      | 2020-07-15 07:00:16 |
|  4 | 陈建清    |  21 | M      | 2020-07-15 07:00:38 |
|  5 | 高松平    |  21 | M      | 2020-07-15 07:00:57 |
|  6 | 汤采玉    |  22 | F      | 2020-07-15 07:01:12 |
|  7 | 龚晓廖    |  88 | F      | 0000-00-00 00:00:00 |
|  8 | 好大      |  44 | F      | 2020-07-22 15:14:07 |
|  9 | 邱导      |  33 | F      | 2020-07-22 15:14:45 |
+----+-----------+-----+--------+---------------------+

 

这篇关于【mysql】mysql之数据误删恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136550

相关文章

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi