[MySQL] 根据物理备份恢复单表

数据误删是一个线上常见的灾难问题。想起当年公司小伙伴在上线前一天删除了用户表的数据,打电话给经理的手都是颤抖的。经理绞尽脑汁,凌晨从别的表找到人员数据拼凑恢复到用户表,但最后还是丢了部分用户数据。

模拟单表数据丢失

如果是执行了delete,可以通过解析binlog日志为“undo语句”,反向将数据恢复回来;但是如果执行的语句是drop,那么…尽快买一张机票,离开这个是非之地。
在这里插入图片描述
上篇讲到使用xtrabackup可以进行物理备份,优点是可以快速恢复数据,线上也是各家公司常用的数据库备份工具。

现模拟数据删除和恢复流程。

删除数据库中某张表

p_medical_detail,总数据量为1576879:
在这里插入图片描述
删表:

drop table p_medical_detail; 

在这里插入图片描述

恢复单表数据

之前将数据库进行了物理备份(可参考[MySQL]物理备份xtrabackup这篇文章)

建表

如果已知表结构,可手动将表结构创建到数据库中。

CREATE TABLE p_medical_detail(  
     id VARCHAR(32) PRIMARY KEY COMMENT '主键Id',
     medical_id VARCHAR(32) NOT NULL COMMENT '就医行为id',
     drug_name VARCHAR(100) COMMENT '就医药品名称',
     price numeric(8,2) COMMENT '就医药品价格',
     INDEX  idx_medical_id  (medical_id)
)comment = '就医明细表';

否则,可借助第三方工具mysql-utilities从frm文件中获取表结构。
mysql-utilities是mysql的一个工具集合,它是基于python实现的,官网地址:
https://downloads.mysql.com/archives/utilities/

编译安装:

[root@localhost backup]# wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
[root@localhost backup]# tar xvf mysql-utilities-1.6.5.tar.gz
[root@localhost backup]# cd mysql-utilities-1.6.5
[root@localhost backup]# python setup.py build
[root@localhost backup]# python setup.py install
[root@localhost backup]# mysqldiff --version

恢复数据

线上为防止数据错乱,可加一个写锁:

mysql> lock tables p_medical_detail write;
Query OK, 0 rows affected (0.00 sec)

丢弃表空间:

mysql> alter table p_medical_detail discard tablespace;
Query OK, 0 rows affected (0.02 sec)

拷贝ibd文件,并修改为mysql的用户权限:

[root@node15 webchat]# cp /mysql/innobackup/base-dir-all/webchat/p_medical_detail.ibd /mysql/data/webchat/
[root@node15 webchat]# chown mysql.mysql /mysql/data/webchat/p_medical_detail.ibd

载入表空间:

mysql> alter table p_medical_detail import tablespace;
Query OK, 0 rows affected, 1 warning (15.84 sec)

mysql> show warnings;
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                                  |
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './webchat/p_medical_detail.cfg', will attempt to import without schema verification |
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

此处警告无影响。
已经恢复成功,查询下数据:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值