环境
系统:CentOS release 6.10
mysql版本:5.6.29
数据库因断电后,重启数据库后,打开表报错
报错信息:ERROR 1008 (HY000): Can't drop table 'WFF_FFW'; database doesn't exist
判断:表损坏,但数据还在,恢复数据可以按以下方法解决:
0).先备份下data目录下你所需要的数据库中表的信息。例如:数据库:WFF 表:WFF_FFW,数据库目录:/usr/local/mysql/data/WFF/
mkdir /opt/backup/
cp -a /usr/local/mysql/data/WFF/* /opt/backup/
cd /usr/local/mysql/data/WFF/
有两个文件:WFF_FFW.frm WFF_FFW.ibd
1).删除表(如果存在).
DROP TABLE IF EXISTS
WFF_FFW
; #此时,data/WFF库的目录下WFF_FFW.frm就不存在了;
2).删除表的ibd文件
rm -rf WFF_FFW.ibd
3).执行sql文件(新建表结构,不含数据)
CREATE TABLE
WFF_FFW
(level
tinyint(1) NOT NULL,position
varchar(255) NOT NULL,sort
tinyint(3) unsigned DEFAULT '50' COMMENT '排序',
)
4).丢弃现有的表空间
ALTER TABLE WFF_FFW DISCARD TABLESPACE; #Discard的意思就是从数据库detached,会删除ibd文件,保留frm文件。
5).将之前备份中的文件覆盖至新的数据库中的表;
\cp /opt/backup/WFF_FFW.* /usr/local/mysql/data/WFF/
6).对覆盖后的表添加mysql用户赋权限
chown -R mysql.mysql WFF_FFW.*
7). 导入数据
ALTER TABLE WFF_FFW IMPORT TABLESPACE;
8)查看表数据;
select * from WFF_FFW;
随笔1:
1.cp /usr/local/mysql/data/WFF/WFF_FFW.* /opt/backup/
- DROP TABLE IF EXISTS
WFF_FFW
;- rm -rf WFF_FFW.ibd
- CREATE TABLE
WFF_FFW
(area_id
varchar(10) NOT NULL COMMENT 'ID',lng
varchar(20) DEFAULT NULL,lat
varchar(20) DEFAULT NULL,level
tinyint(1) NOT NULL,position
varchar(255) NOT NULL,sort
tinyint(3) unsigned DEFAULT '50' COMMENT '排序',
PRIMARY KEY (area_id
)
)';- ALTER TABLE WFF_FFW DISCARD TABLESPACE;
- \cp /opt/backup/WFF/WFF_FFW.* /usr/local/mysql/data/WFF/
- chown -R mysql.mysql WFF_FFW.*
- ALTER TABLE WFF_FFW IMPORT TABLESPACE;
9.select * from WFF_FFW;
随笔2
mysql -uroot -p --skip-column-names -e "use WFF;show tables" > /opt/Script/tables #获取表名至tables文件中
#!/bin/bash
#本脚本只包含随笔1中5678的实现,1234目前还需要手动
for tablename in `cat /opt/Script/tables`;do
mysql -uroot -proot -e "use WFF;ALTER TABLE $tablename DISCARD TABLESPACE;"
\cp /root/data/WFF/$tablename.* /opt/App/mysql/data/WFF/
chown -R mysql.mysql /opt/App/mysql/data/WFF/$tablename.*
mysql -uroot -proot -e "use WFF;ALTER TABLE $tablename IMPORT TABLESPACE;"
done
以上只是个人想法,如有更好的实现方式,可以留言分享下喽^v^
参考地址:http://www.ywnds.com/?p=9354