问题描述:

1.正在运行的网站系统,MySQL 数据库,数据量 25G,日业务增量 10 - 15M

2.备份策略:每天 23:00,计划任务调用 mysqldump 执行全备脚本

3.故障时间点:上午 10:00 开发人员误删除一个核心业务表,如何恢复?

解决思路:

1.暂时停止数据库服务,避免出现更多问题

2.在新的服务器环境上安装新的 MySQL 数据库

3.在新的服务器数据库上,导入前一天的全量备份数据

4.通过故障服务器上的 binlog 找到前一天 23:00 到第二天 10:00 之间的数据

5.导入找到的新数据

6.恢复业务

1) 直接使用临时库顶替原生产库,前端应用割接到新库(数据量特别大的时候)

​2) 将误删除的表单独导出,然后导入到原生产环境(数据量小的时候)

模拟案例场景

模拟生产数据

mysql> create database business;
Query OK, 1 row affected (0.00 sec) mysql> use business;
Database changed
mysql> create table business(
-> id int primary key auto_increment,
-> detail varchar(100));
Query OK, 0 rows affected (0.01 sec) mysql> insert into business(detail) values("投资阿里巴巴 100000000元"),("进账 20000000元"),("ZZZZZZZ"),("QQQQQQQQ");
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM business;
+----+---------------------------------+
| id | detail |
+----+---------------------------------+
| 1 | 投资阿里巴巴 100000000元 |
| 2 | 进账 20000000元 |
| 3 | ZZZZZZZ |
| 4 | QQQQQQQQ |
+----+---------------------------------+
4 rows in set (0.00 sec)

模拟 23:00 全量备份(定时任务)

# 全量备份命令,可以用 Crontab 做定时任务
[root@dbtest01 mysql]# mysqldump -uroot -p12345 -A -R --triggers --master-data=2 --single-transaction > /tmp/data_backup.sql
Warning: Using a password on the command line interface can be insecure.

模拟 23:00 到 10:00 的数据修改

# 全量备份后,增加或修改了表数据
mysql> use business;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> insert into business(detail) values("进账 500000000元");
Query OK, 1 row affected (0.16 sec) mysql> insert into business(detail) values("出账 100000000元");
Query OK, 1 row affected (0.05 sec) # 新插入的表数据(ID=5,6)并没有做全量备份(没有备份到 /tmp/data_backup.sql)
mysql> select * from business;
+----+---------------------------------+
| id | detail |
+----+---------------------------------+
| 1 | 投资阿里巴巴 100000000元 |
| 2 | 进账 20000000元 |
| 3 | ZZZZZZZ |
| 4 | QQQQQQQQ |
| 5 | 进账 500000000元 |
| 6 | 出账 100000000元 |
+----+---------------------------------+
6 rows in set (0.00 sec)

模拟误删数据库

# 模拟删库
mysql> drop database business;
Query OK, 1 row affected (0.07 sec)

恢复数据方案

暂停数据库服务

[root@dbtest01 ~]# systemctl stop mysqld

在新服务器上安装新的 MySQL 数据库

