检查和修复mysql表:mysql table is marked as crashed and last (automatic?) repair failed

0x001  问题背景

mysql上执行相关mysql命令(我们执行的是,show procedure status)时提示 mysql.proc表crashed,无法修复(marked as crashed and last (automatic?) repair failed )

报错信息:mysql table is marked as crashed and last (automatic?) repair failed

0x002  分析处理

mysql提供了检查和修复表的命令

mysql命令:

CHECK  TABLE `table name`  检查表,发现表已经损坏。

REPAIR TABLE `table_name`  执行后,提示无法修复,只能放弃。

正在困惑之时,只能退出mysql交互终端,尝试下mysqlcheck。

使用mysqlcheck 命令对表进行修复

检查:

mysqlcheck -uuser -ppassword database  table  -c  #检查单个表是否损坏

mysqlcheck -uuser -ppassword database  -c  #检查整个库那些表损坏

修复:

mysqlcheck -uuser -ppassword database  table  -r # 修复数据表

mysqlcheck -uuser -ppassword database   -r # 修复整个数据库

mysqlcheck --help

This program can be used to CHECK (-c,-m,-C), REPAIR (-r), ANALYZE (-a)

or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be

used at the same time. Not all options are supported by all storage engines.

Please consult the MySQL manual for latest information about the

above. The options -c,-r,-a and -o are exclusive to each other, which

means that the last option will be used, if several was specified.

The option -c will be used by default, if none was specified. You

can change the default behavior by making a symbolic link, or

copying this file somewhere with another name, the alternatives are:

mysqlrepair:   The default option will be -r

mysqlanalyze:  The default option will be -a

mysqloptimize: The default option will be -o

Usage: mysqlcheck [OPTIONS] database [tables]

OR     mysqlcheck [OPTIONS] --databases DB1 [DB2 DB3...]

OR     mysqlcheck [OPTIONS] --all-databases

--print-defaults        Print the program argument list and exit

--no-defaults           Don‘t read default options from any options file

--defaults-file=#       Only read default options from the given file #

--defaults-extra-file=# Read this file after the global files are read

-A, --all-databases Check all the databases. This will be same as

--databases with all databases selected.

-a, --analyze       Analyze given tables.

-1, --all-in-1      Instead of issuing one query for each table, use one

query per database, naming all tables in the database in

a comma-separated list.

--auto-repair       If a checked table is corrupted, automatically fix it.

Repairing will be done after all tables have been

checked, if corrupted ones were found.

--character-sets-dir=name

Directory where character sets are.

-c, --check         Check table for errors.

-C, --check-only-changed

Check only tables that have changed since last check or

haven‘t been closed properly.

-g, --check-upgrade Check tables for version-dependent changes. May be used

with --auto-repair to correct tables requiring

version-dependent updates.

--compress          Use compression in server/client protocol.

-B, --databases     To check several databases. Note the difference in usage;

In this case no tables are given. All name arguments are

regarded as databasenames.

-#, --debug[=#]     This is a non-debug version. Catch this and exit.

--default-character-set=name

Set the default character set.

-F, --fast          Check only tables that haven‘t been closed properly.

-f, --force         Continue even if we get an sql-error.

-e, --extended      If you are using this option with CHECK TABLE, it will

ensure that the table is 100 percent consistent, but will

take a long time. If you are using this option with

REPAIR TABLE, it will force using old slow repair with

keycache method, instead of much faster repair by

sorting.

-?, --help          Display this help message and exit.

-h, --host=name     Connect to host.

-m, --medium-check  Faster than extended-check, but only finds 99.99 percent

of all errors. Should be good enough for most cases.

-o, --optimize      Optimize table.

-p, --password[=name]

Password to use when connecting to server. If password is

not given it‘s solicited on the tty.

-P, --port=#        Port number to use for connection.

--protocol=name     The protocol of connection (tcp,socket,pipe,memory).

-q, --quick         If you are using this option with CHECK TABLE, it

prevents the check from scanning the rows to check for

wrong links. This is the fastest check. If you are using

this option with REPAIR TABLE, it will try to repair only

the index tree. This is the fastest repair method for a

table.

-r, --repair        Can fix almost anything except unique keys that aren‘t

unique.

-s, --silent        Print only error messages.

-S, --socket=name   Socket file to use for connection.

--tables            Overrides option --databases (-B).

--use-frm           When used with REPAIR, get table structure from .frm

file, so the table can be repaired even if .MYI header is

corrupted.

