有的时候因为停电或者其他原因导致数据库损坏,我们可以使用mysql自带的mysqlcheck命令来快速修复所有的数据库或者特定的数据库;
接到监控系统进行报警,发现数据库服务器死机,立刻重启服务器,由于myqsql没有正常关闭,导致在宕机是对数据库中有操作的表损坏,需要进行修复数据表。
1、通过xshell的ssh协议登录mysql服务器。
#ssh [email protected] //回车,输入密码。
2、登录mysql
#mysql -p //回车,输入密码。
3、进入数据库,检测表是否损坏,并修复数据表。
#use 数据库名字。
#check table 表名 。//检测表数据是否损坏。
#repair table 表名。//修复表数据。
举个例子,如何判断表叔家是否损坏。
数据表损坏
+—————————+——-+———-+————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————————+——-+———-+————————————————————-+
|test.123 | check | warning | Table is marked as crashed |
|test.123 | check | warning | 2 clients are using or haven’t closed the table properly |
|test.123 | check | warning | Size of datafile is: 3424854016 Should be: 3424853036 |
|test.123 | check | error | Record at pos: 3382461400 is not remove-marked |
|test.123 | check | error | record delete-link-chain corrupted |
|test.123 | check | error | Corrupt
数据表未损坏
+——————–+——-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————–+——-+———-+———-+
|test.123 | check | status | OK |
+——————–+——-+———-+———-+
如果数据库较多,表较多,这样修复是非常耗时的,所以采用如下方法:
1、通过xshell的ssh协议登录mysql服务器。
#ssh [email protected] //回车,输入密码。
2、检测数据库各个表的状态。
# mysqlcheck -a -o 数据库名字 -p //回车输入密码,然后回车。
如果有如下错误,进行表修复
Test.123
error : Found key at page 821865472 that points to record outside datafile
status : Operation failed
3、登录mysql
#mysql -p //回车,输入密码。
4、进入数据库,检测表是否损坏,并修复数据表。
#use 数据库名字。
#check table 表名 。//检测表数据是否损坏。
#repair table 表名。//修复表数据。
PS:
为了安全起见,以下两种方法不建议在生产环境中使用
#mysqlcheck -a -o -r -p //检查优化并修复所有的数据库
#mysqlcheck -A -o -r 数据库名称 -p //修复指定的数据库
参数含意:
-a = Analyse given tables. //分析数据表
-c = Check table for errors //检查数据库中错误(损坏)的表
-o = Optimise table //优化数据表
-r = Can fix almost anything except unique keys that aren’t unique // 修复损坏的数据表
-m = –medium-check //
mysqlcheck说明:
mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。
mysqlcheck 的功能类似myisamchk,但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器 没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。使用myisamchk修复失败是不可逆的。
Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它确定在要执行的操作中使用使用哪个语句,然后将语句发送到要执行的服务器上。