mysql数据表数据丢失6_MYSQL数据表损坏的原因分析和修复方法小结

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

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 it

2 、查询不能在表中找到行或返回不完全的数据。

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_name

mysql> 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 ,使得数据库被挂起而不需要回滚,然后舍弃导致失控回滚的表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 序列号生成器 (自定义函数)

https://yq.aliyun.com/articles/42600 http://bbs.csdn.net/topics/360203885 http://www.tuicool.com/articles/JZRb6z6 http://www.php1.cn/article/8506.html转载于:https://www.cnblogs.com/diyunpeng/p/5930508.html

战略 | 分析这25家千亿美元市值企业后,发现了这些趋势......

文章来源 |《哈佛商业评论》图片来源 | 网络编辑 | 智慧云导读:本文发表在《哈佛商业评论》上,作者通过对几百家卓越的公司进行相关调查研究,发现这些公司在其成功的数十年间采用的战略始终符合3个基本法则。本文在此基础上,对相关…

bs 程序用户个性化设置保存_想更改win10设置,这12种打开方法你不可不知,方便又快捷...

“设置”应用程序是Windows 10中最有用和最重要的应用程序之一,我们设置帐户、应用程序、系统、设备、网络和Internet、个性化、时间和语言、更新和安全等等都要通过它来进行。由于我们使用此应用程序比系统中的任何其他应用程序都要多,所以我们要熟悉打…

from dual mysql_mysql from dual插入实现不插入重复记录

在mysql中插入一或者多条记录的时候,要求某个字段的值唯一,但是该字段没有添加唯一性索引,可用from dual解决。select * from (select 2015080109 a,2 b,4 c,5 d from dualunionselect 2015080106 a,2 b,4 c,5 d from dual) a where not exis…

JAVA---反射

当用到一个类对象的时候,JVM会把此类的Class字节码文件加载到内存中(只加载一次),JVM会此类的信息封装成对象。利用封装好的对象获取类的相关信息进行构造类或者调用方法等,叫做反射。 反射的目的和作用就是为了开发者…

AR普及后的未来是怎样的?

来源:ARC增强现实 AR普及后的未来是怎样的?知名投资机构A16Z合伙人Ben Evans曾描绘AR未来场景:我会在你头顶上看到你的LinkedIn资料卡;收到Salesforce提示说你是一个重要的目标客户; Truecaller会提示说你打算向我推销…

python基础100_python基础100题

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? def test_01(): count 0 num_lst [] for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if (i ! j) & (j ! k) and (i ! k):…

宝塔mysql data修改_宝塔一键修改mysql数据库存放路径,更改默认数据目录…

宝塔一键修改mysql数据库存放路径,更改默认数据目录脚本!该shell脚本仅限于宝塔bt.cn linux面板使用,希望对有需要的朋友有所帮助,如有问题请留言!主要参数功能:1.默认修改数据库存放路径sh mysql_Transfer.sh2.还原数…

oracle数据库启动

遇到个白痴问题,放假停电,回来时启动数据库,发现无法进入oracle管理员界面。 如下输入,但是显示的命令无效。 [oraclecrm001 database]$ sqlplus / as sysdba bash: sqlplus: command not found 后来查百度知道问题的原因&#xf…

图灵测试还重要吗?

撰文丨Harry Collins(卡迪夫大学社会学教授)来源丨原理(ID:principia1687)1我们正在步入人工智能时代。随着人工智能程序越来越擅长像人类般行事,我们也越来越多地面临这样一个问题:人类的智能是…

python字符串为什么不能修改_为什么在Python(\n)中更改字符串中的行不起作用?...

在大多数情况下,它可以完成任务,但有时(我很难精确地说,它依赖于什么)它会陷入一个无限循环中,因为它不切分文本字符串。在def insertNewlines(text, lineLength): """ Given text and a de…

【 Date 对象 参考手册】

转载:JavaScript Date 对象参考手册 Date 对象是 JavaScript 的一种内部数据类型。 Date 对象没有可以直接读写的属性,所有对日期和时间值的访问都是通过其方法执行的。 请从下面的表格访问有关 Date 对象的方法的详细信息。 Date 对象的方法 FF: Firefox, N: Netsc…

mysql 禁止使用enum_MySQL慎用 ENUM 字段

前言:在网上看了很多文章,大家都是推荐 MySQL 要慎用 ENUM 字段,但是原理感觉还是有点模糊。今天我们就从官网来818这些东西1、关于 ENUM 迁移的问题?这里引用别人的一段话:但ENUM带来的问题也不少,比如数据…

2019年雁栖湖会议重大科学问题面向全球发布

来源:中国科学杂志社10月13日,由中国科学院学部和北京市政府联合举办的2019年度雁栖湖会议在北京怀柔开幕。中国科学院副院长张亚平、北京市委副秘书长郑登文以及来自国内外免疫学领域的院士、著名专家学者和中国科学院大学、中国科学院微生物所的师生等…

vscode怎么安装python包_vscode如何安装python

vscode安装python的方法: 1、在vscode的扩展中输入"ext install python"安装python插件打开VScode,Ctrlp 输入 "ext install python",搜索时间可能会比较长 安装过程不能停止,否则重新安装;2、在配…

mysql关于日期的函数_MySQL中关于日期函数汇总

实际应用SELECT NOW(),DATE_FORMAT(NOW(),%Y-%m-%d) %Y-%m-%d;年月日时间模块小时分钟秒周%X 年,其中的星期日是周的第一天,4 位,与 %V 使用%x 年,其中的星期一是周的第一天,4 位,与 %v 使用%Y 年&#xff…

《 百度大脑AI技术成果白皮书》,介绍百度大脑5.0,附48页PDF下载

来源:专知【导读】百度大脑是百度AI集大成者,自2010年起开始积累基础能力,2019年升级为5.0,成为软硬件一体的AI大生产平台。百度发布《 百度大脑AI技术成果白皮书》,详细介绍了百度大脑5.0在基础层、感知层、认知层、平…

python设计个人简历_python软件工程师 个人简历模板

工作经历: 2012.11 - 至今 北京 xxx 科技有限公司 ( 6 个月) 技术部 | python 软件工程师 互联网 / 电子商务 | 企业性质:民营 | 规模: 20-99 人 工作描述: 负责工作:网站的架构、接口的设计与实…

AT91SAM9260EK-38k产生原理

9260内部有5个内部计数器&#xff0c;分别为TIMER_CLOCK1 --- TIMER_CLOCK5。通过这5个时钟可以为各种内部设备提供时钟基准。 其中&#xff0c;红外发射38K方波&#xff0c;是通过CLOCK1计数产生。 配置寄存器如下 //选择TC通道 __sys_reg(AT91_PMC_PCER) 1 <<…

telegraf输出MySQL_Grafana+influxdb+telegraf初探-快速监控主机与mysql

一、安装1.1、配置influxdb yum源[rootnode ~]# cat /etc/yum.repos.d/influxdb.repo[influxdb]name InfluxDB Repository - RHEL \$releaseverbaseurl https://repos.influxdata.com/rhel/\$releasever/\$basearch/stableenabled 1gpgcheck 1gpgkey https://repos.influx…