-u, --user=name     User for login if not current user.

-v, --verbose       Print info about the various stages.

-V, --version       Output version information and exit.

myisamchk 修复mysql表

Myisamchk是MyISAM表维护的一个非常实用的工具。可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。

Myisamchk 选项解释

–debug=debug_options, -# debug_options

输出调试记录文件。debug_options字符串经常是’d:t:o,filename’。

–silent,-s

沉默模式。仅当发生错误时写输出。

–wait, -w

如果表被锁定,不是提示错误终止,而是在继续前等待到表被解锁。

如果不使用–skip-external-locking,可以随时使用myisamchk来检查表。当检查表时,所有尝试更新表的客户端将等待,直到myisamchk准备好可以继续。

请注意如果用–skip-external-locking选项运行mysqld,只能用另一个myisamchk命令锁定表。

–var_name=value

可以通过–var_name=value选项设置下面的变量:

–check, -c

检查表的错误。如果你不明确指定操作类型选项,这就是默认操作。

–check-only-changed, -C

只检查上次检查后有变更的表。

–extend-check, -e

非常仔细地检查表。如果表有许多索引将会相当慢。

–fast,-F

只检查没有正确关闭的表。

–force, -f

如果myisamchk发现表内有任何错误,则自动进行修复。

–information, -i

打印所检查表的统计信息。

–medium-check, -m

比–extend-check更快速地进行检查。只能发现99.99%的错误

–update-state, -U

将信息保存在.MYI文件中,来表示表检查的时间以及是否表崩溃了。该选项用来充分利用–check-only-changed选项,

但如果mysqld服务器正使用表并且正用–skip-external-locking选项运行时不应使用该选项。

–read-only, -T

不要将表标记为已经检查。如果你使用myisamchk来检查正被其它应用程序使用而没有锁定的表很有用

–backup, -B

将.MYD文件备份为file_name-time.BAK

–character-sets-dir=path

字符集安装目录。

–correct-checksum

纠正表的校验和信息。

–data-file-length=len, -D len

数据文件的最大长度

–extend-check,-e

进行修复,试图从数据文件恢复每一行。一般情况会发现大量的垃圾行。不要使用该选项,除非你不顾后果。

–force, -f

覆盖旧的中间文件(文件名类似tbl_name.TMD),而不是中断

–keys-used=val, -k val

对于myisamchk,该选项值为位值,说明要更新的索引。选项值的每一个二进制位对应表的一个索引,其中第一个索引对应位0。

选项值0禁用对所有索引的更新,可以保证快速插入。通过myisamchk -r可以重新激活被禁用的索引。

–parallel-recover, -p

与-r和-n的用法相同,但使用不同的线程并行创建所有键。

–quick,-q

不修改数据文件,快速进行修复。

–recover, -r

可以修复几乎所有一切问题,除非唯一的键不唯一时(对于MyISAM表,这是非常不可能的情况)。如果你想要恢复表,

这是首先要尝试的选项。如果myisamchk报告表不能用-r恢复,则只能尝试-o。

在不太可能的情况下-r失败,数据文件保持完好)。

–safe-recover, -o

使用一个老的恢复方法读取,按顺序读取所有行,并根据找到的行更新所有索引树。这比-r慢些,

但是能处理-r不能处理的情况。该恢复方法使用的硬盘空间比-r少。一般情况,你应首先用-r维修,如果-r失败则用-o。

–sort-recover, -n

强制myisamchk通过排序来解析键值,即使临时文件将可能很大。

–analyze,-a

分析键值的分布。这通过让联结优化器更好地选择表应该以什么次序联结和应该使用哪个键来改进联结性能。

要想获取分布相关信息,使用myisamchk –description –verbose tbl_name命令或SHOW KEYS FROM tbl_name语句。

–sort-index, -S

以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。

–set-auto-increment[=value], -A[value]

强制从给定值开始的新记录使用AUTO_INCREMENT编号(或如果已经有AUTO_INCREMENT值大小的记录,应使用更高值)。

如果未指定value,新记录的AUTO_INCREMENT编号应使用当前表的最大值加上1。

–description, -d

打印出关于表的描述性信息。

在使用myisamchk 修复过程中,发现提示出错,后来搜索了下,发现需要停止mysql服务进行修复。

到mysql的db目录,通过myisamchk -r -f 表名来完成数据表的修复。

Go to your data folder and try running myisamchk -r <table_name>. You should stop MySQL process first. If that doesn‘t work, you can try with myisamchk -r -v -f <table_name>.

