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 为底的…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C 常见的面试知识点(上)

const 作用1,修饰变量,说明该变量不可以被改变2,修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer)3,修饰引用&…

C 常见的面试知识点(下)

inline 内联函数的特征相当于把内联函数里面的内容写在调用内联函数处;相当于不用执行进入函数的步骤,直接执行函数体;相当于宏,却比宏多了类型检查,真正具有函数特性;编译器一般不内联包含循环、递归、swi…

php cdi_集成CDI和WebSockets

php cdi考虑尝试一个简单的Java EE 7原型应用程序,该应用程序涉及JAX-RS(REST),WebSockets和CDI。 注意 :不想让它成为破坏者-但本文主要讨论我在尝试使用Web套接字和使用CDI作为“胶水”(在Java EE应用程…

c语言排序方法有哪几种?

c语言排序方法有:1、简单选择排序,基于O(n2)时间复杂度的排序算法;2、冒泡排序;3、简单插入排序;4、希尔排序;5、归并排序,基于归并操作的一种排序算法;6、快…

java 类型不可视_jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

简介:阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力。摩尔定律(Moore):该定律用于描述处理器晶体管数量与运行效率间的发展关系。当价格不变时,集成电路上可容纳的元器件的数…

c语言怎么输入3个数输出最大值

方法:首先使用scanf()接收从键盘输入的三个数;然后使用“if else”语句比较三个数的大小,获得最大值;最后使用print()函数将最大值输出即可。c语言输入3个数输出最大值#include int main() { // 输入abc输出最大值 int a; …

java调用ecdh_椭圆曲线ECC ECDH原理 javacard实现

椭圆曲线原理:椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。定义:椭圆曲线可用下列方程来表示,其中a,b,c,d为系数。E: y2 ax3 bx2 cx d椭圆曲线运算:(相当于交换群)AB&#x…

C 常用新特性(上)

下面是正文:auto类型推导auto可以让编译器在编译器就推导出变量的类型,看代码:利用auto可以通过右边的类型推导出变量的类型。什么时候使用auto呢?简单类型其实没必要使用auto,然而某些复杂类型就有必要使用auto&#…

c编译程序是什么?

c编译程序是由计算机厂家提供的一套软件。c编译程序又称c语言编译器,是指用c语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以…

运动基元_基元需要走吗?

运动基元我目前正在使用JSF作为视图技术,使用JPA作为持久层的企业应用程序。 它可能是支持bean或服务方法中的某种东西,但令我震惊:是否有充分的理由在企业应用程序中使用原语? 当我开始围绕J2SE 1.2(或者是J2SE 5.0&…

mysql 三种工作模式_mybatis三种批量插入方式对比【面试+工作】

准备:1.表结构CREATE TABLE t_user (id varchar(32) CHARACTER SET utf8 NOT NULL COMMENT 主键,name varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT 用户名,del_flag char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT 删除标示,PRIMARY KEY (id)) ENGINEI…