第30章 表维护

                               表维护


MySQL 可以诊断表上的问题和修复它们。 其他表维护能力包括表分析和优化




这章讨论如何进行管理:


1. 表维护操作类型


2.SQL语句用于表管理


3.客户端和实用工具用于表管理


4.修复InnoDB 表


5.启用自动修复MyISAM 表


30.1  表维护操作类型


表维护操作是有用的用于识别和收集问题(比如,如果一个表由于server crash 被毁坏)




或者帮助MYSQL处理查询更快。MYSQL可以让你执行多种类型的管理操作:




1. 一个表的检查执行一个完整性检查来确保表结构和内容没有问题。




这个操作可以用于MyISAM和InnoDB 表


2.一个表修复收集的完整性问题来恢复表到一个可知的,可用的状态


这个操作可以用于MyISAM 表




3.一个表分析更新关于索引键值统计信息。这些信息优化器可以用于产生更好的执行计划用于查询


这些操作可以用于MyISAM和InnoDB 表。




4.一个表的优化器识别一个表 因此它的内容能被更有效的访问。


这个操作可以用于MyISAM和InnoDB 表




表分析和优化这些操作你需要定期的执行来保持表的最佳性能:




1.当MYSQL 分析一个MyISAM或者一个InnoDB表,它更新索引的统计信息。




优化器使用这些统计信息来处理查询得到更好的结果关于查找表的记录和关联时的顺序




2.当MYSQL优化一个MyISAM表,它整理数据文件碎片来收回不使用的空间,排序索引,




和更新索引信息。




定期的碎片整理有利于加速表的访问,那些包含可变程度列的比如VARCHAR,VARBINARY,BLOB或者TEXT


插入和删除能导致很多的gaps,特别那些频繁修改的。碎片整理消除了这些gaps.




表分析和优化操作是最大化的有利的当对一个表操作 ,这个是很受欢迎的。


分析和优化的好处减少,如果表持续的被更新,因此你需要重复的做这些操作。




30.2  SQL语句用于管理表


MYSQL 有多个SQL语句用于表管理,CHEKC TABLE 用于完整性检查


REPAIR TABLE用于修复,ANALYZE TABLE用于分析,OPTIMIZE TABLE用于优化。




这个章节描述了那些SQL语句的作用




每个语句,当执行时,会导致server来执行请求的操作。语句占用一个或者多个表名字可能优化的关键字


修改了基本的动作被执行。一个表名可能不合格的相对于当前数据库的表,




或者合格的在db_name.table 格式来指定数据库里的表。比如,如果world是当前的数据库,下面的语句是


等效的指示server 来检查world.city 表


CHECK TABLE City;


CHECK TABLE world.City;


当执行请求的操作,server 返回信息关于操作的结构。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1             |
| students       |
+----------------+
2 rows in set (0.00 sec)


mysql>  OPTIMIZE TABLE a1,students;
+---------------+----------+----------


+-------------------------------------------------------------------+
| Table         | Op       | Msg_type | Msg_text                                                       


   |
+---------------+----------+----------


+-------------------------------------------------------------------+
| test.a1       | optimize | note     | Table does not support optimize, doing recreate + analyze 


instead |
| test.a1       | optimize | status   | OK                                                             


   |
| test.students | optimize | note     | Table does not support optimize, doing recreate + analyze 


instead |
| test.students | optimize | status   | OK                                                             


   |
+---------------+----------+----------


+-------------------------------------------------------------------+
4 rows in set (0.45 sec)


默认情况下,直接对InnoDB引擎的数据表使用OPTIMIZE TABLE,可能会显示「 Table does not support optimize, 


doing recreate + analyze instead」的提示信息。这个时候,我们可以用mysqld --skip-new或者mysqld --safe-


mode命令来重启MySQL,以便于让其他引擎支持OPTIMIZE TABLE。




30.2.1  CHECK TABLE




CHECK TABLE 语句执行对表结构和内容的完整性检查。它用于MyISAM和InnoDB。对于MyISAM表,它也能


升级索引的统计信息 如果表示一个view,CHECK TABLE 也检查view的定义。


如果CHECK TABLE 表明表有问题,那么表就需要修复


30.2.2 REPAIR TABLE


修复表语句搜集表的问题,表已经腐败了 它只能用于MyISAM 表


你也可以让server 自动修复MyISAM 表 启用MyISAM Auto-Repair




30.2.3 ANALYZE TABLE


ANALYZE TABLE 语句 用键值分布来更新表   这些信息供优化器使用 产生更好的查询执行计划


这个语句用于MyISAM和InnoDB 表


30.2.4 OPTIMIZE TABLE


OPTIMIZE TABLE语句通过碎片清理MyISAM,这个包含回收不使用的空间由于delete和update


合并那些分散的和你连续的记录。 OPTIMIZE TABLE 也重新排序索引页 






