事件起因
早起删除mysql库中异常数据,使用控制台ssh连接上进行删除。第一次删除成功,第二次删除改写where条件。中文输入法忘记关闭,没有确认SQL语句,点击Enter..........意外的整表被清空了。
第一件事锁表 `lock table xxx;`
开搜索引擎开始查找,大多方案都是通过binlog进行恢复。但是我的mysql跑在了arm的机器上,为了节省资源没开binlog.
继续搜索找到了一个通过idb文件 恢复的方案。首先备份你的idb文件。
下载并编译恢复程序
#下载并解压文件
wget https://launchpad.net/percona-data-recovery-tool-for-innodb/trunk/release-0.5/+download/percona-data-recovery-tool-for-innodb-0.5.tar.gz
tar -zxvf percona-data-recovery-tool-for-innodb-0.5.tar.gz
#准备编译环境,在arm的机器上好多类库不好找到,我已经把idb文件拷贝到另外 一台x86的centos机器上
#安装依赖库
yum install ncurses-devel libc-dev glibc-devel
cd percona-data-recovery-tool-for-innodb-0.5/mysql-sorce
./configure
cd ..
make -j4
#请检查编译结果,可能会有警告,只要没有错误就行。
#准备开始恢复数据
./page_parser -5 -f ~/mysql/temp_monitor.ibd
#之后会产生一个pages-888888888的目录
#通过线上的表结构创建.h文件
mysql/percona-data-recovery-tool-for-innodb-0.5/create_defs.pl --host localhost --user xxxx --db YYYYY --table zzzzz >include/table_defs.h
#再次执行make
make
#恢复数据文件 ,同时 程序会帮你产生一个恢复脚本
./constraints_parser -D -5 -f pages-1557083133/FIL_PAGE_INDEX/0-21/ > /tmp/temp_monitor.dbf
LOAD DATA INFILE '/root/mysql/percona-data-recovery-tool-for-innodb-0.5/dumps/default/temp_monitor' REPLACE INTO TABLE `temp_monitor` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'temp_monitor\t' (id, ambient_temperature, cpu_temperature, humidity, date);
#之后将以上文件 拷贝回生产机器,连入数据库执行以上命令即可恢复数据
经验总结
1. 在一些条件不太好情况下需要通过控制台直接操作数据库的,请先dump下吧。
2. 如果机器性能允许请打开binlog
3. 一旦有误操作,请先锁表。
4. 需要直接操作时的机器尽量不装中文输入法。
5. 小心小心再小心