表索引异常,修复msql表索引(表引擎:myisam)
myisamchk --safe-recover /usr/local/mysql/data/ename_news/dede_arccache
repair table customerquestion;
Error infos: Table './ename_news/dede_arccache' is marked as crashed and should be repaired
myisamchk -r data/ename_news/dede_arccache
问题分析:
1、错误产生原因,有网友说是频繁查询和更新dede_archives表造成的索引错误,因为我的页面没有静态生成,而是动态页面,因此比较同意 这种说法。还有说法为是MYSQL数据库因为某种原因而受到了损坏,如:数据库服务器突发性的断电、在提在数据库表提供服务时对表的原文件进行某种操作都 有可能导致MYSQL数据库表被损坏而无法读取数据。总之就是因为某些不可测的问题造成表的损坏。
问题的编号为145
2、问题解决办法。
当你试图修复一个被破坏的表的问题时,有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次–这通常是上一次修复操作遗留下来的。
这三种修复方法如下所示:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
第一种是最快的,用来修复最普通的问题;而最后一种是最慢的,用来修复一些其它方法所不能修复的问题。
检查和修复MySQL数据文件
如果上面的方法无法修复一个被损坏的表,在你放弃之前,你还可以试试下面这两个技巧:
如果你怀疑表的 索引文件(*.MYI)发生了不可修复的错误,甚至是丢失了这个文件,你可以使用数据文件(*.MYD)和数据格式文件(*.frm)重新生成它。首先制 作一个数据文件(tblName.MYD)的拷贝。重启你的MySQL服务并连接到这个服务上,使用下面的命令删除表的内容:
mysql> DELETE FROM tblName;
在 删除表的内容的同时,会建立一个新的索引文件。退出登录并重新关闭服务,然后用你刚才保存的数据文件(tblName.MYD)覆盖新的(空)数据文件。 最后,使用myisamchk执行标准的修复(上面的第二种方法),根据表的数据的内容和表的格式文件重新生成索引数据。
如果你的表的格式文件(tblName.frm)丢失了或者是发生了不可修复的错误,但是你清楚如何使用相应的CREATE TABLE语句来重新生成这张表,你可以重新生成一个新的.frm文件并和你的数据文件和索引文件(如果索引文件有问题,使用上面的方法重建一个新的)一 起使用。首先制作一个数据和索引文件的拷贝,然后删除原来的文件(删除数据目录下有关这个表的所有记录)。
启动MySQL服务并使用当初的CREATE TABLE文件建立一个新的表。新的.frm文件应该可以正常工作了,但是最好你还是执行一下标准的修复(上面的第二种方法)。
3、myisamchk工具介绍(见mysql的官方手册)
可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
调用myisamchk的方法:
shell> myisamchk [options] tbl_name …
options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk –help得到选项列表。
tbl_name是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为 myisamchk不知道你的数据库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件 拷贝到别处并且在那里执行恢复操作。
如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:
shell> myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell> myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:
shell> myisamchk --silent --force --fast --update-state /
-O key_buffer=64M -O sort_buffer=64M /
-O read_buffer=1M -O write_buffer=1M /
/path/to/datadir/*/*.MYI
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。
当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:
warning: clients are using or haven't closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。
如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表。
检查修复所有数据库: # mysqlcheck -A -o -r -p Enter password: db1 OK db2 OK db3 OK db4 OK ...... ...... ...... 修复指定的数据库用 # mysqlcheck -A -o -r Database_NAME -p 即可 命令详解: mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。 mysqlcheck的功能类似myisamchk,但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。 Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它确定在要执行的操作中使用使用哪个语句,然后将语句发送到要执行的服务器上。 有3种方式来调用mysqlcheck: shell> mysqlcheck[options] db_name [tables] shell> mysqlcheck[options] ---database DB1 [DB2 DB3...] shell> mysqlcheck[options] --all--database 如果没有指定任何表或使用---database或--all--database选项,则检查整个数据库。 同 其它客户端比较,mysqlcheck有一个特殊特性。重新命名二进制可以更改检查表的默认行为(--check)。如果你想要一个工具默认可以修复表的 工具,只需要将mysqlcheck重新复制为mysqlrepair,或者使用一个符号链接mysqlrepair链接mysqlcheck。如果调用 mysqlrepair,可按照命令修复表。 下面的名可用来更改mysqlcheck的默认行为: mysqlrepair 默认选项为--repair mysqlanalyze 默认选项为--analyze mysqloptimize 默认选项为--optimize mysqlcheck支持下面的选项: · ---help,-? 显示帮助消息并退出。 · --all--database,-A 检查所有数据库中的所有表。与使用---database选项相同,在命令行中命名所有数据库。 · --all-in-1,-1 不是为每个表发出一个语句,而是为命名数据库中待处理的所有表的每个数据库执行一个语句。 · --analyze,-a 分析表。 · --auto-repair 如果某个被检查的表破坏了,自动修复它。检查完所有表后自动进行所有需要的修复。 · --character-sets-dir=path 字符集的安装目录。参见5.10.1节,“数据和排序用字符集”。 · --check,-c 检查表的错误。 · --check-only-changed,-C 只检查上次检查以来已经更改的或没有正确关闭的表。 · --compress 压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。 · ---database,-B 处理数据库中命名的所有表。使用该选项,所有字名参量被看作数据库名,而不是表名。 · ---debug[=debug_options],-# [debug_options] 写调试日志。debug_options字符串通常为'd:t:o,file_name'。 · --default-character-set=charset 使用charsetas默认字符集。参见5.10.1节,“数据和排序用字符集”。 · --extended,-e 如果你正使用该选项来检查表,可以确保它们100%地一致,但需要很长的时间。 如果你正使用该选项来修复表,则运行扩展修复,不但执行的时间很长,而且还会产生大量的垃圾行! · --fast,-F 只检查没有正确关闭的表。 · --force,-f 即使出现SQL错误也继续。 · --host=host_name,-h host_name 连接给定主机上的MySQL服务器。 · --medium-check,-m 执行比--extended操作更快的检查。只能发现99.99%的错误,在大多数情况下这已经足够了。 · --optimize,-o 优化表。 · --password[=password],-p[password] 当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。 · --port=port_num,-P port_num 用于连接的TCP/IP端口号。 · --protocol={TCP | SOCKET | PIPE | MEMORY} 使用的连接协议。 · --quick,-q 如果你正使用该选项在检查表,它防止扫描行以检查错误链接的检查。这是最快的检查方法。 如果你正使用该选项在修复表,它尝试只修复索引树。这是最快的修复方法。 · --repair,-r 执行可以修复大部分问题的修复,只是唯一值不唯一时不能修复。 · --silent,-s 沉默模式。只打印错误消息。 · --socket=path,-S path 用于连接的套接字文件。 · --tables 覆盖---database或-B选项。选项后面的所有参量被视为表名。 · --user=user_name,-u user_name 当连接服务器时使用的MySQL用户名。 · --verbose,-v 冗长模式。打印关于各阶段程序操作的信息。 · --version,-V 显示版本信息并退出。