数据库在网站服务中是比较重要的环节,一旦出错,会导致业务中断,本文主要讲解在遇到表损坏的时候,如何进行恢复。
一、为什么会出现表损坏?
①、 服务器突然断电导致数据文件损坏。
②、 强制关机,没有先关闭MySQL服务。
③、 mysqld 进程在写表时被杀掉。
④、 使用myisamchk 的同时,mysqld 也在操作表。
⑤、 磁盘故障。
⑥、 服务器死机。
⑦、 MySQL 本身的bug 。
出现错误的图和代码如下:
图1
代码1、
- [ERROR] /www/server/mysql/bin/mysqld: Table ‘./mysql/user’ is marked as crasshed and should be repaired
复制代码
代码2、
- # mysql -u root -p
- Enter password:
- mysql> use wordpress;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql> select * from wp_posts;
- ERROR 145 (HY000): Table ‘./wordpress/wp_posts’ is marked as crashed and should be repaired
- mysql> Bye
复制代码
二、如何解决?
①、当MySQL中的mysql库的 user表出现错误的是,需要使用重新初始化的操作,重新生成mysql表的信息,这个时候要用到MySQL自带的 mysql_install_db工具进行修复,面板上这个工具目录为:
- /www/server/mysql/bin/mysql_install_db
复制代码
图1和代码1中的修复方式为:
首先备份下 /www/server/data 目录,能做磁盘快照的尽量做快照
- \cp -rp /www/server/data /www/backup/database/data_20220320
复制代码
修复命令:
- /www/server/mysql/bin/mysql_install_db –user=mysql –basedir=/www/server/mysql/ –datadir=/www/server/mysql/data/
复制代码
简单解读下参数:
- –user :修复的时候使用的用户,堡塔面板中默认使用的是mysql
- –basedir:mysql数据库安装的目录
- –datadir:mysql数据库的数据存放目录
复制代码
②、数据库中的某张表损坏后,如代码2,解决方案如下:
找到mysqlcheck 工具,目录在
/www/server/mysql/bin/mysqlcheck
命令如下:
- /www/server/mysql/bin/mysqlcheck -uroot -p wordpress –auto-repair
复制代码
参数解读:
- -u:使用的数据库帐号,一般是 MySQL的root帐号
- -p:需要修复的数据库,注意 -p 和数据库之间有个空格
- –auto-repair:自动修复对应的表
复制代码
执行后修复成功的截图如下:
三、如何避免类似事情发生?
①、不要随意重启服务器,服务器本身就是提供长期稳定服务的
②、非必要情况下不要重启MySQL服务,如果必须重启MySQL,请不要在写数据的时候重启,建议先关闭web服务(Nginx|Apache),等5分钟左右,数据完全落盘后,重启MySQL
③、有条件的情况,可以先使用付费插件 MySQL主从复制重构版 进行主从备份,当主库有问题的时候,可以尽快切换到从库
④、平时多做备份,面板计划任务中的备份,除了本地保存外,建议将备份文件放到存储中,鸡蛋不要同时放在一个篮子里
如果有其他问题的话,可以在我们的论坛进行反馈。
FAQ:
1、案例一中的user表是什么表?
答:user表是mysql库中的系统表,记录了数据库用户的帐号信息、权限等,比较重要,损坏时数据库就无法启动,建议初始化后,修改下MySQL root帐号的密码
2、上述的解决方式支持的数据库版本?
答:由于数据库的版本不同,处理方式也不同,上述解决方式暂时支持Innodb存储引擎的mysql5.6|5.7版本的数据库,8.0的数据库的初始化暂时未验证