详解MySQL误操作后怎样进行数据恢复

 更新时间:2016年08月09日 17:45:22   作者:Martin  
在大家日常操作数据库时候难免会因为“大意”而误操作,那么误操作后怎样进行数据恢复呢,下面跟着小编一起来学习学习。

一、开启binlog。

首先查看binlog是否开启

mysql> show variables like "log_bin";
+---------------+-------+
|Variable_name | Value 
+---------------+-------+
| log_bin  OFF 
+---------------+-------+
1 row in set (0.00 sec)

值为OFF,需开启,开启binlog方式如下:

#vim /etc/my.cnf

在[mysqld]中加入

log-bin     = mysql-bin
log-bin     = /usr/local/mysql/log/mysql-bin.log

重启mysql服务

#service mysqld stop
#service mysqld start

二、模拟数据写入

建库

create database backup;

建表

CREATE TABLE `number` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
 `updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

写入数据

程序2-1

#coding:utf8
#python2.7
import MySQLdb
import time
def connect_mysql(db_host="192.168.11.169",user="martin",passwd="martin",db="backup",charset="utf8"):
 conn = MySQLdb.connect(host=db_host,user=user,passwd=passwd,db=db,charset=charset)
 conn.autocommit(True)
return conn.cursor()
#数据插入
for i in range(0,10):
#time=time.strftime("%Y-%m-%d %H:%M:%S")
sql = 'insert into number(updatetime) values(%s)'
values = [(time.strftime("%Y-%m-%d %H:%M:%S"))]
 db1 = connect_mysql()
print db1.executemany(sql,values)

查询数据

mysql> select * from number;
+-------+------------------------+
| id | updatetime   
+--------------------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
+-------+------------------------+
10 rows in set (0.00 sec)

三、全量备份

mysqldump -uroot -p -F --master-data=2 backup |gzip> /martin/data/backup_$(date +%F).sql.gz

注:加-F能刷新binlog,方便恢复时操作。

四、模拟写入增量数据

继续执行程序2-1。

查询数据

mysql> select * from number;
+----+---------------------------+
| id | updatetime   |
+----+---------------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
| 11 | 2016-06-29 23:31:03 |
| 12 | 2016-06-29 23:31:03 |
| 13 | 2016-06-29 23:31:03 |
| 14 | 2016-06-29 23:31:03 |
| 15 | 2016-06-29 23:31:03 |
| 16 | 2016-06-29 23:31:03 |
| 17 | 2016-06-29 23:31:03 |
| 18 | 2016-06-29 23:31:03 |
| 19 | 2016-06-29 23:31:03 |
| 20 | 2016-06-29 23:31:03 |
+-------+---------------------+
20 rows in set (0.00 sec)

五、增量备份

保留mysql-bin.000002及之后的binlog即可。

六、模拟误操作

delete from number;

七、再次写入增量数据

执行程序2-1

select * from bumber;

+------+------------------------+
| id | updatetime   |
+------+------------------------+
| 21 | 2016-06-29 23:41:06 |
| 22 | 2016-06-29 23:41:06 |
| 23 | 2016-06-29 23:41:06 |
| 24 | 2016-06-29 23:41:06 |
| 25 | 2016-06-29 23:41:06 |
| 26 | 2016-06-29 23:41:06 |
| 27 | 2016-06-29 23:41:06 |
| 28 | 2016-06-29 23:41:06 |
| 29 | 2016-06-29 23:41:06 |
| 30 | 2016-06-29 23:41:06 |
+------+------------------------+
10 rows in set (0.00 sec)

八、恢复

此时发现之前的delete操作为误操作,急需恢复,恢复过程如下

给该表加上读锁

lock table number read;

将全量备份的数据导入

#cd /martin/data/
#gzip -d number_2016-06-29.sql.gz
#grep -i "change" *.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;

刷新日志

#mysqladmin -uroot -p'martin' flush-logs
#cd /usr/local/mysql/log
#ls|grep mysql-bin|grep -v index
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003

可确定mysql-bin.000002为增量数据binlog

导入全量备份

#cd /martin/data/
#mysql -uroot -p backup < number_2016-06-29.sql
#cp /usr/local/mysql/log/mysql-bin.000002 /martin/data/
#mysqlbinlog mysql-bin.000002 >bin.sql
#vim bin.sql

在bin.sql找到之前的delete语句,删除

mysql -uroot -p <bin.sql

九、确认已恢复数据

登录mysql

#mysql -uroot -p'martin' backup
select * from number;
+----+---------------------+
| id | updatetime   |
+----+---------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
| 11 | 2016-06-29 23:31:03 |
| 12 | 2016-06-29 23:31:03 |
| 13 | 2016-06-29 23:31:03 |
| 14 | 2016-06-29 23:31:03 |
| 15 | 2016-06-29 23:31:03 |
| 16 | 2016-06-29 23:31:03 |
| 17 | 2016-06-29 23:31:03 |
| 18 | 2016-06-29 23:31:03 |
| 19 | 2016-06-29 23:31:03 |
| 20 | 2016-06-29 23:31:03 |
| 21 | 2016-06-29 23:41:06 |
| 22 | 2016-06-29 23:41:06 |
| 23 | 2016-06-29 23:41:06 |
| 24 | 2016-06-29 23:41:06 |
| 25 | 2016-06-29 23:41:06 |
| 26 | 2016-06-29 23:41:06 |
| 27 | 2016-06-29 23:41:06 |
| 28 | 2016-06-29 23:41:06 |
| 29 | 2016-06-29 23:41:06 |
| 30 | 2016-06-29 23:41:06 |
+----+---------------------+
30 rows in set (0.00 sec)

恢复完成!以上就是本文的全部内容,在操作数据库时候要多加小心尽量避免误操作,如果万一遇到了,希望本文能够帮助大家。

相关文章

  • MySQL中查询日志与慢查询日志的基本学习教程

    MySQL中查询日志与慢查询日志的基本学习教程

    这篇文章主要介绍了MySQL中查询日志与慢查询日志的基本学习教程,文中还提到了MySQL自带的Mysqldumpslow日志分析工具的使用,需要的朋友可以参考下
    2015-12-12
  • QT连接Mysql数据库的详细教程(亲测成功版)

    QT连接Mysql数据库的详细教程(亲测成功版)

    被Qt连接数据库折磨了三天之后终于连接成功了,记录一下希望对看到的人有所帮助,下面这篇文章主要给大家介绍了关于QT连接Mysql数据库的详细教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Sql在单一表中检索数据的方法详解

    Sql在单一表中检索数据的方法详解

    这篇文章主要介绍了Sql在单一表中检索数据的方法,SELECT语句是SQL中最常用的语句。它的用途是从一个或多个表中检索信息。为了使用SELECT检索表数据,必须至少给出两条信息:想选择什么、从什么地方选择
    2023-02-02
  • 一文深入探讨MySQL是如何解决幻读问题

    一文深入探讨MySQL是如何解决幻读问题

    SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,本文将重点探讨下MySQL是如何解决幻读问题的,需要的朋友可以跟着小编一起来探讨一下
    2023-07-07
  • 允许远程访问MySQL的实现方式

    允许远程访问MySQL的实现方式

    这篇文章主要介绍了允许远程访问MySQL的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • mac 装5.6版本mysql 设置密码的简易方法

    mac 装5.6版本mysql 设置密码的简易方法

    这篇文章主要介绍了mac 装5.6版本mysql 设置密码的简易方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • MYSQL数字函数详解及实战记录(数字函数大全,内含示例)

    MYSQL数字函数详解及实战记录(数字函数大全,内含示例)

    数学运算函数可以实现常见的数学运算,这篇文章主要给大家介绍了关于MYSQL数字函数详解及实战的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • mysql数据库row_number函数举例介绍

    mysql数据库row_number函数举例介绍

    在MySQL中ROW_NUMBER()是一种用来生成行号的功能函数,通常情况下它用于对查询结果进行编号,以便方便地查看每行的位置,下面这篇文章主要给大家介绍了关于mysql数据库row_number函数举例介绍的相关资料,需要的朋友可以参考下
    2024-02-02
  • 详解关于MySQL 8.0走过的坑

    详解关于MySQL 8.0走过的坑

    这篇文章主要介绍了详解关于MySQL 8.0走过的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • MySQL视图的概念和操作函数详解

    MySQL视图的概念和操作函数详解

    对MySQL数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理,下面这篇文章主要给大家介绍了关于MySQL数据库基本SQL语句教程之高级操作中视图的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论