正休息的时候一个电话将我的睡意完全打散,“开发童鞋写update SQL的时候忘了加where条件了”,相信每一个DBA同学听到这个消息的时候都有骂街的冲动吧。万幸只是单表写花了,而不是哪位大神在DB里面drop table玩。虽然已经很久没进行单表恢复了,但是还好步骤都印在脑海中,没有出问题的就恢复完了。

  言归正传,记录一下单表恢复的步骤和关键点,提醒自己也提醒大家。

第一步:

  找一台性能比较高的服务器作为还原机,从备份池中将最近的一次备份恢复到这台还原机上。当然这个前提是你有备份,且备份是可用的。(什么? 你告诉我没有做备份,那么同学你可以洗洗睡了,准备享受自由的空气吧。)

  注意:这个时候不要启动同步,务必保持不同步状态。

  ps:多说一嘴,对于DBA来说,备份是最重要的一个环节,不但要有,还要定期检查备份是否是可用的,这是DBA的必要素质之一。

第二步:

  联系那个犯错的开发同学要错误的SQL语句和时间点,然后从主库的binlog中找到这条SQL的执行点。具体操作举例如下

### 使用mysqlbinlog将二进制日志转化为明文SQL日志
mysqlbinlog mysql-bin.000123 > /data1/000123.sql ### 使用linux的grep命令根据“key word”找到那个引发数据写花的SQL所在的位置
cat 000123.sql |grep -C 10 'key word' --color ### 标红色的是问题SQL,及这条SQL开始的时间点,及下一条SQL的开始时间点,这2个pos位置非常重要
# at 20393709
#131205 20:55:08 server id 18984603 end_log_pos 20393779 Query thread_id=16296016 exec_time=0 error_code=0
SET TIMESTAMP=1386248108/*!*/;
BEGIN
/*!*/;
# at 20393779
#131205 20:55:08 server id 18984603 end_log_pos 20394211 Query thread_id=16296016 exec_time=0 error_code=0
SET TIMESTAMP=1386248108/*!*/;
update table tablename set names='xxxx';
# at 20394211
#131205 20:55:08 server id 18984603 end_log_pos 20394238 Xid = 92465981
COMMIT/*!*/;
# at 20394238
#131205 20:55:10 server id 18984603 end_log_pos 20394308 Query thread_id=16296017 exec_time=0 error_code=0
SET TIMESTAMP=1386248110/*!*/;
BEGIN

第三步:

  根据第二步得到的pos位置,启动同步关系,但是需要停止到问题SQL之前的pos位置上,具体使用如下命令

### pos位置等于问题SQL begin的pos位置
slave start until master_log_file='mysql-bin.000123',master_log_pos=20393709;

  然后跳过这个问题SQL,将同步change到下一个pos位置上,具体使用如下命令

### pos位置等于问题SQL commit之后的pos位置
change master to master_log_file='mysql-bin.000123',master_log_pos=20394238;

  从上面两条命令我们看出,第二步得到的两个pos位置很关键。

第四步:

  在主库上将写花的表改名,其目的有二个,其一,停止对这个表的写入(当然这对业务会有一定的影响,会出现一段时间内的写入失败报警,需要提前和业务部门联系好),其二,一旦恢复失败,至少还有一个写花的表存在,可以很快的恢复成我们恢复操作之前的状态。

### 在主库上执行
rename table tablename to tablename_bak;

  然后在还原机上执行dump操作,执行这个操作的使用需要注意,如果表中有中文字符,一定记得需要添加--default-chararter-set参数

mysqldump -uusername -ppassword -S/tmp/mysql.sock dbname tablename --opt> tablename.sql

  最后将这个文件传输到主库服务器上,完成最后的恢复操作

### 可以选择登陆mysql之后
source tablename.sql; ### 也可以在cmd界面
mysql -uusername -ppassword -S/tmp/mysql.sock < tablename.sql

  当然也可以不这么麻烦,直接执行如下命令,但是个人习惯处于保存历史操作记录和中间结果的需要,我都是按照以上步骤完成,这样可以保存一个随时可以恢复的文本文件,心理更踏实一点。

