MySQL 数据表在什么情况下容易损坏

这篇具有很好参考价值的文章主要介绍了MySQL 数据表在什么情况下容易损坏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务器突然断电导致数据文件损坏。强制关机,没有先关闭 MySQL 服务等。

表损坏的原因分析

以下原因是导致 mysql 表毁坏的常见原因:

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

表损坏的症状

一个损坏的表的典型症状如下:

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) 。

预防 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 、不怕万一,只怕意外,平时做好备份是预防表损坏的有效手段。

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 = 4
innodb_force_recovery 被允许的非零值如下。一个更大的数字包含所有更小数字的预防措施。如果你能够用一个多数是 4 的选项值来转储你的表,那么你是比较安全的,只有一些在损坏的单独页面上的数据会丢失。一个为 6 的值更夸张,因为数据库页被留在一个陈旧的状态,这个状态反过来可以引发对B 树和其它数据库结构的更多破坏。

innodb_force_recovery

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 ,使得数据库被挂起而不需要回滚,然后舍弃导致失控回滚的表。文章来源地址https://www.toymoban.com/news/detail-622869.html

到了这里,关于MySQL 数据表在什么情况下容易损坏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(79)
  • MySQL(1) MySQL创建数据库和创建数据表

    创建数据库 1. 连接 MySQL      mysql -u root -p  2. 查看当前的数据库  show databases; 3. 创建数据库  create database 数据库名; 创建数据库 4. 创建数据库时设置字符编码  create database 数据库名 character set utf8;  5. 查看和显示数据库的编码方式  show create database 数据库名; 显示数据库的

    2024年02月14日
    浏览(86)
  • MySQL数据库——MySQL数据表添加字段(三种方式)

    MySQL 数据表是由行和列构成的,通常把表的“列”称为字段(Field),把表的“行”称为记录(Record)。随着业务的变化,可能需要在已有的表中添加新的字段。 MySQL 允许在开头、中间和结尾处添加字段。 一个完整的字段包括字段名、数据类型和约束条件。MySQL 添加字段的语

    2024年02月08日
    浏览(91)
  • MySQL:创建数据库,数据表,主键和外键

    目录 前言: 安装MySQL: 打开MySQL: 创建数据库: 查看已建数据库: 查看数据库引擎: 创建数据表:  主键约束: 单字段主键: 多字段联合主键: 外键约束: MySQL数据库安装了很久,一直也没静下心来学习,因为起步太晚,所以什么都想学点,又感觉有些力不从心,目前

    2023年04月27日
    浏览(134)
  • MySql数据库的初步安装与数据表结构数据管理

    目录 一、数据库的相关了解 1)数据库的概念  数据(Data) 表 数据库系统 2)数据库系统发展史 第一代数据库 第二代数据库 第三代数据库 当今主流数据库介绍 2)数据库的分类  关系数据库 非关系型数据库 非关系型数据库的优点 二、mysql的yum安装与源码编译安装   1)源

    2024年02月08日
    浏览(442)
  • Mysql 查询数据库或数据表中的数据量以及数据大小

     许多数据库的元数据都是存储在mysql中的,例如hive、startrockes,因此可以通过mysql中的“information_schema.TABLES”表来查询对应数据库或对应数据表的具体信息。 1、查询各个数据库中的数据条数和数据大小 2、查询各个数据表中的数据条数和数据大小 3、查看指定数据库容量大小

    2024年04月27日
    浏览(56)
  • 【MySQL】基础实战篇(1)—数据库与数据表的操作

    创建数据库 语法: 注: 在同一个数据库服务器上必须是唯一的,不允许存在同名的数据库。 此外在创建数据库时如果不进行自定义设置编码方式,就会使用系统默认的编码方式,所以我们可以在创建数据库的同时自定义设置编码方式。 语法: 字符集 是定义MySQL存储字符串

    2024年02月08日
    浏览(69)
  • MySQL相关的SQL语句、数据库、数据表、字段、类型

    1、 SQL 语句不区分大小写。 SQL语句 用途 描述 mysql -u root -p 连接 MySQL 在命令行窗口中输入 mysql -u root -p 命令,回车,然后输入 MySQL 密码(不要忘记了密码,找回麻烦),再回车就连接上 MySQL 了。最初都是使用 root 用户登录,工作中不能一直使用 root 用户登录。因为 root 权限太

    2024年02月13日
    浏览(95)
  • MySQL的约束类型、数据库操作、数据表操作大全(简述)

    目录 一.数据库的操作语法 二.MySQL数据库约束 三.数据类型 四.数据表操作 作者简介:  tq02,一个想成为编程高手的梦中人 作者主页:  tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 学习专栏:  🎥  MySQL基础          🎥  JavaSE                🎥   C语言 本

    2024年02月12日
    浏览(91)
  • idea配置MySQL数据库,以及将已存在的数据表导入数据库

    首先,确定自己需要的数据库名字,结合jeecg项目,我在项目中得知我需要链接的数据库的名字为     jeecg-boot 打开数据库的可视化软件,     点击开始,即可导入,刷新数据库,就可以看到导入的数据表了。 接下来在idea链接MySQL     点击OK,就完成配置了,刷新一下,就

    2024年02月11日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包