MySQL表的检查、修复、分析和优化

     InnoDB存储引擎所支持的事务和崩溃自动恢复,使得MySQL成为安全可信的数据库服务器。如上一篇博文的学习,http://blog.csdn.net/sweeper_freedoman/article/details/74854175,绝大多数情况下,只要不是硬件故障,MySQL的崩溃基本上都可以实现自我修复,用户要做的仅仅是重启MySQL。但当MySQL无法顺利完成自动修复,或者其他人工干预的情况下,还是需要一些手动检查修复表的方法。另外,除了检查修复,还可以对表实施包括分析和优化在内的日常管理维护,以使表更具高性能。


①CHECK TABLE(mysqlcheck --check

https://dev.mysql.com/doc/refman/5.7/en/check-table.html

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option = {
    FOR UPGRADE
  | QUICK
  | FAST
  | MEDIUM
  | EXTENDED
  | CHANGED
}

     检查表错误。适用于MyISAM、InnoDB、ARCHIVE和CSV表。还可以用来检查视图定义(如引用了不存在的表)。需要SELECT权限。执行的时候后面接若干个表名和可选选项。除非特别说明,选项一般只适用于MyISAM表,其他存储引擎会自动忽略。

  • FOR UPGRADE

被检查表是否与当前MySQL版本兼容(MySQL升级后很有用)。只要发现不兼容的地方,MySQL服务器会执行全面检查。如果全面检查成功,MySQL将根据当前版本升级表的.frm文件;检查不成功,就需要尝试修复。该选项的适用范围不仅限于MyISAM表。

  • QUICK

只扫描索引而不扫描数据行。适用于MyISAM和InnoDB表。

  • FAST

仅检查正常关闭的表。

  • MEDIUM

默认选项。既检查索引,又扫描数据行,并进行校验和验证。

  • EXTENDED

最全面和执行速度最慢的检查。执行扩展检查以确保表完全一致。例如,它检查每个索引中的每个键是否都指向一个数据行。

  • CHANGED

如果表正常关闭,并且自上次检查以来未做更改,则跳过检查。

     某些情况下,CHECK TABLE也可能会修改表,但这种修改仅仅是设置一个内部标识而已。例如,有一个表被标记为损坏,或者未正常关闭,但是检查时未发现问题,CREATE TABLE会将其标记为完好。

②REPAIR TABLE(mysqlcheck --repair

https://dev.mysql.com/doc/refman/5.7/en/repair-table.html

REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...
    [QUICK] [EXTENDED] [USE_FRM]

     修复受损表。适用于MyISAM、ARCHIVE和CSV表。需要SELECT和INSERT权限。如果启用了二进制日志记录,在不给出NO_WRITE_TO_BINLOG或者LOCAL选项时,MySQL会把REPAIR TABLE语句写入二进制日志里。不带任何选项的REPAIR TABLE执行的是普通的表修复操作。除了在应该只包含唯一值的索引里出现了重复值这一情况无法处理之外,该操作可以修复大部分的问题。以下是可选选项,一般只适用于MyISAM表,其他存储引擎会自动忽略。

  • QUICK

快速修复索引而不管数据文件。

  • EXTENDED

扩展修复,重建索引。

  • USE_FRM

使用表的.frm文件重新初始化索引文件,并确定如何解释数据文件的内容,以便能够重建索引。如果索引丢失或损坏后不可恢复,此选项非常有用。不过,它应该作为最后的打算。并且只有在当前的MySQL版本与创建表时所使用的MySQL版本一样时才使用。否则,有可能会进一步破坏表。USE_FRM选项不能用于分区表。


③ANALYZE TABLE(mysqlcheck --analyze

https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

     分析、统计并保存表里面索引的键值分布情况。适用于MyISAM和InnoDB表。需要SELECT和INSERT权限。如果启用了二进制日志记录,在不给出NO_WRITE_TO_BINLOG或者LOCAL选项时,MySQL会把ANALYZE TABLE语句写入二进制日志里。分析完成后,SHOW INDEX输出里的Cardinality值会更新。MySQL查询优化器在后面的查询中可以选择更佳的连接操作。ANALYZE TABLE需要一个读锁以防止表在分析期间被更新。如果表已经分析过,并且之后再未被修改过,那么再次执行ANALYZE TABLE将不会执行任何操作。


④OPTIMIZE TABLE(mysqlcheck --optimize

https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

     优化表。适用于MyISAM、InnoDB和ARCHIVE表。需要SELECT和INSERT权限。如果启用了二进制日志记录,在不给出NO_WRITE_TO_BINLOG或者LOCAL选项时,MySQL会把OPTIMIZE TABLE语句写入二进制日志里。DELETE、REPLACE和UPDATE等DML操作会使表的内部出现未使用的区域,OPTIMIZE TABLE可以重新组织表的物理存储以减小存储空间和增强I/O性能。对于InnoDB表,OPTIMIZE TABLE会被映射成ALTER TABLE ... FORCE,执行一个“ recreate + analyze ”的重建表、更新索引统计和释放未使用聚簇索引空间操作。


mysqlcheck

https://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html

shell> mysqlcheck [options] db_name [tbl_name ...]
shell> mysqlcheck [options] --databases db_name ...
shell> mysqlcheck [options] --all-databases

     mysqlcheck是管理维护表的命令行小公举。它会连接服务器,根据指定的选项执行相应的语句。前文① ~ ④每个具体的语句都可以用mysqlcheck小公举替代执行(分别备注于每个语句后的括号内)。与执行语句相比,mysqlcheck不仅功能集中,而且更加灵活方便。语句中需要显式的指定每一个目标表对象的名字,而mysqlcheck可以直接指定库名进行整库操作。



参考:《MySQL技术内幕》(https://book.douban.com/subject/26436525/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值