您的当前位置:首页正文

MYSQL数据表损坏的原因分析和修复方法小结(转载)

2023-11-18 来源:健身之家
导读Mysql数据库作为优秀的开源数据库版本,支持大型数据存储。可是如果使用操作太多,表的频繁操作也可能会出现数据库表出现问题需要优化和修复修复表——》方法一:在浏览器打phpmyadmin或者在mysql客户端运行以下命令:1)直接运行sql语句REPAIRTABLE`table_name` 修复表,具体操作如下图:2) 在数据库里找到操作也可以修复表,具体操作如下图:修复表——》方法二:可以把当前数据库直接清除,恢复以前备份的用户信息,这种方法是比

1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1、 服务器突然断电导致数据文件损坏。 2、 强制关机,没有先关闭mysql 服务。 3、 mysqld 进程在写表时被杀掉。 4、 使用myisamchk 的同时,mysqld 也在操作表。 5、 磁盘故障。 6、 服务器死机

1.表损坏的原因分析以下原因是导致mysql 表毁坏的常见原因:1、 服务器突然断电导致数据文件损坏。2、 强制关机,没有先关闭mysql 服务。3、 mysqld 进程在写表时被杀掉。4、 使用myisamchk 的同时,mysqld 也在操作表。5、 磁盘故障。6、 服务器死机。7、 mysql 本身的bug 。

2.表损坏的症状一个损坏的表的典型症状如下:1 、当在从表中选择数据之时,你得到如下错误:Incorrect key file for table: ‘…’. Try to repair it2 、查询不能在表中找到行或返回不完全的数据。3 、Error: Table ‘p’ is marked as crashed and should be repaired 。4 、打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) 。5 、3.预防 MySQL 表损坏可以采用以下手段预防mysql 表损坏:1 、定期使用myisamchk 检查MyISAM 表(注意要关闭mysqld ),推荐使用check table 来检查表(不用关闭mysqld )。2 、在做过大量的更新或删除操作后,推荐使用OPTIMIZE TABLE 来优化表,这样既减少了文件碎片,又减少了表损坏的概率。3 、关闭服务器前,先关闭mysqld (正常关闭服务,不要使用kill -9 来杀进程)。4 、使用ups 电源,避免出现突然断电的情况。5 、使用最新的稳定发布版mysql ,减少mysql 本身的bug 导致表损坏。6 、对于InnoDB 引擎,你可以使用innodb_tablespace_monitor 来检查表空间文件内文件空间管理的完整性。7 、对磁盘做raid ,减少磁盘出错并提高性能。8 、数据库服务器最好只跑mysqld 和必要的其他服务,不要跑其他业务服务,这样减少死机导致表损坏的可能。9 、不怕万一,只怕意外,平时做好备份是预防表损坏的有效手段。4.MySQL 表损坏的修复MyISAM 表可以采用以下步骤进行修复 :1、 使用 reapair table 或myisamchk 来修复。2、 如果上面的方法修复无效,采用备份恢复表。具体可以参考如下做法:阶段1 :检查你的表如果你有很多时间,运行myisamchk *.MYI 或myisamchk -e *.MYI 。使用-s (沉默)选项禁止不必要的信息。如果mysqld 服务器处于宕机状态,应使用–update-state 选项来告诉myisamchk 将表标记为’ 检查过的’ 。你必须只修复那些myisamchk 报告有错误的表。对这样的表,继续到阶段2 。如果在检查时,你得到奇怪的错误( 例如out of memory 错误) ,或如果myisamchk 崩溃,到阶段3 。阶段2 :简单安全的修复注释:如果想更快地进行修复,当运行myisamchk 时,你应将sort_buffer_size 和Key_buffer_size 变量的值设置为可用内存的大约25% 。首先,试试myisamchk -r -q tbl_name(-r -q 意味着“ 快速恢复模式”) 。这将试图不接触数据文件来修复索引文件。如果数据文件包含它应有的一切内容和指向数据文件内正确地点的删除连接,这应该管用并且表可被修复。开始修复下一张表。否则,执行下列过程:在继续前对数据文件进行备份。使用myisamchk -r tbl_name(-r 意味着“ 恢复模式”) 。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。如果前面的步骤失败,使用myisamchk –safe-recover tbl_name 。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况( 但是更慢) 。如果在修复时,你得到奇怪的错误( 例如out of memory 错误) ,或如果myisamchk 崩溃,到阶段3 。阶段3 :困难的修复只有在索引文件的第一个16K 块被破坏,或包含不正确的信息,或如果索引文件丢失,你才应该到这个阶段。在这种情况下,需要创建一个新的索引文件。按如下步骤操做:把数据文件移到安全的地方。使用表描述文件创建新的( 空) 数据文件和索引文件:

shell> mysql db_namemysql> SET AUTOCOMMIT=1;mysql> TRUNCATE TABLE tbl_name;mysql> quit

如果你的MySQL 版本没有TRUNCATE TABLE ,则使用DELETE FROM tbl_name 。将老的数据文件拷贝到新创建的数据文件之中。(不要只是将老文件移回新文件之中;你要保留一个副本以防某些东西出错。)回到阶段2 。现在myisamchk -r -q 应该工作了。(这不应该是一个无限循环)。你还可以使用REPAIR TABLE tbl_name USE_FRM ,将自动执行整个程序。阶段4 :非常困难的修复只有.frm 描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。从一个备份恢复描述文件然后回到阶段3 。你也可以恢复索引文件然后回到阶段2 。对后者,你应该用myisamchk -r 启动。如果你没有进行备份但是确切地知道表是怎样创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述文件和索引文件移到破坏的数据库中。这样提供了新的描述和索引文件,但是让.MYD 数据文件独自留下来了。回到阶段2 并且尝试重建索引文件。InnoDB 表可以采用下面的方法修复:如果数据库页被破坏,你可能想要用SELECT INTO OUTFILE 从从数据库转储你的表,通常以这种方法获取的大多数数据是完好的。即使这样,损坏可能导致SELECT * FROM tbl_name 或者InnoDB 后台操作崩溃或断言,或者甚至使得InnoDB 前滚恢复崩溃。 尽管如此,你可以用它来强制InnoDB 存储引擎启动同时阻止后台操作运行,以便你能转储你的表。例如:你可以在重启服务器之前,在选项文件的[mysqld] 节添加如下的行:[mysqld]innodb_force_recovery = 4innodb_force_recovery 被允许的非零值如下。一个更大的数字包含所有更小数字的预防措施。如果你能够用一个多数是4 的选项值来转储你的表,那么你是比较安全的,只有一些在损坏的单独页面上的数据会丢失。一个为6 的值更夸张,因为数据库页被留在一个陈旧的状态,这个状态反过来可以引发对B 树和其它数据库结构的更多破坏。1 (SRV_FORCE_IGNORE_CORRUPT)即使服务器检测到一个损坏的页,也让服务器运行着;试着让SELECT * FROM tbl_name 跳过损坏的索引记录和页,这样有助于转储表。2 (SRV_FORCE_NO_BACKGROUND)阻止主线程运行,如果崩溃可能在净化操作过程中发生,这将阻止它。3 (SRV_FORCE_NO_TRX_UNDO)恢复后不运行事务回滚。4 (SRV_FORCE_NO_IBUF_MERGE)也阻止插入缓冲合并操作。如果你可能会导致一个崩溃。最好不要做这些操作,不要计算表统计表。5 (SRV_FORCE_NO_UNDO_LOG_SCAN)启动数据库之时不查看未完成日志:InnoDB 把未完成的事务视为已提交的。6 (SRV_FORCE_NO_LOG_REDO)不要在恢复连接中做日志前滚。数据库不能另外地带着这些选项中被允许的选项来使用。作为一个安全措施,当innodb_force_recovery 被设置为大于0 的值时,InnoDB 阻止用户执行INSERT, UPDATE 或DELETE 操作.即使强制恢复被使用,你也可以DROP 或CREATE 表。如果你知道一个给定的表正在导致回滚崩溃,你可以移除它。你也可以用这个来停止由失败的大宗导入或失败的ALTER TABLE 导致的失控回滚。你可以杀掉mysqld 进程,然后设置innodb_force_recovery 为3 ,使得数据库被挂起而不需要回滚,然后舍弃导致失控回滚的表。

