mysql数据安全一之数据恢复案例
mysql数据安全一之数据恢复案例
--chenjianwen
应用场景:适宜开启binlog 日志功能,定时备份并使用--master-data参数备份,在某个时间点丢失数据,用于数据恢复
开篇总结:
(1)本案例适用于人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复
(2)恢复条件为mysql要开启binlog日志功能,并且要全备和增量的所有数据
(3)恢复时建议对外停止更新,即禁止更新数据库
(4)先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库。
1.确保 MySQL 开启了 binlog 日志功能,并做好备份计划任务
2.mysql备份语句:mysqldump -uroot -pxxx -B -F -R -x --master-data=2 chenjianwen01|gzip >./chenjianwen01_$(date +%F).sql.gz
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
–master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
3.解压保留源文件命令:gunzip -c chenjianwen01_2017-08-30.sql.gz > chenjianwen01_2017-08-30.sql
4.查看表中的数据:
mysql> select * from userinfo;
+----------+---------------+-----------+
| fuser_id | fuser_name | fuser_age |
+----------+---------------+-----------+
| 2 | chenjianwen02 | 22 |
| 3 | 陈建文 | 22 |
+----------+---------------+-----------+
2 rows in set (0.00 sec)
5.再次向数据表中插入数据:
mysql> show tables;
+-------------------------+
| Tables_in_chenjianwen01 |
+-------------------------+
| classinfo |
| userinfo |
+-------------------------+
2 rows in set (0.00 sec) mysql> desc userinfo;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| fuser_id | int(11) | NO | PRI | NULL | auto_increment |
| fuser_name | varchar(64) | NO | | NULL | |
| fuser_age | int(11) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec) mysql> insert into userinfo (fuser_name,fuser_age) values ("chenjianwen03",22);
Query OK, 1 row affected (0.00 sec) mysql> insert into userinfo (fuser_name,fuser_age) values ("chenjianwen04",23);
Query OK, 1 row affected (0.00 sec) mysql> insert into userinfo (fuser_name,fuser_age) values ("chenjianwen05",21);
Query OK, 1 row affected (0.00 sec) mysql> select * from userinfo;
+----------+---------------+-----------+
| fuser_id | fuser_name | fuser_age |
+----------+---------------+-----------+
| 2 | chenjianwen02 | 22 |
| 3 | 陈建文 | 22 |
| 4 | chenjianwen03 | 22 |
| 5 | chenjianwen04 | 23 |
| 6 | chenjianwen05 | 21 |
+----------+---------------+-----------+
5 rows in set (0.00 sec)
6.此时误操作,删除了数据库
mysql> drop database chenjianwen01;
Query OK, 2 rows affected (0.02 sec)
此时,全备之后到误操作时刻之间,用户写入的数据在 binlog 中,需要恢复出来!
7.查看备份之后新增的 binlog 文件
[root@cjw_jdy backup]# cd /root/backup/
[root@cjw_jdy backup]# gunzip -c chenjianwen01_2017--.sql.gz > chenjianwen01_2017--.sql
[root@cjw_jdy backup]# grep CHANGE chenjianwen01_2017--.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000022', MASTER_LOG_POS=;
这是备份时刻的 binlog 文件位置,即 mysql-bin.000022 的 120 行,因此在该文件之前的 binlog 文件中的数据都已经包含在这个备份的 SQL 文件中了。
8.拷贝binlog 文件,并将mysql-bin.000022导出为sql文件,并删除里面的drop语句
[root@cjw_jdy backup]# cp /home/mysql/data/mysql-bin. .
[root@cjw_jdy backup]# ls
chenjianwen01_2017--.sql chenjianwen01_2017--.sql.gz mysql-bin.
[root@cjw_jdy backup]# mysqlbinlog -d chenjianwen01 mysql-bin. > mysql-bin..sql
[root@cjw_jdy backup]# ls
chenjianwen01_2017--.sql chenjianwen01_2017--.sql.gz mysql-bin. mysql-bin..sql
[root@cjw_jdy backup]# cat mysql-bin..sql | grep -i drop
[root@cjw_jdy backup]# rm -rf /home/mysql/data/mysql-bin.000022
注意:在恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱。
9.恢复数据,导入前需要先创建数据库,查看表信息,没有备份后插入的数据
mysql> create database chenjianwen01 charset utf8;
Query OK, row affected (0.00 sec) [root@cjw_jdy backup]# mysql -uroot -p chenjianwen01 < chenjianwen01_2017--.sql mysql> select * from userinfo;
+----------+---------------+-----------+
| fuser_id | fuser_name | fuser_age |
+----------+---------------+-----------+
| | chenjianwen02 | |
| | 陈建文 | |
+----------+---------------+-----------+
rows in set (0.00 sec)
10.使用mysql-bin.000022.sql文件恢复备份时刻到删除数据库之间新增的数据
[root@cjw_jdy backup]# mysql -uroot -p chenjianwen01 < mysql-bin..sql
11.检查恢复后的数据
mysql> select * from userinfo;
+----------+---------------+-----------+
| fuser_id | fuser_name | fuser_age |
+----------+---------------+-----------+
| | chenjianwen02 | |
| | 陈建文 | |
| | chenjianwen03 | |
| | chenjianwen04 | |
| | chenjianwen05 | |
+----------+---------------+-----------+
rows in set (0.00 sec)
mysql数据库增量数据恢复的实例过程【Good job】
mysql数据安全一之数据恢复案例的更多相关文章
- MySQL 之数据库增量数据恢复案例
MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...
- MySQL 数据库增量数据恢复案例
MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...
- MySQL中truncate误操作后的数据恢复案例
MySQL中truncate误操作后的数据恢复案例 这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的 ...
- mysql数据安全之利用二进制日志mysqlbinlog备份数据
mysql数据安全之利用二进制日志mysqlbinlog备份数据 简介:如何利用二进制日志来备份数据 什么是二进制日志: 二进制日志就是记录着mysql数据库中的一些写入性操作,比如一些增删改,但是, ...
- 阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例
阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录 ...
- mysql 启动失败,数据恢复
mysql 启动失败,数据恢复 2017年02月13日 16:46:36 阅读数:621 Forcing InnoDB Recovery提供了6个等级的修复模式,需要注意的是值大于3的时候,会对数据文 ...
- mysql的binlog进行数据恢复
什么是binlog? binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作).数据库增量备 ...
- mysql利用binlog进行数据恢复
目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...
- MySQL 误操作后数据恢复(update,delete忘加where条件)【转】
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...
随机推荐
- 层序遍历二叉树 完整层序重建二叉树 python
给定一个二叉树的完整的层次遍历序列(包含所有节点,包括空节点),利用这个序列生成一颗二叉树. 我们首先来看怎样对一颗二叉树进行层序遍历,下图所示的二叉树层次遍历的结果为[a,b,c,d,e],在这个过 ...
- 设计模式 - 代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- linux另一种安装方式
linux中其实没有“安装”的概念:安装就是设下路径,拷贝文件,复制文件,运行下脚本这些(windows也应该如此) 法一.把bin运行路径设成环境变量 法二.ln一下,例如: 解压下载的文件: ta ...
- [IC]Lithograph(1)光刻技术分析与展望
文章主体转载自: 1.zol摩尔定律全靠它 CPU光刻技术分析与展望 2.wiki:Extreme ultraviolet lithography 3.ITRS 2012 1. 光刻技术组成和关键点 ...
- LOJ2424 NOIP2015 子串 【DP】*
LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...
- C#/.NET 匿名函数会捕获变量,并延长对象的生命周期
小伙伴在一次垃圾回收中,发现对象并没有被回收掉,而注释掉一句代码后它便能够回收. 这究竟是为什么? 不关心探索过程的就直接拉到最后看结论吧! 探索 测试代码是这样的: private void O ...
- python(十二):网络编程之ISO/OSI模型
互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...
- UVA11538 Chess Queen
题意 给一个\(n \times m\)的棋盘,输出有多少种方法放置两个互相攻击的皇后. \(n,m \leq 10^6\) 分析 参照刘汝佳的题解. 横.竖.斜三种情况互不相干,加法原理统计. 横竖 ...
- c++ 中 毫秒级时间获取
#include <time.h> clock_t start,ends; start=clock(); Sleep(); ends=clock(); cout<<ends-s ...
- 以gevent(协程) 方式跑uwsgi服务
当你的系统存在一些IO或网络请求较久的操作时, 如果以默认的方式启动uwsgi服务, 那么如果这类请求过多的时候, 所以进程被卡死. uwsgi就无法再对后续请求做处理了. 这时可以用gevent的方 ...