mysql数据库索引损坏及修复经验分享

   这篇文章主要介绍了mysql数据库索引损坏及修复经验分享,需要的朋友可以参考下

  mysql表索引被破坏的问题及解决

  下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为:

  Table '.dedecmsv4dede_archives' is marked as crashed and should be repaired

  提示说cms的文章表dede_archives被标记有问题,需要修复。于是赶快恢复历史数据,上网查找原因。最终将问题解决。解决方法如下:

  找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:

  myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI

  然后myisamchk 工具会帮助你恢复数据表的索引。重新启动mysql,问题解决。

  问题分析:

  1、错误产生原因,有网友说是频繁查询和更新dede_archives表造成的索引错误,因为我的页面没有静态生成,而是动态页面,因此比较同意

  这种说法。还有说法为是MYSQL数据库因为某种原因而受到了损坏,如:数据库服务器突发性的断电、在提在数据库表提供服务时对表的原文件

  进行某种操作都有可能导致MYSQL数据库表被损坏而无法读取数据。总之就是因为某些不可测的问题造成表的损坏。

  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

  推荐的快速检查所有MyISAM表的方式是:

  shell> myisamchk --silent --fast /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来检查表。

时间: 2025-01-01 15:07:49

mysql数据库索引损坏及修复经验分享的相关文章

mysql数据库索引损坏及修复经验分享_Mysql

mysql表索引被破坏的问题及解决 下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired 提示说cms的文章表dede_archives被标记有问题,需要修复.于是赶快恢复历史数据,上网查找原因.最终将问题解决.解决方法如下: 找到mysql的安装目录的bin/myisamchk工具,在命令

MySQL数据库21条最佳性能优化经验_Mysql

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被M

浅谈PHP开发中MySQL数据库索引的经验

假如我们创建了一个testIndex表:CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL); 我们随机向里面插入了1000条记录,其中有一条    i_testID    vc_Name      555    erquan     在查找vc_Name="erquan"的记录SELECT * FROM testIndex WHERE vc_Name='erquan';时,如果在vc_Na

Access数据库被损坏的修复方法

Access数据库被损坏主要分为以下几种情况:1.严重损坏:2.轻度损坏:3.有些表被损坏或有些表的部分记录被损坏.下面就分情况介绍解决办法. Access数据库被损坏主要分为以下几种情况:1.严重损坏:2.轻度损坏:3.有些表被损坏或有些表的部分记录被损坏.下面就分情况介绍解决办法. 1.使用Access97打不开数据库.系统提示"不可识别的数据库格式"或"不是该表的索引"等信息,这样的数据库都是损坏比较严重的.损害严重的数据库一般来说都是无法修复的,只有恢复备份

MySQL数据表损坏的修复方法详解

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

MySQL数据库索引使用方法

  走向精通MySQL的道路非常的艰难,还好各种关系型数据库大同小异,足够让我从增删改查上升到高性能数据库的架构和调优.这期间的各种概念就不絮叨了,我也很难表述的很清楚,昨天写了个小脚本往我本机MySQL数据库的某张表里面注入了200万条数据(Windows7旗舰版/1.66GHz/2G内存/MySQL5.1.50),数据表的结构如下图所示,属于一个比较基本的定长表,考虑到我可怜的本本的承受能力,id使用从1开始的自增,title字段为随机20个标题中的一个,content都是相同的内容,tim

深入分析MySQL数据库索引

什么是索引 索引是存储引擎用于快速找到记录的一种数据结构,索引类似一本书的目录,我们根据目录可以快速的查找到我们感兴趣的内容.索引就是存储引擎的目录,如果没有索引存储引擎必须遍历整个数据库表来查询符合条件的记录,索引的建立和优化应该是提升查询性能最有效的手段了. 索引的类型 索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的.所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同. B-Tree索引

MySQL数据库InnoDB引擎主从复制同步经验总结_Mysql

近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别于以前的MyISAM引擎的,所以这里也将其心得归纳总结了一下: 1)MySQL的replication过程是一个异步同步的过程,并非完全的主从同步,所以同步的过程中是有延迟的,如果做了读写分离的业务的话,建议也要监控此延迟时间: 2)MySQL的master与slave机器记得server-id要保

MySql数据库索引优化注意事项

设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降.但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还