原文地址:MYSQL数据表损坏的原因分析和修复方法小结(转载), 感谢原作者分享。

小编还为您整理了以下内容,可能对您也有帮助:

Mysql怎么优化修复数据库表Mysql数据库作为优秀的开源数据库版本,支持大型数据存储。可是如果使用操作太多,表的频繁操作也可能会出现数据库表出现问题需要优化和修复

修复表——》方法一:

在浏览器打phpmyadmin或者在mysql客户端运行以下命令:

1)直接运行sql语句REPAIRTABLE`table_name` 修复表,具体操作如下图:

2) 在数据库里找到操作也可以修复表,具体操作如下图:

修复表——》方法二:

可以把当前数据库直接清除,恢复以前备份的用户信息,这种方法是比慢的,当然也不建议使用这种方法,前提是你以前有备份用户信息。

如果只是单一修复的话过不了多久还是会出现表损坏的情况,在这个时候建议平时优化一下你的表,我简单的总结一下优化表的方法,这里只是简单的方法哦,但是实用,具体方法如下:

优化表——》 方法一:

在浏览器打phpmyadmin或者在mysql客户端运行以下命令:

1)直接运行sql语句OPTIMIZETABLE `table_name` 修复表,具体操作如下图:

Mysql怎么优化修复数据库表

标签:l数据库优化spacelogsnbspadmin情况大型alpha

