用Myisamchk让MySQL数据表更健康

2011-03-15 09:15 水太深 ITPUB 字号:T | T

为了让MySQL数据库中的数据表“更健康”,就需要对其进行定期体检。在这里笔者推荐使用Myisamchk工具来对数据表进行不定期的检查。同时笔者给出了一些相关的注意事项以及使用技巧。

AD:51CTO 网+首届APP创新评选大赛火热启动——超百万资源等你拿!

在MySQL数据库中,数据表数以百计,数据库管理员不可能有这么多的时间和精力去依次检查表的有效性,所以他们急需要一种工具,能 够对相关的数据表进行体检,以判断表是否存在一些问题。这就好像我们每年都需要体检一样,发现小问题,即时进行修复,以免到时候病入膏肓。在这里笔者推荐 使用Myisamchk工具来对数据表进行不定期的检查。在使用这个工具时,笔者要强调一下相关的注意事项以及使用技巧。

一、大表要增加内存的容量

Myisamchk工具的使用效率主要跟表的大小有关。如果数据表比较大,则其运行的速度就会比较慢。在这种情况下,数据库管理员可能需奥调整内存的配置。

通常情况下,-O参数决定Myisamchk工具运行时所能够使用的内存大小。当运行Myisamchk时内存分配给其使用的空间不能够超过这个参 数所指定的大小。如果数据库管理员需要对每一个大表使用Myisamchk工具时,往往需要首先确定这个数据表的大小,并依此判断所需要占用内存的大小。 默认情况下,恢复时可以采用的内存大小只有3M。对于大表来说,这点内存是不够的。此时数据库管理员可以调整内存的大小,让Myisamchk工具运行的 更快一点。

如果有需要的话,可以使用-O参数将内存调整为合适的大小。如-O sort=8M等等。一般情况下,这个值设置为16M即可。不需要太大,否则的话,会影响其它作业的运行。总之,在运行Myisamchk工具之前,数据 库管理员先需要评估一下数据库中各个数据表的大小。如果有比较大的数据表,可以先将其过滤出来(如通过通配符等形式)。然后再调整内存的大小,并单独对这 些大表进行检查。这是提高Myisamchk运行效率的一个不错的办法。

二、利用Myisamchk工具恢复数据时需要大量的硬盘空间

在使用Myisamchk检查数据表时,如果发现某些表存在问题,还可以使用Myisamchk这个工具对其进行恢复。不过在恢复时,需要先确保有足够的硬盘空间。否则的话,就可能导致数据表恢复失败。

通常情况下,所需要使用的硬盘空间是数据表的一倍大小。即如果需要对2G的数据表进行恢复,那么所需要的剩余空间至少应该还有2G。即需要将数据文 件大小扩大为原来的一倍。如果硬盘空间不足,该怎么办呢?此时数据库管理员可以考虑使用—quick选项。使用这个选项之后,进行修复时就不需要这么多的 空间。不过需要注意,此时数据库系统只是创建了索引文件。

在某些情况下,在修复时需要重新创建索引文件。此时代替旧索引文件的新索引文件也需要占用一定的磁盘空间。虽然说在修复工作一开始的时候,数据库系 统就会对就索引文件进行删减。但是为了安全起见,笔者还是建议为其保留足够的硬盘空间。并且在文件系统上所需要的这个存储空间的大小与原数据文件是相同 的。

另外在使用Myisamchk这个工具时,数据库管理员可能会使用—Recover选项。如果数据库管理员采用这个选项的话,那么就可以修复几乎所 有一切的问题。不过注意这里有一个关键字几乎。这也就是说,大部分数据表问题都可以通过这个选项来解决。但是也有一些例外。如当遇到唯一的键不唯一等问题 时,即时采用这个选项也是没有办法。一般情况下,数据库管理员在恢复工作时可以先试用这个选项。当系统报告这个选项不可用时,再尝试使用另外的恢复方式。 不过需要注意的是,使用这个选项时需要用到排序缓冲区空间。大致大小一般为数据的2倍。

综上所述,在利用Myisamchk这个工具对表进行恢复操作时,需要保证其有足够的磁盘空间。笔者的建议时,至少要有两倍以上的数据文件大小的磁盘空间。

三、逐步修复收损坏的数据表

如果不幸你的数据表受到损坏时,该怎么进行修复呢?笔者认为,应该采用逐步修复的方式。不过在执行修复操作是,有两个必要的步骤需要做。一是停止运行数据库服务器,二是对相关的数据文件进行备份。虽然说Myisamchk工具是一个相对安全的数据检查工具,但是在对数据进行恢复之前对数据文件进行必要的备份,仍然是一个必要的安全措施。在对对数据进行恢复时,通常可以按照下面的顺序来操作。

一是检查数据表,以判断到底哪些数据表出现了问题,以及出现问题的大小。为了安全与效率的考虑,在修复时一般只 修复那些出现问题的数据表。在检查数据表时,可以使用-update-state选项来告诉Myisamchk工具哪些数据表是检查过的,并且对有问题的 表格会进行标识。 然后再修复时,可以指定Myisamchk工具只修复那些报告有错误的表格。