### 快速的方法可以按照如下操作,在还原机上的命令
mysql -uusername -ppassword -S /tmp/mysql.sock dbname tablename | mysql -uusername -ppassowrd -hhost -Pport

  通过以上命令就可以直接完成dump并导入的操作了,缺点就是不会有一份备份文件生成。

第五步:

  基本DBA的事情就没有了,这时候就需要告诉开发同学恢复完毕,进行应用测试及数据正确性效验了。如果一切都没有问题之后,我们需要将刚才rename的表drop掉,整个恢复操作就算大功告成了。

drop table if exists tablename_bak;

  数据库恢复是每个DBA必备的技能,需要熟练掌握,希望度过这篇文章的同学们都可以轻车熟路的进行恢复操作。

  ps:这个操作,最好一万年都不要用一次就最好了。

  

  

MySQL单表恢复方法的更多相关文章

  1. Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

    参考书籍<mysql是怎样运行的> 非常推荐这本书,通俗易懂,但是没有讲mysql主从等内容 书中还讲解了本文没有提到的子查询优化内容, 本文只总结了常见的子查询是如何优化的 系列文章目录 ...

  2. mysql单表大小的限制

    mysql单表大小的限制一.MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了.在mysql5. ...

  3. MySQL单表多字段模糊查询

    今天工作时遇到一个功能问题:就是输入关键字搜索的字段不只一个字段,比如 我输入: 超天才 ,需要检索出 包含这个关键字的 name . company.job等多个字段.在网上查询了一会就找到了答案. ...

  4. Mysql 单表查询 子查询 关联查询

    数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

  5. MySQL单表最大限制

    想把一个项目的数据库导出来,然后倒入到自己熟悉的MySQL数据库中进行运行和调试.导出来后,发现sql文件整整有12G多大,忽然想起来,MySQL好像有个叫做容量限制的神奇特性,但是忘了上限是多少了, ...

  6. springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany

    springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...

  7. MYSQL单表可以存储多少条数据???

    MYSQL单表可以存储多少条数据??? 单表存储四千万条数据,说MySQL不行的自己打脸吧. 多说一句话,对于爬虫来说,任何数据库,仅仅是存储数据的地方,最关心的是 能否存储数据和存储多少数据以及存储 ...

  8. MySQL密码的恢复方法

    MySQL密码的恢复方法之一 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态 ...

  9. python 3 mysql 单表查询

    python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

随机推荐

  1. SurfaceFlinger 讲解

    SurfaceFlinger是Android multimedia的一个部分,在Android 的实现中它是一个service,提供系统 范围内的surface composer功能,它能够将各种应用 ...

  2. Android Studio 找不到EventBus/ButterKnife等第三方包解决方案

    废话不多说,有图有真相 Q·:可以正常Build,debug就是看着不舒服,代码提示也出不来. 解决方案: 1. invalidate and restart (没用继续第二步) 2. 修改gradl ...

  3. 模块定义文件.def

    一作用 DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供 ...

  4. POJ 1218 THE DRUNK JAILER(类开灯问题,完全平方数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 题目大意:n为5-100之间的一个数,代表有多少间牢房,刚开始所有房间打开,第一轮2的倍数的房间 ...

  5. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...

  6. Windows内核读书笔记——Windows异常分发处理机制

    本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...

  7. 诺基亚9 PureView正式发布

    [手机中国新闻]当地时间2月24日下午16点,HMD在西班牙巴塞罗那正式发布了诸多新品,其中最吸睛的莫过于Nokia 9 PureView.作为全球首款五摄新机,Nokia 9 PureView后置五 ...

  8. Python全栈开发之3、数据类型set补充、深浅拷贝与函数

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5466082.html 一.基本数据类型补充 set是一个无序而且不重复的集合,有些类似于数学中的集合,也可以求交集, ...

  9. Python基本语法[二]

    Python基本语法 1.定义变量:  代码正文: x= y= z=x+y 代码讲解: 2.判断语句:  代码正文: score= : print("你真棒") print(&qu ...

  10. python模拟QQ聊天室(tcp加多线程)

    python模拟QQ聊天室(tcp加多线程) 服务器代码: from socket import * from threading import * s = socket(AF_INET,SOCK_S ...