与MYSQL服务器进行协调

  某些管理员操作需要连接Mysql服务器并告诉它去做什么事情.比如说,如果想对某个MyISAM数据表进行数据完整性检查或者修复,一中做法是发出CHECK TABLE或REPAIR TABLE语句让Mysql服务器去做这项工作,即让Mysql服务器去访问代表着这个数据表的.frm,.MYD和.MYI文件.一般说来,这种做法是最好的.让Mysql服务器去执行这类操作的好处是数据表上的读写动作将由它来协调,用不着你去操心.

  检查或者修复MyISAM数据表的另一种做法是执行myisamchk工具程序.但myisamchk程序将直接访问有关的数据表文件,有关操作不再通过Mysql服务器进行,这就需要由Mysql管理员来协调数据表上的读写动作.在myisamchk程序对某个数据表进行处理的同时,你必须阻止Mysql服务器去修改这个数据表.如果不这样做,数据表就可能因为myisamchk程序和Mysql服务器发生竞争而遭到破坏甚至无法继续使用.很明显,让Mysql服务器和myisamchk程序同时对一个数据表进行写操作是不好的,但即使它们是一个在读而另一个在写也是不好的--正好读取数据表文件的程序会因为另一个程序对数据表的修改而被弄糊涂.

  这种问题也会发生在其他场合.比如说,有些备份技术需要制作数据表文件的拷贝,而要想保证备份文件的一致性,就必须防止Mysql服务器在备份工作进行过程中去修改有关数据表的内容.再比如说,有些恢复技术需要用备份出来的拷贝去更换被破坏的数据表,在这种情况下,必须阻止Mysql服务器去访问正在被恢复的数据表.

  不让Mysql服务器打扰你的办法之一是将它彻底关停,既然没有运行,它当然就不会去访问你正在处理的数据表.但Mysql管理员通常都不太愿意把自己负责的Mysql服务器彻底关停,因为这讲使其它的数据库和数据表都不可用.本节所描述的步骤将帮助你对正在运行着的Mysql服务器和你正在使用的外部程序做好协调,让它们不会互相干扰.

  要想与Mysql服务器进行协调,就必须要用到某种锁定机制.Mysql服务器本身带有两种锁定机制:

  内部锁定机制,用来防止来自不同客户程序的查询请求互相混杂和干扰--比如防止来自某个客户程序的select查询不会被来自另一个客户程序的update查询打断.

  外部锁定机制,用来防止别的程序在它正在使用某些数据表文件的同时去修改这些文件.Mysql服务器的外部锁定机制是以你的操作系统在文件系统级的锁定能力为基础的.人们给Mysql服务器加上外部锁定机制的理由就是为了让它能够与诸如myisamchk之类的工具程序在数据表检查操作期间进行协调.然而,Mysql服务器的外部锁定机制在某些系统上工作的不太可靠---既然不能依赖外部锁定机制,就只能用它的内部锁定机制来谋求协调了.此外,Mysql服务器的外部锁定机制只能用来与那些不需要往数据表文件里写入数据的操作进行协调;如果某个操作既要读数据表文件又要写数据表文件,Mysql服务器的外部锁定机制就帮不上忙了.(比如说,如果你正在修复某个数据表而不是在检查它,就应该使用Mysql服务器的内部锁定机制.)

  本节所介绍的方法仅适用于那些把不同的数据表分别表示为一组相关文件的数据表类型(比如MyISAM,BDB和ISAM数据表),它不适用于InnoDB,因为所有的InnoDB数据表都被保存在构成InnoDB表空间的同一组文件里。