二是进行简单安全的修复。在刚开始修复数据时,最好采用“快速恢复模式”。在这个模式下,数据库系统并不接触数 据文件来修复索引文件。如果数据文件包含它应有的一切内容和指向数据文件内正确的删除连接,此时使用快速恢复模式就可以修复损坏的数据表,如果即使采用简 单安全的修复,最好在修复开始之前对数据表做好备份工作。然后使用Myisamchk –r 表名字 来恢复指定的数据表。运行这个命令之后,系统将从数据文件中删除不正确的纪录和已经被删除的记录,并会重新创建索引文件。如果采用这个模式还不能够修复数 据文件时,则采用下面一个恢复模式。

三是索引文件破坏情况下的恢复模式。如果数据库表格的索引文件的第一个16K块被破坏掉,或者说包含不正确的信 息,又或者整个索引文件丢失,在这种情况下,就需要创建一个新的索引文件。此时就需要用到下面谈到的恢复模式。此时数据库管理员需要先将数据文件转移到安 全地方,然后使用表描述文件来创建新的数据文件和索引文件。然后再将老的数据文件复制到新创建的数据文件之中。然后再使用命令Myisamchk –r-q来恢复数据表。如果只是索引文件出现了问题,那么使用这个命令就可以恢复数据。

四是最极端的情况,即表描述文件也受到了损坏。此时就不能够采用上面这个恢复模式。因为已经无法使用表描述文件 来创建新的数据文件和索引文件。此时笔者建议,要采用数据库恢复的方式,来恢复全部的数据文件。在MySQL数据库中,可以根据需要设置完全备份或者增量 备份。如果表描述文件也损坏时,那么采用数据库恢复的方式,无疑是最安全的方法。

当然Myisamchk工具的功能不只上面这些。其下面有很多有趣的内容。如可以根据需要,修复某个指定的数据表。也可以使用通配符批量的检查文 件。甚至可以对独立的数据文件进行检查等等。不过需要注意的是,无论是采用哪种方式,都需要先对数据库进行必要的备份。虽然说Myisamchk这个工具 相对来说是比较安全的。但是养成在任何检查与修复之前先对原有的数据进行备份,仍然是一个不错的数据库管理习惯。

不过需要注意的是,Myisamchk工具并不是万能的。对于一些极端性的损坏,如表格描述文件损坏,这个工具就没有用武之地了。为此数据库管理员还是需要最好数据库日常的备份工作。

用Myisamchk让MySQL数据表更健康的更多相关文章

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

    MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...

  2. MySQL 数据表修复及数据恢复

    1. MYSQL数据表在什么情况下容易损坏? 服务器突然断电导致数据文件损坏. 强制关机,没有先关闭mysql 服务等.   2. 数据表损坏后的主要现象是什么? 从表中选择数据之时,得到如下错误:I ...

  3. 设置MySQL数据表主键

    设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...

  4. 谈谈MySQL数据表的类型(转)

    谈谈MySQL数据表的类型 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其 ...

  5. mysql数据表修复

    当数据库表被破坏,运行报错: Table './database/tablename' is marked as crashed and last (automatic?) repair failed ...

  6. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  7. 随机获取Mysql数据表的一条或多条记录

    随机获得Mysql数据表的一条或多条记录有很多方法,下面我就以users(userId,userName,password......)表(有一百多万条记录)为例,对比讲解下几个方法效率问题: sel ...

  8. (转)MySQL数据表中带LIKE的字符匹配查询

    MySQL数据表中带LIKE的字符匹配查询 2014年07月15日09:56    百科369 MySQL数据表中带LIKE的字符匹配查询 LIKE关键字可以匹配字符串是否相等. 如果字段的值与指定的 ...

  9. mysql数据表增删改查

    http://www.runoob.com/mysql/mysql-tutorial.html 一.MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以 ...

随机推荐

  1. 认识Activity,创建第一个android应用-Hello Word

    2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...

  2. Servlet简介与Servlet和HttpServlet运行的流程

    1.Servlet      [1] Servlet简介         > Server + let         > 意为:运行在服务器端的小程序.         > Ser ...

  3. PHP isset() 检测变量是否设置

    isset() 用于检测变量是否设置. isset() PHP isset() 用于检测一个或多个变量是否设置,如果被检测的变量存在则返回 TRUE,否则返回 FALSE. 语法: 1 bool is ...

  4. input的file 控件及美化

    在一些网站进行上传时,当单击了“浏览”按钮之后会弹出[选择文件]的对话框.想要实现这一功能,用input的file控件来实现就好啦~ <!doctype html> <html la ...

  5. [java]byte和byte[]与int之间的转换

    1.byte与int转换 public static byte intToByte(int x) {   return (byte) x;   }   public static int byteTo ...

  6. java自定义Annotation(载自百度文库)

    java中自定义annotation需要@interface关键字和用到几个内置annotation. 用到的注解有@Target,@Retention,@Documented,@Inherited  ...

  7. java的finalize()函数

    在说明finalize()的用法之前要树立有关于java垃圾回收器几个观点: "对象可以不被垃圾回收" : java的垃圾回收遵循一个特点, 就是能不回收就不会回收.只要程序的内存 ...

  8. 将一列包含多个ID拆分多行

    看到个不常见的问题~然后在 Inner Sql Server2008 里面找到一个思路. 如果下面的表结构,如何拆分多行并对应员工号呢? 首先创建测试表 CREATE TABLE Department ...

  9. DGbroker主备切换

    1.检查DG是否正常 DGMGRL> show configuration; Configuration - dgc Protection Mode: MaxProtection Databas ...

  10. A coroutine example: Streaming XML parsing using xml_parser

    <?php error_reporting(E_ALL); /* Data can be send to coroutines using `$coroutine->send($data) ...