预防性维护MySQL数据库服务器详解
建立一个预防性维护的时间表,以协助自动检测问题,使得您可以采取措施进行修正:
1) 执行常规的数据库备份并允许更新日志。
2) 安排定期的常规表检查。通过检查表,将减少使用备份的机会。这个工作使用cron 作业(一般从运行服务器所使用的该账号的crontab 文件中调用)并且很容易实现。例如,如果您作为mysqladm 用户运行服务器,则可以从mysqladm 的crontab 文件中建立定期检查。如果您不知道如何使用c r o n,应使用下列命令查看相关的UNIX 人工页:
% man cron
% man crontab
3) 在服务器启动前的系统引导期间检查数据库表。机器可能会因早期的崩溃重新启动。如果是这样的话,数据库表可能已被毁坏,应该对它进行检查。
为了运行自动的表检查,可以编写一个脚本,将目录改变为服务器数据目录并对所有数据库表运行myisamchk 和i s a m c h k。我们将在下面讨论的脚本中同时使用这两个程序。如果您只有MyISAM 表或只有ISAM 表,则只需其中一个程序,可以将无关的那个程序从脚本中去除。
myisamchk 和isamchk 都根据表检查的方式产生某些输出结果以便了解正在检查哪些表,甚至在没有问题时也是如此。对于crontab 的项,除非表中有错误,否则通常将禁止输出结果(如果作业产生任何输出, cron 作业通常生成一个邮件消息,很少会收到没有任何问题的表检查作业的邮件)。如果用--silent 选项调用任一个实用程序,它仅当发现问题时才产生输出。另外,myisamchk 支持--fast 选项,该选项允许程序跳过自上次检查以来没有被修改过的任何表。
在服务器数据目录中检查所有表的一个简单的脚本如下( DATADIR 应该修改成对应您系统的值):
实用此脚本的一个潜在的问题是:如果有许多表,通配符模式‘ * / * . M Y I’或‘* / * . I S M’可能会由于“ too many arg um e n t s(过多的参数)”错误使外壳程序爆炸。另一个可选择的脚本如下(同样,将DATADIR 改变为对应您系统的值):
不论您选择哪种形式的脚本,笔者都假定您调用的是c h e c k _ mysql_ tables,应确保及时改变该方式使它可执行,然后您手工调用它以验证它工作是否正常:
% chmod +x check_mysql_tables
% chmod_mysql_tables
在理想情况下应该没有输出结果。如果系统不支持外部锁定,有可能服务器将在您检查表时改变它。此时,脚本可能会把实际没问题的表报告成有问题的。这有点不幸,但比出现相反的问题要好:当出现某些故障时脚本报告无问题。如果系统支持外部锁定,则该问题就不会出现。
以下部分将说明如何建立脚本,使它通过cron 并在系统启动期间自动执行。在这些小节的例子中,笔者假定脚本安装在/usr/users/mysaladm/bin 中。您将需要调整适合自己系统的值。
如果在您的系统上运行了多个服务器,将需要修改该过程来检查每个服务器数据目录中的表。您可以使用不同的check_mysql_tables 拷贝来进行,或通过修改它来接收一个命令行参数进行,该参数指定了想要检查的数据目录。
用cron 定期检查表
假定要想对mysqladm 用户从crontab 文件中调用脚本c h e c k _ mysql_ tables。先以该用户的身份进行注册,然后用下列命令编辑crontab 文件:
% crontab -e
该命令带您进入带有当前crontab 文件拷贝的编辑器中(如果以前没有编辑过,此文件可能是空的)。增加一行到文件中:
0 3 * * 0 /usr/users/mysqladm/bin/check_mysql_tables
它告诉cron 在每个星期日的上午3 时运行此选项。可以按要求改变时间或安排。有关这些选项的格式,请参阅crontab 人工页。
在系统启动期间检查表
如果您正在使用BSD 风格的系统,并且已经将服务器的启动命令增加到/etc/rc.local 或类似的其他文件中,则可以在启动服务器前从对应的文件中调用c h e c k _ mysql_ tables。
如果正在使用System V 风格的启动方法从/etc/rc.d 目录之一中调用mysql. server,则过程稍有点复杂。这些目录中的启动脚本应该理解start 和stop 参数的含义,以便对系统的启动和关闭采取相应的操作。为了执行表的检查,我们可以编写这样的脚本:当参数为start 时调用c h e c k _ mysql_ tables,而当该参数为stop 时不做任何事情。让我们来调用这样的一个脚本mysql. c h e c k,其内容如下:
现在,您已经可以使用一个过程来安装mysql. c h e c k了,该过程类似于在第11章所介绍的安装mysql.server 的过程。必须给mysql.check 一个运行级目录中较低的前缀号,才能使得它在mysql.server 前运行。例如,如果在运行级目录中以S99mysql.server 链接到mysql. server,则应该以S98mysql.check 链接到mysql.check.