本文地址:https://www.askmac.cn/archives/mysql-maintenance-tools.html
10.3 表维护中的客户端工具程序
之前讨论的表维护SQL语句可以在mysql客户端工具执行,也可以通过其它应用发送给服务端来执行。通过使用这些语句,你可以写一些自己的管理应用程序来进行表的检查和修理操作。
一些MySQL客户端程序作为前端可发出表维护命令:
- MySQL Workbench提供了执行语句的编辑窗口可用于进行表检查,修理和优化操作。当你执行这些操作时,语句会被发至服务端。
- mysqlcheck可用于检查,维修,分析和优化表。此命令行工具按所提供的命令项来决定发送哪些相适合的SQL语句到MySQL服务端以进行所需操作。
对于MyISAM表,使用myisamchk工具也能进行表维护。然而,它不同于MySQL Workbench和mysqlcheck需要将SQL语句发送到服务端,myisamchk可直接读取并修改表文件。也因为此,请保证在使用myisamchk的同时服务端不会去访问这些表。
10.3.1 mysqlcheck客户端程序
mysqlcheck可对表进行的操作有检查,修理,分析和优化。对于MyISAM表,此程序工具可执行所有这些操作,而对于InnoDB表,则只能执行一部分操作。它提供了一种命令行接口方式来执行各种SQL语句(如CHECK TABLE和REPAIR TABLE)以告知服务端进行何种表维护。
mysqlcheck在某些情况下比起直接执行SQL语句,可以使得操作变得更容易。例如,如果你指定一个数据库,它包含了需要执行语句来处理的所有表。使用mysqlcheck你就不需要在进行操作时显式地指定每个表,而且,mysqlcheck是一个命令行程序,它可以在工作中被用于周期性计划维护作业。
mysqlcheck按照你所使用的参数提供有三种操作模式:
- 默认情况下,mysqlcheck会将其第一个非命令项参数作为一个数据库名并检查此数据库下的所有表。如果在数据库名后跟有其它参数,mysqlcheck会将其作为表名并仅处理这些指定的表。例如,下面例子中,第一个命令会检查world数据库下所有表;第二个命令仅检查此数据库下的City和Country表:
注意:由于使用了mysql_config_editor已经默认设置过dbdao的登陆用户名及密码,因此此例中在使用mysqlcheck时并未加上-uroot -p’dbdao.com’,如果大家在测试前并未做过此默认登陆密码设置,请加上用户和密码命令项。 - 使用 –databases(或 -B)命令项,mysqlcheck可以将非命令项参数都接受为数据库名,并检查其指定数据库下的所有表。如,以下命令检查了world和sakila数据库:
shell> mysqlcheck --databases world sakila
- 使用–all-databases(或 -A)项,mysqlcheck可检查所有数据库下所有表:
shell> mysqlcheck --all-databases
mysqlcheck还支持对指定的表进行指定的操作。--check
,--repaire
,--analyze
和 --optimize
分别可进行表检查,修理,分析和优化工作。如果在命令中不指定这些操作的任何一种的话,默认进行检查表操作。
对某些操作,mysqlcheck支持使用一些命令项来一些基本的操作进行一定的调整。一个对于表检查推荐技巧是,最开始使用mysqlcheck时不提供命令项进行检查。如果报错,再次运行mysqlcheck,先加上--repair
和 --quick
项尝试进行快速维修。如果这样不行,那运行 mysqlcheck加上--repair
进行正常维修,必要的话也可以--repair
和 --force
一起使用。
10.3.2 myisamchk客户端程序
myisamchk工具可用于对MyISAM表的维护。概念上,myisamchk类似于mysqlcheck,但是这两个工具程序在以下方面有不同:
- 这两个工具程序都可用于检查,修复和分析MyISAM表。mysqlcheck也可对MyISAM表进行优化。不过有些特定操作是myisamchk可以进行而mysqlcheck不能做的,如启用或禁用索引等。
- 在操作模式上,两种程序则差异很大,mysqlcheck是一种客户端工具,需要通过网络连接来访问MySQL服务端。这意味着mysqlcheck要求服务端当时正在运行,但也可以说mysqlcheck可以连接远程服务端进行操作。相反,myisamchk则不是一种客户端工具。它直接操作于MyISAM表文件上。你必须在本地服务端的本地文件上运行myisamchk。此外,对于所要进行的表检查操作,你需要相应的文件系统读取权限,而表的修复操作则需要文件写权限。
- 两个程序在其运行时和服务端之间的关系也有不同。使用mysqlcheck时,由于它要求服务端自己来进行检查和表修复作业,因此在和服务端进行交互时不会有问题。但使用myisamchk时,你需要确保服务端此时没有打开表并在进行使用。如果表文件在同时被服务端和myisamchk使用,这就有可能造成数据不正确,甚至表文件损坏的严重后果。最好是在使用myisamchk前先关闭数据库服务端。你也可以让服务端处于运行状态并进行锁表,然后使用myisamchk进行表检查和修复。
由于必须避免在使用myisamchk时同时服务端也在对同一张表进行访问操作,因此所进行的myisamchk操作步骤将和使用mysqlcheck不同。使用myisamchk进行表维护操作如下:
- 保证你在进行表维护操作时,服务端并不在访问这些表。其中一种保证方式是直接关闭服务端。
- 通过系统命令提示行,切换到表所在的数据库目录中。需要检查的表所在的子目录名为服务端数据目录下的子目录且目录名和表所在的数据库名相同。(切换目录位置是为了在进行操作时,更容易引用这些表文件。你也可以跳过这一步骤,不过在使用myisamchk时,你就需要指定表所在的目录位置了。)
- 在调用myisamchk时同时使用命令项来指定所要进行的具体操作,同时命令之后紧跟着的是myisamchk所要操作的表名。每个参数可以是一个表名或表索引文件名。索引文件名和表名相同,不过在之后文件尾缀使用.MYI。因此,你在引用时可以是table_name 或 table_name.MYI。
- 在操作后重启服务端。
myisamchk默认是进行表检查操作。如果那正是你希望做的,那么就不必一定带有命令项,仅需要提供表名参数即可。例如,检查表,可以使用以下命令:
shell> myisamchk film_text shell> myisamchk film_text.MYI
为了对表进行修复,可以使用 --recover
命令项:
shell> myisamchk --recover film_text
如果在维修中使用 --recover
遇到其不能恢复的问题,尝试使用 --safe-recover
项,--safe-recover
可以解决一些 --recover
不能解决的问题(--safe-recover
处理速度比 --recover
慢,这就是为什么先使用 --recover
)。
10.3.3 mysqlcheck和myisamchk所使用到的项
mysqlcheck和myisamchk这两个工具程序都有许多可用的命令项来控制需要进行的表维护操作类型。以下总结列出了一些通用的项。对其中多数来说,都可以被这两个工具命令使用,如果有所区别,这里也会在相关项描述中进行说明:
--analyze
或 -a
分析优化表中的键值分布,此操作可以加速基于索引的查询来提升查询性能。
--auto-repair
(仅mysqlcheck)
如果检查中发现表中有讹误,可自动进行表修复。
--check
或 -c
检查表中的问题。如果执行命令时没有指定其它操作,则此为默认操作。
--check-only-changed
或 -C
仅对自从上次检查以来被修改过的表或未能正常关闭的表进行表检查(如:在表打开的情况下发生了服务端崩溃等情况)。
--fast
或 -F
除了对未能正常关闭的表检查之前,其它的表都跳过检查。
--extended
(仅mysqlcheck),--extend-check
(仅myisamchk), 或 -e(对两个程序)
运行额外的表检查操作。对于mysqlcheck,当此命令项和一个修复项连用,那么就会进行更彻底的修复作业。如mysqlcheck --repair --extended
就比mysqlcheck --repair
维修操作更彻底。
--medium-check
或 -m
进行一次中级表检查,比extended表检查速度快。
--quick
或 -q
对于mysqlcheck , 使用--quick
但不连用修复命令项将仅会对索引文件进行检查,不会涉及数据文件。mysqlcheck和myisamchk在同时使用--quick
和修复命令项时,则对仅对索引文件进行修复,而不涉及数据文件。
--repair
(仅mysqlcheck),--recover
(仅myisamchk),或 -r(对两个程序)
进行正常的表恢复操作。
Comment