数据误删是一个线上常见的灾难问题。想起当年公司小伙伴在上线前一天删除了用户表的数据,打电话给经理的手都是颤抖的。经理绞尽脑汁,凌晨从别的表找到人员数据拼凑恢复到用户表,但最后还是丢了部分用户数据。
模拟单表数据丢失
如果是执行了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)
此处警告无影响。
已经恢复成功,查询下数据: