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数据安全一之数据恢复案例的更多相关文章

  1. MySQL 之数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  2. MySQL 数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  3. MySQL中truncate误操作后的数据恢复案例

    MySQL中truncate误操作后的数据恢复案例 这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的 ...

  4. mysql数据安全之利用二进制日志mysqlbinlog备份数据

    mysql数据安全之利用二进制日志mysqlbinlog备份数据 简介:如何利用二进制日志来备份数据 什么是二进制日志: 二进制日志就是记录着mysql数据库中的一些写入性操作,比如一些增删改,但是, ...

  5. 阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例

    阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录 ...

  6. mysql 启动失败,数据恢复

    mysql 启动失败,数据恢复 2017年02月13日 16:46:36 阅读数:621 Forcing InnoDB Recovery提供了6个等级的修复模式,需要注意的是值大于3的时候,会对数据文 ...

  7. mysql的binlog进行数据恢复

    什么是binlog? binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作).数据库增量备 ...

  8. mysql利用binlog进行数据恢复

    目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...

  9. MySQL 误操作后数据恢复(update,delete忘加where条件)【转】

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...

随机推荐

  1. 层序遍历二叉树 完整层序重建二叉树 python

    给定一个二叉树的完整的层次遍历序列(包含所有节点,包括空节点),利用这个序列生成一颗二叉树. 我们首先来看怎样对一颗二叉树进行层序遍历,下图所示的二叉树层次遍历的结果为[a,b,c,d,e],在这个过 ...

  2. 设计模式 - 代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  3. linux另一种安装方式

    linux中其实没有“安装”的概念:安装就是设下路径,拷贝文件,复制文件,运行下脚本这些(windows也应该如此) 法一.把bin运行路径设成环境变量 法二.ln一下,例如: 解压下载的文件: ta ...

  4. [IC]Lithograph(1)光刻技术分析与展望

    文章主体转载自: 1.zol摩尔定律全靠它 CPU光刻技术分析与展望 2.wiki:Extreme ultraviolet lithography 3.ITRS 2012 1. 光刻技术组成和关键点 ...

  5. LOJ2424 NOIP2015 子串 【DP】*

    LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...

  6. C#/.NET 匿名函数会捕获变量,并延长对象的生命周期

    小伙伴在一次垃圾回收中,发现对象并没有被回收掉,而注释掉一句代码后它便能够回收. 这究竟是为什么? 不关心探索过程的就直接拉到最后看结论吧!   探索 测试代码是这样的: private void O ...

  7. python(十二):网络编程之ISO/OSI模型

    互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...

  8. UVA11538 Chess Queen

    题意 给一个\(n \times m\)的棋盘,输出有多少种方法放置两个互相攻击的皇后. \(n,m \leq 10^6\) 分析 参照刘汝佳的题解. 横.竖.斜三种情况互不相干,加法原理统计. 横竖 ...

  9. c++ 中 毫秒级时间获取

    #include <time.h> clock_t start,ends; start=clock(); Sleep(); ends=clock(); cout<<ends-s ...

  10. 以gevent(协程) 方式跑uwsgi服务

    当你的系统存在一些IO或网络请求较久的操作时, 如果以默认的方式启动uwsgi服务, 那么如果这类请求过多的时候, 所以进程被卡死. uwsgi就无法再对后续请求做处理了. 这时可以用gevent的方 ...