# 在一台新的服务器上,安装一个新的 MySQL 数据库
# 如果之前安装过 MySQL, 可以将 $basedir/data/ 下的数据全部删除
[root@dbtest02 ~]# rm -rf /usr/local/mysql/data/* # 再重新初始化,该数据库就又变成 "新数据库" 了
[root@dbtest02 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

导入全量备份数据

# 将全量备份的数据库数据,传输到新的数据库服务器
[root@dbtest01 ~]# scp /tmp/data_backup.sql 172.16.1.122:/tmp # 新数据库,导入全备数据
[root@dbtest02 ~]# mysql < /tmp/data_backup.sql

Binlog 记录着23:00 到 10:00 的数据修改事件,导出数据

# 通过 binlog 找到前一天 23:00 到第二天 10:00 之间的数据

# 在全量备份中,找到 bin-log 的起始位置点(start-position)
[root@dbtest02 ~]# head -22 /tmp/data_backup.sql | tail -1
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=825; # 在故障数据库中,找到 Binlog,并找到结束位置点(stop-position)
[root@dbtest01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000005 | grep -C 20 'drop'
# 或者使用 vim 查找
[root@dbtest01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000005 >/tmp/binlog.sql
过滤 drop database business 取出命令上面的位置点
# at 1405
......
drop database business # 取出位置点之间的数据(Binlog 事件)
[root@dbtest01 ~]# mysqlbinlog -d business --start-position=825 --stop-position=1405 mysql-bin.000005 > /tmp/additional.sql

导入数据

# 故障数据库,将 binlog 传到新数据库
[root@dbtest01 data]# scp /tmp/additional.sql 172.16.1.122:/tmp/ # 新数据库导入新的数据
[root@db02 ~]# mysql < /tmp/additional.sql
# 在 Mysql命令行中导入数据
mysql> source /tmp/additional.sql

确认数据

mysql> select * from business.business;
+----+---------------------------------+
| id | detail |
+----+---------------------------------+
| 1 | 投资阿里巴巴 100000000元 |
| 2 | 进账 20000000元 |
| 3 | ZZZZZZZ |
| 4 | QQQQQQQQ |
| 5 | 进账 500000000元 |
| 6 | 出账 100000000元 |
+----+---------------------------------+
6 rows in set (0.00 sec)

恢复业务

1.直接使用临时库顶替原生产库,前端应用割接到新库(数据量特别大的时候)

2.将误删除的表单独导出,然后导入到原生产环境(数据量小的时候)

# 第二种恢复业务的操作
# 1)新库导出指定业务库,若不使用 -B 选项,就没有建库语句
[root@dbtest02 ~]# mysqldump -B business > /tmp/business.sql
# 2)新库将数据推送回老库
[root@dbtest02 ~]# scp /tmp/business.sql 172.16.1.121:/tmp
# 3)将恢复的数据导入老库
mysql> source /tmp/business.sql

MySQL 企业案例:误删核心业务表的更多相关文章

  1. MySQL mysqlbinlog企业案例

    内容待补充 案例文字说明: 7.3 故障时间点: 周四上午10点,开发人员误删除了一个表,如何恢复? 7.4 思路: 1.停业务,避免数据的二次伤害 2.找一个临时库,恢复周三23:00全备 3.截取 ...

  2. MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例

      上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面 ...

  3. MySQL的InnoDB表如何设计主键索引-转自淘宝MySQL经典案例

    创建a表 id主键 CREATE TABLE `a` (`id` bigint(20) NOT NULL AUTO_INCREMENT ,`message_id` int(11) NOT NULL,` ...

  4. (转)linux运维必会MySQL企业面试题

    linux运维必会MySQL企业面试题  老男孩教育运维班全体学员MySQL必会企业面试题最实战.最细致.最落地的运维实训基地,老男孩教育连续多年国内平均就业工资最高! 数据库的重要性是所有技术里最核 ...

  5. Mysql之案例分析(一)

    可见性分析 CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGIN ...

  6. MySQL企业常用集群图解

      mysql集群架构图片 1.mysql企业常用集群架构 在中小型互联网的企业中.mysql的集群一般就是上图的架构.WEB节点读取数据库的时候读取dbproxy服务器.dbproxy服务器通过对S ...

  7. mysql优化案例

    MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...

  8. MySQL死锁案例分析与解决方案

    MySQL死锁案例分析与解决方案 现象: 数据库查询: SQL语句分析:  mysql. 并发delete同一行记录,偶发死锁.   delete from x_table where id=?   ...

  9. ELK收集tomcat访问日志并存取mysql数据库案例

    这个案例中,tomcat产生的日志由filebeat收集,然后存取到redis中,再由logstash进行过滤清洗等操作,最后由elasticsearch存储索引并由kibana进行展示. 1.配置t ...

随机推荐

  1. 奇技淫巧,还是正统功夫? - Python推导式最全用法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  2. [分享] 最流行的 10 个 JavaScript 库

    1. Lodash https://github.com/lodash/lodash 一个工具库,用得还蛮多. 2. Chalk https://github.com/chalk/chalk 给终端加 ...

  3. Nginx(七):location的使用以及nginx关闭原理

    上一篇中,我们了解了如何nginx的配置原则及解析框架,以及解析location配置的具体实现,相信大家对该部分已经有了比较深刻的认识. 本篇,我们进一步来了解下,解析之后的配置,如何应用到实际中的吧 ...

  4. 中断与系统调用深度分析(以网络编程接口SocketAPI为例)

    1.从计算机CPU与I/O设备的交互方式谈起 计算机CPU与I/O设备的交互方式有最早的程序查询(也叫轮询)方式,发展到后来的程序中断方式,DMA方式等.简单来说,最早的程序查询方式的机制是,CPU若 ...

  5. flask文件下载

    后端的代码 # coding:utf-8 from flask import Flask app = Flask(__name__) @app.route("/upload", m ...

  6. LiteOS调测利器:backtrace函数原理知多少

    摘要:本文将会和读者分享LiteOS 5.0版本中Cortex-M架构的backtrace软件原理及实现,供大家参考和学习交流. 原理介绍 汇编指令的执行流程 图 1 汇编指令的执行顺序 上图1所示, ...

  7. Serverless对研发效能的变革和创新 云托管和Serverless应用差异

    https://mp.weixin.qq.com/s/J4RXtKanh3IMr4fY7t0nyQ Serverless对研发效能的变革和创新 杨皓然(不瞋) 阿里巴巴中间件 2020-10-23

  8. logging philosophy 日志哲学

    Go kit - Frequently asked questions https://gokit.io/faq/ Logging - Why is package log so different? ...

  9. CPU处理器架构和工作原理浅析

    CPU处理器架构和工作原理浅析 http://c.biancheng.net/view/3456.html 汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识. 基本微机设计 ...

  10. libuv事件循环中的三种句柄

    1.说明 本文会简单介绍 libuv 的事件循环,旨在入门级别的使用,而不做深入探究,简单来说就是,会大概用就行,先用熟练了,再去探究原理和源码 下图为官网的 libuv 的不同部分及其涉及的子系统的 ...