mysql数据文件破坏后的修复方法

  由于临时断电 使用kill 中止MySQL服务进程 所有的这些都可能会毁坏MySQL的数据文件 如果在 *** 扰时 服务正在改变文件 文件可能会留下错误的或不一致的状态 因为这样的毁坏有时是不容易被发现的 当你发现这个错误时可能是很久以后的事了 于是 当你发现这个问题时 也许所有的备份都有同样的错误

  MySQL参考手册的第十五章讲述了MySQL自带的myisamc的功能 以及如何使用它检查和修复你的MySQL数据文件 虽然这一章对于每个想要搭建一个强壮的MySQL服务的人都是推荐阅读的 我们还是有必要在这里对其中的要点进行讨论

  在我们继续之前 你必须意识到myisamc程序对用来检查和修改的MySQL数据文件的访问应该是唯一的 如果MySQL服务正在使用某一文件 并对myisamc正在检查的文件进行修改 myisamc会误以为发生了错误 并会试图进行修复 这将导致MySQL服务的崩溃!这样 要避免这种情况的发生 通常我们需要在工作时关闭MySQL服务 作为选择 你也可以暂时关闭服务以制作一个文件的拷贝 然后在这个拷贝上工作 当你做完了以后 重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)

  MySQL数据目录不是太难理解的 每一个数据库对应一个子目录 每个子目录中包含了对应于这个数据库中的数据表的文件 每一个数据表对应三个文件 它们和表名相同 但是具有不同的扩展名 tblName frm文件是表的定义 它保存了表中包含的数据列的内容和类型 tblName MYD文件包含了表中的数据 tblName MYI文件包含了表的索引(例如 它可能包含lookup表以帮助提高对表的主键列的查询)

  要检查一个表的错误 只需要运行myisamc(在MySQL的bin目录下)并提供文件的位置和表名 或者是表的索引文件名

  myisamc /usr/local/mysql/var/dbName/tblName    myisamc /usr/local/mysql/var/dbName/tblName MYI

  上面的两个命令都可以执行对指定表的检查 要检查数据库中所有的表 可以使用通配符

  myisamc /usr/local/mysql/var/dbName/* MYI

  要检查所有数据库中的所有表 可以使用两个通配符 myisamc /usr/local/mysql/var/*/* MYI

  如果不带任何选项 myisamc将对表文件执行普通的检查 如果你对一个表有怀疑 但是普通的检查不能发现任何错误 你可以执行更彻底的检查(但是也更慢!) 这需要使用 extend check选项

  myisamc extend check /path/to/tblName

  对错误的检查是没有破坏性的 这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟 另一方面 修复选项 虽然通常也是安全的 但是它对你的数据文件的更改是无法撤消的 因为这个原因 我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份 并确保在制作这个备份之前你的MySQL服务是关闭的

  当你试图修复一个被破坏的表的问题时 有三种修复类型 如果你得到一个错误信息指出一个临时文件不能建立 删除信息所指出的文件并再试一次 这通常是上一次修复操作遗留下来的     这三种修复方法如下所示

  myisamc recover quick /path/to/tblName    myisamc recover /path/to/tblName    myisamc safe recover /path/to/tblName

  第一种是最快的 用来修复最普通的问题 而最后一种是最慢的 用来修复一些其它方法所不能修复的问题

  检查和修复MySQL数据文件    如果上面的方法无法修复一个被损坏的表 在你放弃之前 你还可以试试下面这两个技巧

  如果你怀疑表的索引文件(* MYI)发生了不可修复的错误 甚至是丢失了这个文件 你可以使用数据文件(* MYD)和数据格式文件(* frm)重新生成它 首先制作一个数据文件(tblName MYD)的拷贝 重启你的MySQL服务并连接到这个服务上 使用下面的命令删除表的内容

  mysql DELETE FROM tblName;

  在删除表的内容的同时 会建立一个新的索引文件 退出登录并重新关闭服务 然后用你刚才保存的数据文件(tblName MYD)覆盖新的(空)数据文件 最后 使用myisamc执行标准的修复(上面的第二种方法) 根据表的数据的内容和表的格式文件重新生成索引数据

  如果你的表的格式文件(tblName frm)丢失了或者是发生了不可修复的错误 但是你清楚如何使用相应的CREATE TABLE语句来重新生成这张表 你可以重新生成一个新的 frm文件并和你的数据文件和索引文件(如果索引文件有问题 使用上面的方法重建一个新的)一起使用 首先制作一个数据和索引文件的拷贝 然后删除原来的文件(删除数据目录下有关这个表的所有记录)

  启动MySQL服务并使用当初的CREATE TABLE文件建立一个新的表 新的 frm文件应该可以正常工作了 但是最好你还是执行一下标准的修复(上面的第二种方法)

  可以使用mysql语句 用 CHECK TABLE $table; //其中$table代表数据表的名字 检测表是否损坏 如果损坏可以REPAIR TABLE $table 来修复 如果一次不行 可以多修复几次!

  如果使用WIN服务器 可以先登陆DB服务器 进入此路径 不用进mysql里

  D:CD MYSQL

  D:mysql>CD BIN

  D:mysqlbin>MYISAMCHK r d:mysqldataguildmsg_table myi(msg_table)    check key delete chain    check record delete chain    recovering (with sort) MyISAM table d:mysqldataguildmsg_table myi     Data records:     Fixing index

  D:mysqlbin>MYISAMCHK safe recover d:mysqldataguildmsg_table myi    recovering (with keycache) MyISAM table d:mysqldataguildmsg_table myi     Data records:

  D:mysqlbin>

  当不知道哪个表坏了 可以进入mysql数据库:    use guild;    desc msg_table; 看msg_table有没有坏

lishixin/Article/program/MySQL/201311/29485