0x003  总结

mysql在使用过程中不经意间会发生库表损坏的情况,通过repair table 表名,mysqlcheck,myisamchk 来检查库表是否损坏,以及进行修复。

时间: 2024-10-03 23:15:34

检查和修复mysql表:mysql table is marked as crashed and last (automatic?) repair failed的相关文章

Table &#39;.\gts\eventdata#P#p0&#39; is marked as crashed and last (automatic?) repair failed

修复数据表操 MYSQL数据表出现问题,提示:Error: Table './db_name/table_name' is marked as crashed and last (automatic?) repair failed 修复数据表操作: 1.service mysqld stop;2.cd /var/lib/mysql/db_name/3.myisamchk -r tablename.MYI (修复单张数据表)myisamchk -r *.MYI (修复所有数据表) 注意:操作第三步

xxx 表 is marked as crashed and last (automatic?) repair 解决办法

如上图出现 xxx 表 is marked xxxx   的问题 运维那说是因为数据库非正常停掉 时 刚好有数据正在写入 数据库 导致的问题,这个没多大影响,需要 执行命令修复数据库,至于命令是什么?网上一大推,这里就不贴了,遇到这个问题 直接让运维去处理就好了,和程序没什么关系.

MySql Table错误:is marked as crashed and last (automatic?) 和 Error: Table &quot;mysql&quot;.&quot;innodb_table_stats&quot; not found

一.mysql 执行select 的时候报Table错误:is marked as crashed and last (automatic?) 解决方法如下: 找到mysql的安装目录的bin/myisamchk工具,在命令行中输入: myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI 然后myisamchk 工具会帮助你恢复数据表的索引.重新启动mysql,问题解决. 问题分析: 1.错误产生原因,有网友说是频繁查询和更新dede_archi

解决MySQL Table &#39;***&#39; is marked as crashed and should be repaired问题

昨天后端程序在读取数据库信息时候,日志报相关数据表不能读取和写入数据,进入 MySQL数据库发现 Table './wordpress/wp_posts' is marked as crashed and should be repaired 错误,因为qqtexas中有数据表被损坏了,所以读取不了数据: # mysql -u root -p Enter password: mysql> use qqtexas; Reading table information for completion 

Table &#39;&#39; is marked as crashed and should be repaired 解决方法

解决方法: 找到mysql的安装目录的bin/myisamchk工具,在命令行中输入: myisamchk -c -r ../data/mysql/user.MYI 然后myisamchk 工具会帮助你恢复数据表的索引.重新启动mysql,问题解决. Table '' is marked as crashed and should be repaired 解决方法

Table is marked as crashed and should be repaired

错误如下: hibernate operation: could not execute query; uncategorized SQLException for SQL [select count(*) as y0_ from customer this_ where this_.customer_type=? order by this_.id desc]; SQL state [HY000]; error code [1194]; Table 'this_' is marked as c

MySQL表损坏预防与修复

1.       表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. 3. mysqld 进程在写表时被杀掉. 4. 使用myisamchk 的同时,mysqld 也在操作表. 5. 磁盘故障. 6. 服务器死机. 7. mysql 本身的bug . 2.       表损坏的症状 一个损坏的表的典型症状如下: 1 .当在从表中选择数据之时,你得到如下错误: Incorrect key file f

[MySQL]快速解决&quot;Table &#39;.\sjzlf\zbp_post&#39; is marked as crashed and should be repaired&quot;故障

为了不冒失修复,故采取保守做法,我们知道 MySQL 一个高效的管理工具便是 PhpMyAdmin,而在该管理软件中就包含了对表的检查.分析.修复.优化功能,比起网上提供的含糊命令行来说更安全更简便. 通过实践,在使用检查表功能后确实发现了问题,之后使用修复功能进行了修复,反馈结果每个表都已经 ok,再执行一次优化,重新测试访问网站终于恢复了正常.一场灾难就此避免-- [MySQL]快速解决"Table '.\sjzlf\zbp_post' is marked as crashed and sh

REPAIR修复mysql报错is marked as crashed and should be

早上收到报警,数据库报错Table erp_agents is marked as crashed and should be repaired 提示这张表损坏了,需要修复, 于是登录数据库: [email protected]:~# mysql -uroot -p123456 MySQL [(none)]> use zhiliao-20190429; MySQL [(none)]> REPAIR TABLE erp_agents; 原文地址:https://blog.51cto.com/90