mysql+误操作怎么恢复_Mysql误操作恢复流程

一、开启binlog。

show variables like 'log_bin';

0818b9ca8b590ca3270a3433284dd417.png

#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 number|gzip> /martin/data/number_$(date +%F).sql.gz

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

或者

#innobackupex --user=root --password='martin' --include=backup.number /data/mysql_backup/number/ 2>/data/mysql_backup/number.log

四、写入增量数据

继续执行程序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 

#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 

九、确认已恢复数据

登录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 |

| 31 | 2016-06-29 23:43:05 |

+----+---------------------+

31 rows in set (0.00 sec)

恢复正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

drools6.5_Drools 6.2.0.Final发布

drools6.5我们很高兴地宣布最新,最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能,这些功能使项目更易于使用(和采用)。 新功能包括对工作台UI的大量改进,对社交活动和插件管理的支持以及…

c程序编写x的y次方的方法

c程序怎么编写x的y次方?C语言pow()函数:求x的y次方(次幂)头文件:#include pow() 函数用来求 x 的 y 次幂(次方),其原型为:double pow(double x, double y);pow()用来计算以x 为底的…

python redis pipeline使用方法_python使用pipeline批量读写redis的方法

用了很久的redis了。随着业务的要求越来越高。对redis的读写速度要求也越来越高。正好最近有个需求(需要在秒级取值1000的数据),如果对于传统的单词取值,循环取值,消耗实在是大,有小伙伴可能考虑到多线程,但这并不是最…

jboss fuse 教程_JBoss Fuse –一些鲜为人知的技巧

jboss fuse 教程TL; DR 将Java静态调用公开为Karaf Shell本机命令 在部署时覆盖OSGi标头 在使用OSGi片段部署时间后覆盖OSGi标头 将Java静态调用公开为Karaf Shell本机命令 作为必须与支持人员和客户进行协作的软件工程师的一部分,我经常发现自己需要从无法访问…

8条嵌入式C语言编程小知识总结

1. 流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率&#xff0c…

c语言函数的三种调用方式是什么?

函数的三种调用方式:1、函数作为表达式中的一项出现在表达式中,例“zmax(x,y)”;2、函数作为一个单独的语句,例“printf("%d",a)”;3、函数作为调用另一个函数时的实参,例“printf("%d"…

CF1913D. Array Collapse [dp+单调栈+前缀和]

传送门 [前题提要]:感觉dp还是很显然的,感觉单调栈也不是很难想,但是VP的时候脑子比较乱,dp方程想偏了,没写出来… 看完题目,不难发现应该存在一种递推关系.因为会发现最后剩下来的必然是原序列的一种子序列,然后这种子序列计数的问题.应该想到使用dp计数. 刚开始我的想法是使…

弱口令扫描工具mysql ftp_基于端口的弱口令检测工具--iscan

iscan: 基于端口的弱口令检测工具亲手打造了一款基于端口的弱口令检测工具,使用python进行编写,主要可以用于渗透测试中常见服务端口弱口令的检测。目前支持以下服务:系统弱口令:ftp、ssh、telnet、ipc$数据库弱口令:m…

javafx 剪切板_JavaFX技巧18:路径剪切

javafx 剪切板我最近注意到,我致力于ControlsFX项目的PopOver控件无法正确剪切其内容。 当我为FlexCalendarFX框架开发手风琴弹出窗口时,这一点变得显而易见。 每当最后一个标题窗格扩展时,其底角不再是圆角而是正方形。 在标题窗格中放置一个…

用于单片机的几种C语言算法

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。虽然单片机不擅长实现算法和进行复杂的运算,但在某些特定场合,不可避免地要用到数学运算。比如:在单片机进行数据采集时,会遇到数据的随机误差&#xff0…

jmh 基准测试_JMH:如何设置和运行JMH基准

jmh 基准测试健康警告! 这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知,微基准测试很难正确设置,即使您确实正确设置了(通过使用JMH之类的工具),它们仍然会产生误导。 仅仅因为您的代码在极端孤…

java super是什么意思_java中Super到底是什么意思?必须举例说明!

[学习笔记]3."超"关键字(super keyword)Super是一个参考(或说指针)指向他紧邻的父类(见下面的例子)。用super可以指向被隐藏的父类的同名成员。3.1 super指向父类的成员注意: 下例中:子类和父类都有i,我们一共有两个i,用…

嵌入式开发中C语言编程要点简述!

在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容。除此之外,与一般的C语言编程相比,嵌入式Linux的C语言编程有以下一些要点:1、库函数与系统调用在进行C语言编程的时候,使用库函数是不可避免的。关于使…

java编译源文件_在java编程中用什么命令来编译java源文件 可以将源文件编译成字节码文件,求答案 。...

展开全部答案如下:1 、javac 选 A2、 int 选 D int 为关键字3、 4 选 B4、 15 选C5 、界面类型 选D6 、age[0] 选B7、 class 选A8 、java B9、 abstract 选B10 、false 选D1、 错,区分大小写2、 对3 、错e68a843231313335323631343130323136353331333365…

jdk8分组统计字段和_JDK 8流和分组

jdk8分组统计字段和我在JDK 8中的Stream-Powered Collections Functionality中介绍了将JDK 8的Streams与Java集合一起使用的强大功能。 我没有在那篇文章中讨论groupingBy Collector 减少操作的使用,因此在这篇文章中解决了分组问题。 本文中的示例将演示如何将集合…

C语言中,break和continue都是跳出循环,有啥区别?

首先说明:continue 只能用于循环语句中,而break可用于循环和 switch 语句,两者都是辅助循环;尽管如此,如果 switch 语句在一个循环中,continue便可作为 switch 语句的一部分;这种情况下&#xf…

java隐藏与覆盖_java中方法的隐藏和覆盖问题?

ok()方法在继承时候发生覆盖(重写)了吗?发生了。在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature),所以在这里发生了重写。调用B类对象的ok()方法会print "b",父类方法被覆盖。如果是重写了,那定义一…

junit junit_使用junit做其他事情

junit junitjunit!单元测试 Junit是Java单元测试框架。 通常,我们将它用于单元测试,但是很多时候我们也使用它来执行集成测试。 主要区别在于,单元测试测试单个单元,而集成测试则测试不同类如何协同工作。 这样&#x…

C 的 3种内存顺序,你都知道吗?

1、std::memory_order_relaxed “自由”内存顺序在原子类型上的操作以自由序列执行,没有任何同步关系,仅对此操作要求原子性。例如,在某一线程中,先写入A,再写入B。但是在多核处理器中观测到的顺序可能是先写入B&#…

java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总

在Java面试中常遇到的技术问题汇总 如果你正准备参加Java开发岗位面试,那么你会遇到很多有关多线程的面试问题。为什么呢?因为多线程和并发问题已经成为Java面试中必不可少的一部分。大多数企业在面试的时候都喜欢用棘手的Java线程面试题来考察面试者,他们希望确保面试者对J…