哪位朋友能告诉我mysql数据库中的表频繁损坏是为什么

出现表损坏的根本原因是:你的表使用了MyISAM存储引擎。MyISAM存储引擎主要用于SELECT,如果用于INSERT, UPDATE, DELETE,由于内部缺陷和异常数据访问经常造成索引文件损坏,注意是“经常”。

因此解决办法有二:

1.用myisamchk工具修复或者是经常对数据表优化或检查。一旦文件损坏只能暂停web访问,用myisamchk工具修复后可恢复正常。(暂时性,不能解决根本问题)

2.把表转换为innodb存储引擎。对用户来说是透明的,对程序逻辑不受任何影响,永久解决索引文件损坏的问题。

可通过以下语句把存储引擎转换为innodb

ALTER TABLE `dbname`.`tbname` ENGINE = InnoDB;

MySQL数据表损坏的正确修复方案

  修复以损坏的MySQL数据表的实际操作在实际中是我们经常用到的 以下的文章主要是介绍正确修复以损坏的MySQL数据表的实际操作步骤 以下就是正文的介绍 希望会给你带来一些帮助在此方面

  于断电或非正常关机而导致MySQL(和PHP搭配之最佳组合)数据库出现错误是非常常见的问题 有两种方法 一种方法使用MySQL(和PHP搭配之最佳组合)的check table和repair table 的sql语句 另一种方法是使用MySQL(和PHP搭配之最佳组合)提供的多个myisamc isamc数据检测恢复工具 前者使用起来比较简便 推荐使用

   check table 和 repair table

  登陆MySQL(和PHP搭配之最佳组合) 终端

  MySQL(和PHP搭配之最佳组合) uxxxxx p dbname

   > check table tabTest;

  如果出现的结果说Status是OK 则不用修复 如果有Error 可以用

   > repair table tabTest;

  进行修复 修复之后可以在用check table命令来进行检查 在新版本的phpMyAdmin里面也可以使用check/repair的功能

   myisamc isamc

  其中myisamc适用于MYISAM类型的数据表 而isamc适用于ISAM类型的数据表 这两条命令的主要参数相同 一般新的系统都使用MYISAM作为缺省的数据表类型 这里以myisamc为例子进行说明 当发现某个数据表出现问题时可以使用

   myisamc tablename MYI

  进行检测 如果需要修复的话 可以使用

   myisamc of tablename MYI

  关于myisamc的详细参数说明 可以参见它的使用帮助 需要注意的时在进行修改时必须确保MySQL(和PHP搭配之最佳组合)服务器没有访问这个数据表 保险的情况下是最好在进行检测时把MySQL(和PHP搭配之最佳组合)服务器Shutdown掉

  另外可以把下面的命令放在你的rc local里面启动MySQL(和PHP搭配之最佳组合)服务器前

   [ x /tmp/MySQL(和PHP搭配之最佳组合) sock ] && /pathtoc/myisamc of /DATA_DIR/*/* MYI

  其中的/tmp/MySQL(和PHP搭配之最佳组合) sock是MySQL(和PHP搭配之最佳组合)监听的Sock文件位置 对于使用RPM安装的用户应该是/var/lib/MySQL(和PHP搭配之最佳组合)/MySQL(和PHP搭配之最佳组合) sock 对于使用源码安装则是/tmp/MySQL(和PHP搭配之最佳组合) sock可以根据自己的实际情况进行变更 而pathtoc则是myisamc所在的位置 DATA_DIR是你的MySQL(和PHP搭配之最佳组合)数据库存放的位置

  需要注意的时 如果你打算把这条命令放在你的rc local里面 必须确认在执行这条指令时MySQL(和PHP搭配之最佳组合)服务器必须没有启动!

  检测修复所有数据库(表)

  MySQL(和PHP搭配之最佳组合)check A o r p

lishixin/Article/program/MySQL/201311/29506

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

精彩推荐

更多阅读

Top