海外有一台服务器受到攻击,上面有自建的mysql数据库,要把数据库备份下来,要到地址账号密码登录上去看了一下mysql版本是5.1的
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
于是就进行mysqldump导出,执行发现报错
mysqldump: Couldn't execute 'show create table `dr_app`': Unknown table engine 'InnoDB' (1286)
root@li1881-239:/home/sql#>mysqldump -S /var/lib/mysql/mysql.sock -uroot -p'xxxxxx' --hex-blob -R -E --skip-lock-tables --databases xxxx > db_xxxx_20210607.sql ;
mysqldump: Couldn't execute 'show create table `dr_app`': Unknown table engine 'InnoDB' (1286)
不能进行show create table 操作
登录到数据执行查询也报错
mysql> select * from dr_app;
ERROR 1286 (42000): Unknown table engine 'InnoDB'
mysql>
到后台数据库目录查看表
root@li1881-239:/var/lib/mysql/xxx#>ll
total 2.3M
drwx------ 2 mysql mysql 12K [2017-07-07 08:31] .
drwxr-xr-x 13 mysql mysql 4.0K [2021-06-07 10:17] ..
-rw-rw---- 1 mysql mysql 65 [2015-01-26 03:44] db.opt
-rw-rw---- 1 mysql mysql 8.6K [2015-01-26 03:45] dr_app.frm
-rw-rw---- 1 mysql mysql 8.6K [2015-01-26 03:45] dr_apphistory.frm
-rw-rw---- 1 mysql mysql 8.8K [2015-01-26 03:46] draw_action.frm
-rw-rw---- 1 mysql mysql 8.8K [2015-01-26 03:46] draw_action_log.frm
-rw-rw---- 1 mysql mysql 112K [2015-02-15 10:11] draw_action_log.MYD
-rw-rw---- 1 mysql mysql 13K [2015-02-15 10:53] draw_action_log.MYI
发现dr_app表的MYD和MYI文件被删除了
文件被删除了这台服务的mysql也没有备份(几年前的数据库),领导说被删除的只需要备份表结构就可以了
进一步发现被删除的表文件有几百个,需要把这些被删除的表找出来,然后通过frm文件恢复表结构
进到数据库目录下取表名,先把进行分组计数,正常情况下表名对应三个文件,我们只需要找出表名对应的文件只有1个(说明它的MYD,MYI文件被删除了)
如下命令:
ll |awk '{print $8}' |awk -F '.' '{count[$1]++;} END {for(i in count) {if(count[i]==1) print i }}'
root@li1881-239:/var/lib/mysql/drawwiz#>ll |awk '{print $8}' |awk -F '.' '{count[$1]++;} END {for(i in count) {if(count[i]==1) print i }}'
dr_download201501
draw_bglabel
dr_download201502
draw_recommendapp201510
dr_download201503
draw_recommendapp201511
dr_download201504
draw_recommendapp201512
draw_imgcommentlike
dr_download201505
dr_download201506
dr_download201507
dr_download201508
...............
...............
因为是MyISAM引擎表试着用repair table ,myisamchk 都不能解决问题
那现在只有一种方式了就是从frm文件恢复建表语句,使用dbsake工具进行操作
安装使用:
curl -s get.dbsake.net > dbsake
chmod u+x dbsake
./dbsake frmdump [frm-file-path]
root@li1881-239:/home#>./dbsake frmdump /var/lib/mysql/cleanwizme/oemappicon.frm;
--
-- Table structure for table `oemappicon`
-- Created with MySQL Version 5.1.73
--
CREATE TABLE `oemappicon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`path` varchar(100) NOT NULL,
`md5` varchar(50) NOT NULL,
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ip` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
把表引擎改为MyISAM 然后删除原来的表重建 再次执行mysqldump导出即可,按照这种方式修复其他表就可以了
最后:表的数据是丢失了,所以数据库一定要备份,备份大于一切,进行数据库和服务器的安全加固很重要
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。