OPTIMIZE TABLE 也用于InnoDB表,但是对应ALTER TABLE 用于重建表


30.3  客户端和实用工具用于管理表


表的管理SQL语句在之前的章节已经讨论过了 用Mysql 客户端程序或者通过其他应用发送语句到server




通过使用那些语句,你可以写你自己的管理程序用来执行表check和repair操作。




一些MYSQL客户端程序提供了一个前端的用于执行表管理语句:




1.MYSQL 管理器提供了志向点击的接口用于表的检查,repair 和优化操作。




当你选择了其中的操作,MySQL Administrator发送相应的SQL语句到server.




2.mysqlcheck 可以check,repair,analyze 和优化表 






myisamchk 功能用于MyISAM表的管理,然而,它不同于MYSQL Administrator和mysql check。


它们只是发送SQL到server,myisamchk 直接读取和修改表文件。




由于这个原因,当你使用myisamchk的时候要确保server没有同一时间访问table




30.3.1  mysql check 客户端程序


mysqlcheck checks,repairs,analyzes 和优化表。它可以在MyISAM表上执行所有操作,




在InnoDB表里只能执行部分。它提供了一个命令行的接口用于各种各样的SQL语句来


指示执行管理表操作,比如check table 和repair table.




mysqlcheck 有些属性 在一些上下文环境使你更加便利相比直接的执行SQL语句。




比如,如果你命名一个数据库,它决定了数据库包含什么包和执行什么语句来处理他们。


你不需要显示的命名每个表。




因为mysqlcheck 是一个命令行的程序,它可以用于jobs 执行周期性的任务调度。




mysqlcheck 有3个常规的操作模式:


1.默认的,mysqlcheck 解释它的非选项参数 作为数据库名字 检查数据库里所有的表。




如果其他的参数跟在数据库名字后,mysqlcheck 对待他们作为表名字 检查哪些表。




举个例子,下面第一个命令chekcs所有的表在world数据库里;




第2条命令只是City 和Country 表在world数据库里


shell>mysqlcheck world


shell>mysqlcheck world City Country




1.用--databases(or -B)选项,mysqlcheck 说明它的非选项参数 作为数据库名字


检查所有的表在每个命名的数据库里 下面的命令检查在数据库world和test数据库里的所有表




shell>mysqlcheck --databases world test






2.用--all-databases(or -A)选项,mysqlcheck 检查数据库里所有的表


shell>mysqlcheck -all-databases




mysqlcheck 也支持选项来指明特定表上的操作。


--check --repair --analyze 和--optimize执行table checking,repair


analy-sis 和优化 默认是check table 如果选项没有指定。






对于一些操作,mysqlcheck 支持的选项是修改基本的动作。


一个推荐的table-checking 策略是运行mysqlcheck 不带选择。


如果一个错误发生,再次运行mysqlcheck ,第一次用--repair 和--quick选项 来尝试快速的修复




如果还失败,运行mysqlcheck --repair 来进行normal repair 


30.3.2 myisamchk 功能


myisamchk 功能维护MyISAM表。概念上的,myisamchk 类似于mysqlcheck的功能,


但是2个程序在某些方面做不同的事情。




1.两个程序都能检查,修复,和分析MyUSAM表。mysqlcheck 也能优化MyISAM表 也能优化InnoDB 表


某些操作 myisamchk 能执行但是mysqlcheck不能


比如 禁用和启用索引 尽管那些操作不在这里讨论。




2. 2个程序重大的区别是它们的操作模式,mysqlcheck 是一个客户端程序需要通过网络连接到server服务器。




也就是说mysqlcheck 需要server处于运行中,但也意味着mysqlcheck 能练到远程的servers.


与此相反,myisamchk 不是一个客户端程序。它的功能是直接操作 MyISAM 表对应的文件。


这就是说你必须运行myisamchk 在server主机上


额外的,你需要文件系统读的权限用于检查操作,写的权限用于修复。




2个程序它们和server的关系也不同,用mysqlcheck,没有个server 进行及哦啊胡 因为


mysqlcheck 需要服务器本身来做检查和修复的工作。




myisamchk 你需要确保server 没有打开表和没有使用它们 。可能会得到不正确的结果甚至


导致表损坏 如果表文件是用于myisamchk 和server 同时使用。


最确信的方式避免冲突时当运行myisamchk 时 首选停掉server,


也可以是让server 运行然后lock 表当用myisamchk 进行check和repair的时候


因为你必须避免使用表时server 可能会访问它们 ,使用myisamchk不同于使用mysqlcheck


执行myisamchk 如下:


1. 确保server 不会访问表,一种方式是强制的是停止server




2.从一个命令提示,改变位置到数据库存放表的目录。


这会是server的数据目录的子目录 




3. 调用myisamchk 带上选项来执行,参数后面带上表 




4,重启server









































































原文地址:https://www.cnblogs.com/hzcya1995/p/13351767.html