⼀、背景
在我们的PaaS底座中,mysql数据库是运行在sts类型的pod中,构成mysql主从架构。客户方需要清空库中的某个表的数据,但是需要保留表。由于新同学图省事,直接删除了数据目录下的表文件,导致在数据库中的这个表消失后无法再被创建。原因是表空间存在该名称表;
二、排查过程
1、mysql启动报错:
- 使用kubect logs 查看到的mysql日志
2、创建表报错;
- 进库创建表时报错报错:ERROR:Tablespace tablename exists.
3、使用desc查看表结构报错;
- 查看表结构,又会有这个报错:ERROR:Table tablename doesnt exists
三、解决⽅法:
备份数据库表结构,删除数据库,重新导⼊表,创建表;
1、修改数据库my.cnf配置(修改configmap配置)
- 修改innodb_force_recovery=2,修改后mysql启动报错就没有了,可以正常启动
修改my.cnf配置,并保存
innodb_force_recovery=2 防⽌数据写⼊,更新,删除操作
重启数据库后,重新创建表
2、备份数据库
备份数据库所有表或者只备份表结构-d,这⾥笔者只备份表结构
mysqldump -uroot -pxxx -d dbname >dbname.sql
3、删除数据库
- 备份好后,直接删除库,发现又有新的报错,原因是在这个库目录下有数据文件未被删除,删掉即可成功删除库
drop database dbname;
报错:
Error dropping database (can not rmdir './dbname',errno: 39)
- 具体步骤:
在数据库的物理⽬录中(mysql的data⽬录),进⼊XXXXX数据库⽬录,查看是否有⽂件存在,若存在,则
清除
cd dbname;
rm -rf tablename 或者 mv tablename /home/tmp/
然后再删除数据库
> drop database dbname;
Query ok,
4、重新导⼊表
mysql -uroot -pxxxx 1 dbname <dbname.sql
5、创建表;
- 这时候创建表依旧报错了:原因是我们之前修改的my.cnf配置,需要将能禁止数据库正删改查的配置参数改为0
- 报错信息:ERROR 1030 (HY000) : Got error 168 from storage engine;
create table tablename;
查看日志信息:
修改my.cnf配置,并保存
innodb_force_recovery=0
重启数据库后,重新创建表
1.2.2 制作安装盘
下载操作系统-CentOS7.6, 下载地址:
https://vcs-baseline.oss-cn-hangzhou.aliyuncs.com/CentOS-7-x86_64-DVD-1810.iso
这里使用U盘安装操作系统,制作安装系统启动U盘可参考网上教程
通常安装过程:将镜像文件上传到服务器,插入U盘,对U盘进行格式化(mkfs.xfs /dev/U盘),然后将镜像文件写入U盘(dd if=镜像文件路径of=/dev/U盘 bs=4M)