事情是这样的,我在linux系统下做mysql备份与还原实验。我先是进入mysql,创建一个数据库ds,然后在数据库建了一张innodb表stu,再往表里插入几条数据。因为是做实验只是在验证备份与还原的理论知识,所以数据库和表都很简单,创建的代码就不提供了。

   为了实验清楚简单,我准备将备份文件方在/tmp目录下,于是我将/tmp目录下的东西全部删除了,可能没注意,我把整个/tmp目录给删了(本来删/tmp下的所有东西应该是rm -fr /tmp/*),然后我不小心忘了匹配符*。我就顺手mkdir /tmp。此时我还没意识到这里有什么问题,继续实验,然后我调用mysql安装目录下的mysqlhotcopy备份工具,也是因为初学,我不知mysqlhotcopy只用于备份myisam表,然后我还是继续操作,完成了备份。我再进入mysql将ds数据库内的表stu给删了,drop table stu;然后我退出mysql,重新开启mysql服务,结果出现问题了,mysql服务shutdown失败,我于是就用了kill -9 命令结束mysql的进程。然后在启动mysql服务,这时则启动不了mysql服务了。我查看了错误日志,当时的错误是这样了,[ERROR] InnoDB: Could not find a valid tablespace file for 'ds/stu'.我在网上找了好多办法,没解觉,后来同学帮我看了错误日志,里面还有一个错误 [ERROR] InnoDB: Table ds/stu in the InnoDB data dictionary has tablespace id 63, but tablespace with that id or name does not exist. Have you deleted or moved .ibd files? This may also be a table created with CREATE TEMPORARY TABLE whose .ibd and .frm files MySQL automatically removed, but the table still exists in the InnoDB internal data dictionary.然后他问我是不是删了/tmp目录了,我说我误删了,然后我自己重新创建了一个/tmp,然后再去看了一下/tmp的权限,新建的/tmp权限为drwxr_xr_x,而原/tmp的权限为drwxrwxrwxt。修改/tmp的权限后,再重新启动mysql服务,终于成功了。

   后来我自己总结了一下,其实错误日志里的信息和网上找的似乎都差不多,我也按照网友给出的方法做了,但是还是没找到那些错误信息可能是不同原因造成的,有权限问题,也有my.cnf的配置问题,我也都试着解决了这些问题,但是因为我在/tmp里放了备份文件,可是用户mysql又没有对/tmp的w权限,然后可能是/tmp下的备份文件的用户是root,而mysql服务的用户是mysql,而mysql没有对备份文件拥有w权限和特殊权限t,然后把备份文件拷到数据库的文件夹下,似乎就可能出了问题。其实问题的正真原因和/tmp的权限有什么联系我还是不太明白,但最终修改了/tmp权限后成功启动了mysql服务,所以如果有精通linux和mysql的网友看到我的博文上的问题可以帮我解决一下。