大家好,我是公众号《建筑改进之路》的作者张张。在我们实际工作中,尤其是在公司的测试环境中,经常会有多个业务端服务共享同一台服务器来部署各自的MySQL环境。不幸的是,会出现MySQL数据文件被删除/误删的情况。如果真的发生了,想想都非常令人沮丧,不是吗?别着急,今天小编就来给大家分享一个MySQL数据文件被误删除后的恢复尝试方法。一旦出现上述情况,没有备份实例数据,还有机会恢复数据吗?接下来我们尝试演示一下数据恢复过程:1.建立模拟数据,模拟数据准备:CREATETABLE`t1`(`id`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4mysql>select*fromt1;+------+|编号|+------+|1||2||3||4||5|+------+5rowsinset(0.00sec)2.删除数据文件在操作系统层删除数据文件。[root@admin-db12测试]#lltotal112-rw-r-----1mysqlmysql67Nov2210:01db.opt-rw-r-----1mysqlmysql8556Nov2211:48t1.frm-rw-r-----1mysqlmysql98304Nov2211:48t1.ibd[root@admin-db12测试]#pwd/mysql/dba/mysql/multi/3303/data/test[root@admin-db12测试]#lltotal112-rw-r-----1mysqlmysql67Nov2210:01db.opt-rw-r-----1mysqlmysql8556Nov2211:48t1。frm-rw-r-----1mysqlmysql98304Nov2211:48t1.ibd[root@admin-db12test]#rm-rf*[root@admin-db12test]#lltotal03.查询验证数据在数据库层,查看当前表中的数据,发现当前表中的数据当前为空。#Currentinstancemysql>select*fromt1;Emptyset(0.00sec)4.OS层获取内存中的数据。如果当前实例没有关闭,检查实例pid。[root@admin-db62测试]#psaux|grep3303root219520.00.01133041648?S11:470:00/bin/sh/mysql/dba/mysql/multi/3303/private/bin/mysqld_safe--defaults-file=/mysql/dba/mysql/multi/3303/etc/my.cnfmysql233560.21.1195294081568416?Sl11:470:04/mysql/dba/mysql/multi/3303/private/bin/mysqld--defaults-file=/mysql/dba/mysql/multi/3303/etc/my.cnf--basedir=/mysql/dba/mysql/multi/3303/private--datadir=/mysql/dba/mysql/multi/3303/data--plugin-dir=/mysql/dba/mysql/multi/3303/private/lib/plugin--user=mysql--log-error=/mysql/dba/mysql/multi/3303/log/mysql-error.log--open-files-limit=65535--pid-file=/mysql/dba/mysql/multi/3303/pid/mysql.pid--socket=/mysql/dba/mysql/multi/3303/socket/mysql.sock--port=3303[root@admin-db62fd]#cd/proc/23356/fd[root@admin-db62fd]#lllrwx------1rootroot64Nov2211:5239->/mysql/dba/mysql/multi/3303/data/mysql/time_zone.ibdlrwx------1rootroot64Nov2211:524->/mysql/dba/mysql/multi/3303/data/ib_logfile0lrwx------1rootroot64Nov2211:5240->/mysql/dba/mysql/multi/3303/data/mysql/time_zone_transition.ibdlrwx------1rootroot64Nov2211:5242->/mysql/dba/mysql/multi/3303/data/test/t1.ibd(删除)通过上面的操作,我们发现它被杀掉了由我们数据文件的状态为“已删除”,已被删除。5.获取和处理数据为了保护当前服务器站点,在另一台服务器上恢复数据。#target[root@admin-db643306]#nc-l13306>/mysql/dba/mysql/multi/3306/data/t1.ibd#db64在此服务器上,3306实例恢复上面删除的数据。/mysql/dba/mysql/multi/3306/data是数据暂存目录#sourcelrwx------1rootroot64Nov2211:5242->/mysql/dba/mysql/multi/3303/data/test/t1.ibd(删除)[root@admin-db62fd]#cat42|nc10.26.65.7413306#如上操作,将OS层内存中的数据复制传输到远程恢复服务器。【注意】请勿在本机还原,保持在线环境,以免二次损坏。6.数据恢复处理在源服务器上进行数据恢复操作。[root@admin-db643306]#nc-l13306>/mysql/dba/mysql/multi/3306/data/t1.ibd[root@admin-db643306]#cddata/[root@admin-db64数据]#lltotal100-rw-r-----1mysqlmysql67Nov2212:36db.opt-rw-r--r--1rootroot98304Nov2212:37t1.ibd[root@admin-db64data]#chown-Rmysql.mysqlt1.ibd#Changetheownerloginsourcetorestoretheinstanceoperation:mysql>usetest;Databasechangedmysql>showtables;Emptyset(0.00sec)#1.根据表结构建表(别跟我说表结构没了。。。)CREATETABLE`t1`(`id`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4#2、discardtablespacemysql>altertablet1discardtablespace;QueryOK,0rowsaffected,1warning(0.01sec)#3.把上面准备好的数据文件放到正确的目录下[root@admin-db64data]#mvt1.ibdtest/#4。importtablespacemysql>altertablet1importtablespace;查询正常,0行受影响,1条警告(0.01秒)#5。检查数据是否正常检查mysql>select*fromt1;+------+|编号|+------+|1||2||3||4||5|+------+5罗wsinset(0.00sec)通过以上步骤的运行,发现可以正常查看数据,只需要备份恢复到要恢复的实例即可。在此不再赘述。写在最后,今天给大家分享一个利用内存数据恢复误删数据文件的方法。其实还有一些其他的恢复方式,需要根据不同的场景选择最优方案。最后,我需要向大家强调,预防远比治疗有意义。另外,在MySQL集群方案中,不时会使用备份来恢复实例,因此也需要定期检查备份的有效性。如果你是业务开发的同学,可以使用showgrants命令查看账号权限。如果权限太大,可以建议DBA同学给你分配一个权限较低的账号;也可以评估业务的重要性,和DBA期间讨论备份,是否需要创建备库做延迟复制等等。请记住,数据和服务的可靠性不仅是运维团队的工作,最终还是所有合作环节的结果。
