MySQL的myisamchk 和isamchk 实用程序很类似,多数时候它们可以用同样的方式使用。它们之间的主要区别是它们所使用的表的类型。对于MyISAM 表,使用my i s a m c h k,而对于ISAM 表,则使用i s a m c h k。您可以通过表的索引文件的扩展名来告诉表使用哪种存储格式。扩展名“. M Y I”表明是一个MyISAM 表,而“. I S M”表明是ISAM 表。 为了使用任一个实用程序,应指明您所要检查或修复的表,以及指明要执行的操作类型的选项: % myisamchk options tbl_name... % isamchk options tbl_name... tbl_name 参数可以是表名也可以是该表的索引文件名。如果指定多个表,可以很容易地使用文件名模式来拾取目录中所有相应的文件: % myisamchk options *.MYI % isamchk options *.ISM 不会因为告诉了错误的程序来检查某个表而使该表毁坏,但是除了发布一条警告消息外此程序不做任何事情。例如,下面的第一条语句将检查当前目录中的所有MyISAM 表,而第二条语句只显示一条警告消息: % myisamchk *.MYI 正确 % myisamchk *.ISM 不正确─文件类型错 不论是myisamchk 还是isamchk 都不对表所在的位置做任何判断,因此,应该或者在包含表文件的目录中运行程序,或者指定表的路径名。这允许您将表文件拷贝到另一个目录中并用该拷贝进行操作。
检查表
myisamchk 和isamchk 提供了表检查方法,这些方法在彻底检查表的程度方面有差异。通常用标准方法就足够了。如果标准检查报告没有发现错误而您仍然怀疑有毁坏(或许因为查询没有正常地工作),可能要执行更彻底的检查。要想用任意一个实用程序执行标准的表检查,则不用带任何选项直接调用即可: % myisamchk tbl_name % isamchk tbl_name 为了执行扩充检查,使用--extend-check 选项。该选项非常慢,但检查极为彻底。对于该表的数据文件中的每个记录,索引文件中的每个索引的相关键都被检查以确保它真正指向正确的记录。myisamchk 还有一个中间选项- - m e d i um - c h e c k,它不如扩展检查彻底,但速度快。 如果对于--extend-check 检查不报告错误,则可以肯定表是好的。如果您仍然感觉表有问题,那原因肯定在其他地方。应重新检查任何好像有问题的查询以验证查询是正确书写的。如果您认为问题可能是MySQL服务器的原因,应考虑整理一份故障报告或升级到新的版本上。 如果myisamchk 或isamchk 报告表有错误,应用下节中的说明修复它们。
当您正在运行表的检查/修复实用程序时,您或许不想让MySQL服务器和实用程序同时访问一个表。如果两个程序都向表中写数据显然是一件坏事,但是,当一个程序在写入时另一个程序在读取也不是件好事。如果表正由一个程序写入,同时进行读取的另一个程序会被 搞乱。 如果您关闭服务器,就可以保证在服务器和myisamchk 或isamchk 之间没有交互作用。但是管理员极不愿意使服务器完全地脱机,因为这使得没有故障的数据库和表也不可用。本节中讨论的过程将帮助您避免服务器和myisamchk 或isamchk 之间的交互作用。 服务器有两种类型的锁定方法。它使用内部锁定避免客户机的请求相互干扰──例如,避免客户机的SELECT 查询被另一个客户机的UPDATE查询所干扰。服务器还使用外部锁定(文件级锁)来防止其他程序在服务器使用表时修改该表的文件。通常,在表的检查操作中服务器将外部锁定与myisamchk 或isamchk 组合使用。但是,外部锁定在某些系统中是禁用的,因为它不能可靠地进行工作。对运行myisamchk 和isamchk 所选择的过程取决于服务器是否能使用外部锁定。如果不使用,则必须使用内部锁定协议。 如果服务器用--skip-locking 选项运行,则外部锁定禁用。该选项在某些系统中是缺省的,如L i n ux。可以通过运行mysqladmin variables 命令确定服务器是否能够使用外部锁定。检查skip_locking 变量的值并按以下方法进行: 如果skip_locking 为o ff,则外部锁定有效。您可以继续并运行任一个实用程序来检查表。服务器和实用程序将合作对表进行访问。但是,在运行任何一个实用程序之前,应该用mysqladmin flush-tables 刷新表的高速缓存。为了修复表,应该使用表的修复锁定协议。 如果skip_locking 为o n,则禁用外部锁定,但在myisamchk 或isamchk 检查或修复一个表时服务器并不知道,最好关闭服务器。如果坚持使服务器保持开启状态,需要确保在您使用此表时没有客户机来访问它。必须使用恰当的锁定协议告诉服务器使该表独处,并阻塞客户机对其访问。 这里所描述的锁定协议使用服务器的内部锁定机制,以防止服务器在您利用my i s a m c h k或isamchk 工作时访问表。通常的办法是调用mysql并对要检查或修复的表发布L O C K TABLE 语句。然后,在mysql空闲时(即运行,但除了保持该表锁定外不用它做任何事情),运行myisamchk 或i s a m c h k。在myisamchk 或isamchk 结束后,可以切换到mysql会话中并释放该锁以告诉服务器程序执行完毕此表可以再次使用了。 检查和修复的锁定协议有点区别。对于检查,您只需要获得读锁。在这种情况下,只能读取表,但不能修改它,因此它也允许其他客户机读取它。读锁足以防止其他客户机修改表。对于修复,您必须获得写锁以防止任何客户机在您对表进行操作时修改它。 锁定协议使用LOCK TABLE 和UNLOCK TABLE 语句获得并释放锁。协议还使用F L U S H TABLES 告诉服务器刷新磁盘中任何未决的改变,并在通过表修复实用程序修改表后重新打开该表。您必须从单个mysql会话中执行所有L O C K、FLUSH 和UNLOCK 语句。如果锁定一个表然后退出mysql,则该锁将释放,且运行myisamchk 或isamchk 将不再是安全的! 如果保持打开两个窗口的状态,且一个运行mysql,而另一个运行myisamchk 或i s a m c h k,则运行锁定过程将会变得很容易。这样允许您很容易地在程序之间进行切换。如果不是运行在视窗环境中,当运行myisamchk 或isamchk 时,将需要使用外壳程序的作业控制工具暂停和恢复mysql。下面的指导显示出对myisamchk 或isamchk 的命令,可用与您正在使用的表相对应的那个命令。 1. 对检查操作锁定表 此过程只针对表的检查,不针对表的修复。在窗口1中,调用mysql并发布下列语句: % mysqldb_name mysql>LOCK TABLE tbl_name READ; mysql>FLUSH TABLES; 该锁防止其他客户机在检查时写入该表和修改该表。FLUSH 语句导致服务器关闭表的文件,它将刷新仍然在高速缓存中的任何未写入的改变。 当mysql空闲时,切换到窗口2 并检查该表: % myisamchk tbl_name % isamchk tbl_name 当myisamchk 或isamchk 结束时,切换回到窗口1的mysql会话并释放该表锁: mysql>UNLOCK TABLE; 如果myisamchk 或isamchk 指出发现该表的问题,将需要执行表的修复。 2. 对修复操作锁定表 修复表的锁定过程类似于检查表的过程,但有两个区别。第一,您必须得到写锁而非读锁。由于您将要修改表,因此根本不允许客户机对其进行访问。第二,必须在执行修复之后发布FLUSH TABLE 语句,因为myisamchk 和isamchk 建立了新的索引文件,除非再次刷新 该表的高速缓存否则服务器将不会注意到它: % mysqldb_name mysql>LOCK TABLE tbl_name WRITE; mysql>FLUSH TABLES; 利用mysql的空闲切换到窗口2,做该表的数据库文件的拷贝,然后运行myisamchk 或i s a m c h k: % cp tbl_name.* |some|other|directory % myisamchk --recover tbl_name % isamchk --recover tbl_name --recover 选项只是针对安装而设置的。这些特殊选项的选择将取决于您执行修复的类型。myisamchk 或isamchk 运行完成后,切换回到窗口1的mysql会话,再次刷新该表的高速缓存并释放表锁: mysql>FLUSH TABLES; mysql>UNLOCK TABLE;
变量 含义 key _ buffer _ s i z e 用于存放索引块的缓冲区大小 r e a d _ buffer _ s i z e 读操作用的缓冲区大小 sort _ buffer _ s i z e 排序用的缓冲区大小 w r i t e _ buffer _ s i z e 写操作用的缓冲区大小
要想查看任一个程序使用的这些变量的缺省值,可用--help 选项运行该程序。要想指定其他的值,可在该命令上使用--set-variable variable=value 或-O variable=value。您可以将变量的名字简化成key、r e a d、sort 和w r i t e。例如,可告诉myisamchk 使用16MB 的排序缓冲区和1MB 的读写缓冲区,其调用如下: % myisamchk -0 sort=16M -0 read=1M write=1M ... sort _ buffer_size 只能利用--recover 选项来使用(而不是利用- - s a f e _ r e c o ver),在这种情况下,key _ buffer 不能使用。 减少服务器的停机时间 防止服务器访问(您正在处理的)表的另一种方法是在数据目录的外面使用该表文件的拷贝。这样并不能消除交互作用的问题,因为仍然必须防止服务器访问(并可能修改)正在进行拷贝的表。但是,如果您不愿意使服务器脱机的话,该路线可能是使服务器停机时间最小化的一种方法,这对您是有吸引力的。在将该表的文件拷贝到另一个目录时关闭服务器,然后恢复服务器。 myisamchk 的未来打算 myisamchk 的表检查和修复功能打算在MySQL3.23 版本系列的某个时候被合并到服务器中。如果这种打算实现,对表的检查和修复将更容易,因为服务器与my i s a m c h k的交互问题将不再会出现。 同样,您能够告诉服务器在启动时检查表,因此在启动服务器前将不需要设置任何特殊的命令在引导期间执行。该程序不对ISAM 表进行操作,因此在服务器获得表的检修复能力时,应考虑将ISAM 表转换成MyISAM 表。请查看新发行版的MySQL参考指南,了解在此范围内有什么新进展。可以用ALTER TABLE 语句转换表的类型: ALTER TABLE tbl_name TYPE=MYISAM