• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL单表恢复的步骤

      正休息的时候一个电话将我的睡意完全打散,“开发童鞋写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单表恢复的步骤的详细内容,更多关于mysql单表恢复的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • MySQL使用全库备份数据恢复单表数据的方法
    • MySQL如何恢复单库或单表,以及可能遇到的坑
    • 从MySQL全库备份中恢复某个库和某张表的方法
    • mysql 从 frm 文件恢复 table 表结构的3种方法【推荐】
    • InnoDB 类型MySql恢复表结构与数据
    • MySQL 从全库备份中恢复指定的表和库示例
    • MySQL单表ibd文件恢复方法详解
    • MYSQL使用.frm恢复数据表结构的实现方法
    • 用mysqldump备份和恢复指定表的方法
    • MySQL 利用frm文件和ibd文件恢复表数据
    上一篇:MySQL如何创建视图
    下一篇:MySQL性能优化之如何高效正确的使用索引
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL单表恢复的步骤 MySQL,单表,恢复,的,步骤,