千万个美丽的未来,抵不上一个温暖的现在,每一个真实的现在,都是我们曾经幻想的未来!
Mar
14
MySQL server has gone away错误
本小节也涉及有关Lost connection to server during query的错误。
对MySQL server has gone away错误最常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 8个小时后关闭连接。你可在启动mysqld时通过设置wait_timeout变量改变时间限制。
你可以通过执行mysqladmin version并且检验正常运行的时间来检查MySQL还没死掉。
如果你有一个脚本,你只须再发出查询让客护进行一次自动的重新连接。
在这种请下,你通常能获得下列错误代码(你得到的是OS相关的):
CR_SERVER_GONE_ERROR 客户不能发送一个问题给服务器。
CR_SERVER_LOST 当写服务器时,客户没有出错,但是它没有得到对问题的一个完整的答案(或任何答案)。
如果你向服务器发送不正确的或太大的查询,你也可能得到这些错误。如果mysqld得到一个太大或不正常的包,它认为客户出错了并关闭连接。如果你需要较大的查询(例如,如果你正在处理较大的BLOB列),你可以使用-O max_allowed_packet=#选项(缺省1M)启动mysqld以增加查询限制。多余的内存按需分配,这样mysqld只有在你发出较大差询时或mysqld必须返回较大的结果行时,才使用更多的内存!
Can't connect to [local] MySQL server错误
一个MySQL客户可以两种不同的方式连接mysqld服务器:Unix套接字,它通过在文件系统中的一个文件(缺省“/tmp/mysqld.sock”)进行连接;或TCP/IP,它通过一个端口号连接。Unix套接字比TCP/IP更快,但是只有用在连接同一台计算机上的服务器。如果你不指定主机名或如果你指定特殊的主机名localhost,使用Unix套接字。
错误(2002)Can't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。
由检查(使用ps)在你的服务器上有一个名为mysqld的进程启动!如果没有任何mysqld过程,你应该启动一个。见4.15.2 启动MySQL服务器的问题。
如果一个mysqld过程正在运行,你可以通过尝试这些不同的连接来检查服务器(当然,端口号和套接字路径名可能在你的安装中是不同的):
shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --socket=/tmp/mysql.sock version
注意hostname命令使用反引号“`”而非正引号“'”;这些导致hostname输出(即,当前主机名)被代替进mysqladmin命令中。
这是可能造成Can't connect to local MySQL server错误的一些原因:
mysqld不在运行。
你正在使用MIT-pthreads的一个系统上运行。如果正在运行在一个没有原生线程的系统上,mysqld使用 MIT-pthreads 软件包。见4.2 由MySQL支持的操作系统。然而,MIT-pthreads不支持Unix套接字,因此当与服务器连接时,在这样一个系统上,你总是必须明确地指定主机名。试试使用这个命令检查到服务器的连接:
shell> mysqladmin -h `hostname` version
某人删除了mysqld使用的Unix套接字(缺省“/tmp/mysqld.sock”)。你可能有一个cron任务删除了MySQL套接字(例如,一个把旧文件从“/tmp”目录中删除的任务)。你总是可以运行mysqladmin version并且检查mysqladmin正在试图使用的套接字确实存在。在这种情况下,修复方法是删除cron任务而不删除“mysqld.sock 或将套接字放在其他地方。你能用这个命令在MySQL配置时指定一个不同的套接字地点:
shell> ./configure --with-unix-socket-path=/path/to/socket
你也可以使用--socket=/path/to/socket选项启动safe_mysqld和在启动你的MySQL客户前设置环境变量MYSQL_UNIX_PORT为套接字路径名。你可用--socket=/path/to/socket选项启动mysqld服务器。如果你改变了服务器的套接字路径名,你也必须通知MySQL客户关于新路径的情况。你可以通过设置环境变量MYSQL_UNIX_PORT为套接字路径名或由提供套接字路径名作为客户的参数做到。你可用这个命令测试套接字:
shell> mysqladmin --socket=/path/to/socket version
你正在使用 Linux和线程已经死了(核心倾倒了)。在这种情况中,你必须杀死其它mysqld线程(例如在启动一个新的MySQL服务器之前,可以用mysql_zap脚本)。见18.1 如果MySQL总是崩溃怎么办。
如果你得到错误Can't connect to MySQL server on some_hostname,你可以尝试下列步骤找出问题是什么:
通过执行telnet your-host-name tcp-ip-port-number并且按几次回车来检查服务器是否正常运行。如果有一个MySQL运行在这个端口上,你应该得到一个包含正在运行的MySQL服务器的版本号的应答。如果你得到类似于telnet: Unable to connect to remote host: Connection refused的一个错误,那么没有服务器在使用的端口上运行。
尝试连接本地机器上的mysqld守护进程,并用mysqladmin variables检查mysqld被配置使用的TCP/IP端口(变量port)。
检查你的mysqld服务器没有用--skip-networking选项启动。
Host '...' is blocked错误
如果你得到象这样的一个错误:
Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
这意味着,mysqld已经得到了大量(max_connect_errors)的主机'hostname'的在中途被中断了的连接请求。在max_connect_errors次失败请求后,mysqld认定出错了(象来字一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令mysqladmin flush-hosts。
缺省地,mysqld在10个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它:
shell> safe_mysqld -O max_connect_errors=10000 &
注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的TCP/IP连接有没有问题。如果你的TCP/IP连接不在运行,增加max_connect_errors变量的值对你也不会有帮助!
Too many connections错误
如果在你试土连接MySQL时,你得到错误Too many connections,这意味着已经有max_connections个客户连接了mysqld服务器。
如果你需要比缺省(100)更多的连接,那么你应该重启mysqld,用更大的 max_connections 变量值。
注意,mysqld实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用Process权限的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且使用SHOW PROCESSLIST找出什么可能出错。见7.21 SHOW句法(得到表,列的信息)。
Out of memory错误
如果你发出查询并且得到类似于下面的错误:
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
注意,错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。
为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这样,你可以使用mysql --quick,它使用mysql_use_result()检索结果集合。这将较少的负担放在了客户端(只是服务器更多)。
Packet too large错误
当一个MySQL客户或mysqld服务器得到一个比max_allowed_packet个字节长的包,它发出一个Packet too large错误并终止连接。
如果你正在使用mysql客户,你可以通过用mysql --set-variable=max_allowed_packet=8M指定一个更大的缓冲区来启动客户程序。
如果你正在使用不允许你指定最大包大小的其他客户(例如 DBI),你需要在你启动服务器时设置包大小。你可以使用mysqld的命令行选项设置max_allowed_packet为一个更大的尺寸。例如,如果你正期望将一个全长的BLOB存入一张表中,你将需要用--set-variable=max_allowed_packet=24M选项来启动服务器。
The table is full错误
这个错误发生在内存临时表变得比tmp_table_size字节大时。为了避免这个问题,你可以使用mysqld的-O tmp_table_size=#选项来增加临时表的大小,或在你发出有疑问的查询之前使用SQL选项SQL_BIG_TABLES。见7.25 SET OPTION句法。
你也可以使用--big-tables选项启动mysqld。这与为所有查询使用SQL_BIG_TABLES完全相同。
Commands out of sync in client错误
如果你在你的客户代码中得到Commands out of sync; You can't run this command now,你正在以错误的次序调用客户函数!
这可能发生,例如,如果你正在使用mysql_use_result()并且在你已经调用了mysql_free_result()之前试图执行新查询。如果你在mysql_use_result()或mysql_store_result()之间试图执行返回数据的2个查询,它也可能发生。
Ignoring user错误
如果你得到下列错误:
Found wrong password for user: 'some_user@some_host'; Ignoring user
这意味着在mysqld启动时或在它再次装载权限表时,它在user表中找到了一个有一个无效口令的条目。结果,条目简单地被权限系统忽略。
可能导致这个问题的原因和修正:
你可能正在运行一个有一个老的user表的新版本mysqld。你可以通过执行mysqlshow mysql user看看口令字段是否少于 16个字符来检查它。如果是这样,你可以通过运行scripts/add_long_password脚本改正这种情况。
用户有一个老式的口令(8个字符长)并且你没使用--old-protocol选项启动mysqld。用一个新口令更新在user表中的用户或用--old-protocol重启mysqld。
你没有使用PASSWORD()函数在在user表中指定了一个口令。使用mysql以一个新口令更新在user表中的用户。确保使用PASSWORD()函数:
mysql> update user set password=PASSWORD('your password')
where user='XXX';
Table 'xxx' doesn't exist错误
如果你得到错误Table 'xxx' doesn't exist或Can't find file: 'xxx' (errno: 2),这意味着在当前数据库中没有名为xxx的表存在。
注意,因为MySQL使用目录和文件存储数据库和表,数据库和表名件是区分大小写的!(在Win32上,数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!)
你可以用SHOW TABLES检查你在当前数据库中有哪个表。
本小节也涉及有关Lost connection to server during query的错误。
对MySQL server has gone away错误最常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 8个小时后关闭连接。你可在启动mysqld时通过设置wait_timeout变量改变时间限制。
你可以通过执行mysqladmin version并且检验正常运行的时间来检查MySQL还没死掉。
如果你有一个脚本,你只须再发出查询让客护进行一次自动的重新连接。
在这种请下,你通常能获得下列错误代码(你得到的是OS相关的):
CR_SERVER_GONE_ERROR 客户不能发送一个问题给服务器。
CR_SERVER_LOST 当写服务器时,客户没有出错,但是它没有得到对问题的一个完整的答案(或任何答案)。
如果你向服务器发送不正确的或太大的查询,你也可能得到这些错误。如果mysqld得到一个太大或不正常的包,它认为客户出错了并关闭连接。如果你需要较大的查询(例如,如果你正在处理较大的BLOB列),你可以使用-O max_allowed_packet=#选项(缺省1M)启动mysqld以增加查询限制。多余的内存按需分配,这样mysqld只有在你发出较大差询时或mysqld必须返回较大的结果行时,才使用更多的内存!
Can't connect to [local] MySQL server错误
一个MySQL客户可以两种不同的方式连接mysqld服务器:Unix套接字,它通过在文件系统中的一个文件(缺省“/tmp/mysqld.sock”)进行连接;或TCP/IP,它通过一个端口号连接。Unix套接字比TCP/IP更快,但是只有用在连接同一台计算机上的服务器。如果你不指定主机名或如果你指定特殊的主机名localhost,使用Unix套接字。
错误(2002)Can't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。
由检查(使用ps)在你的服务器上有一个名为mysqld的进程启动!如果没有任何mysqld过程,你应该启动一个。见4.15.2 启动MySQL服务器的问题。
如果一个mysqld过程正在运行,你可以通过尝试这些不同的连接来检查服务器(当然,端口号和套接字路径名可能在你的安装中是不同的):
shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --socket=/tmp/mysql.sock version
注意hostname命令使用反引号“`”而非正引号“'”;这些导致hostname输出(即,当前主机名)被代替进mysqladmin命令中。
这是可能造成Can't connect to local MySQL server错误的一些原因:
mysqld不在运行。
你正在使用MIT-pthreads的一个系统上运行。如果正在运行在一个没有原生线程的系统上,mysqld使用 MIT-pthreads 软件包。见4.2 由MySQL支持的操作系统。然而,MIT-pthreads不支持Unix套接字,因此当与服务器连接时,在这样一个系统上,你总是必须明确地指定主机名。试试使用这个命令检查到服务器的连接:
shell> mysqladmin -h `hostname` version
某人删除了mysqld使用的Unix套接字(缺省“/tmp/mysqld.sock”)。你可能有一个cron任务删除了MySQL套接字(例如,一个把旧文件从“/tmp”目录中删除的任务)。你总是可以运行mysqladmin version并且检查mysqladmin正在试图使用的套接字确实存在。在这种情况下,修复方法是删除cron任务而不删除“mysqld.sock 或将套接字放在其他地方。你能用这个命令在MySQL配置时指定一个不同的套接字地点:
shell> ./configure --with-unix-socket-path=/path/to/socket
你也可以使用--socket=/path/to/socket选项启动safe_mysqld和在启动你的MySQL客户前设置环境变量MYSQL_UNIX_PORT为套接字路径名。你可用--socket=/path/to/socket选项启动mysqld服务器。如果你改变了服务器的套接字路径名,你也必须通知MySQL客户关于新路径的情况。你可以通过设置环境变量MYSQL_UNIX_PORT为套接字路径名或由提供套接字路径名作为客户的参数做到。你可用这个命令测试套接字:
shell> mysqladmin --socket=/path/to/socket version
你正在使用 Linux和线程已经死了(核心倾倒了)。在这种情况中,你必须杀死其它mysqld线程(例如在启动一个新的MySQL服务器之前,可以用mysql_zap脚本)。见18.1 如果MySQL总是崩溃怎么办。
如果你得到错误Can't connect to MySQL server on some_hostname,你可以尝试下列步骤找出问题是什么:
通过执行telnet your-host-name tcp-ip-port-number并且按几次回车来检查服务器是否正常运行。如果有一个MySQL运行在这个端口上,你应该得到一个包含正在运行的MySQL服务器的版本号的应答。如果你得到类似于telnet: Unable to connect to remote host: Connection refused的一个错误,那么没有服务器在使用的端口上运行。
尝试连接本地机器上的mysqld守护进程,并用mysqladmin variables检查mysqld被配置使用的TCP/IP端口(变量port)。
检查你的mysqld服务器没有用--skip-networking选项启动。
Host '...' is blocked错误
如果你得到象这样的一个错误:
Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
这意味着,mysqld已经得到了大量(max_connect_errors)的主机'hostname'的在中途被中断了的连接请求。在max_connect_errors次失败请求后,mysqld认定出错了(象来字一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令mysqladmin flush-hosts。
缺省地,mysqld在10个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它:
shell> safe_mysqld -O max_connect_errors=10000 &
注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的TCP/IP连接有没有问题。如果你的TCP/IP连接不在运行,增加max_connect_errors变量的值对你也不会有帮助!
Too many connections错误
如果在你试土连接MySQL时,你得到错误Too many connections,这意味着已经有max_connections个客户连接了mysqld服务器。
如果你需要比缺省(100)更多的连接,那么你应该重启mysqld,用更大的 max_connections 变量值。
注意,mysqld实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用Process权限的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且使用SHOW PROCESSLIST找出什么可能出错。见7.21 SHOW句法(得到表,列的信息)。
Out of memory错误
如果你发出查询并且得到类似于下面的错误:
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
注意,错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。
为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这样,你可以使用mysql --quick,它使用mysql_use_result()检索结果集合。这将较少的负担放在了客户端(只是服务器更多)。
Packet too large错误
当一个MySQL客户或mysqld服务器得到一个比max_allowed_packet个字节长的包,它发出一个Packet too large错误并终止连接。
如果你正在使用mysql客户,你可以通过用mysql --set-variable=max_allowed_packet=8M指定一个更大的缓冲区来启动客户程序。
如果你正在使用不允许你指定最大包大小的其他客户(例如 DBI),你需要在你启动服务器时设置包大小。你可以使用mysqld的命令行选项设置max_allowed_packet为一个更大的尺寸。例如,如果你正期望将一个全长的BLOB存入一张表中,你将需要用--set-variable=max_allowed_packet=24M选项来启动服务器。
The table is full错误
这个错误发生在内存临时表变得比tmp_table_size字节大时。为了避免这个问题,你可以使用mysqld的-O tmp_table_size=#选项来增加临时表的大小,或在你发出有疑问的查询之前使用SQL选项SQL_BIG_TABLES。见7.25 SET OPTION句法。
你也可以使用--big-tables选项启动mysqld。这与为所有查询使用SQL_BIG_TABLES完全相同。
Commands out of sync in client错误
如果你在你的客户代码中得到Commands out of sync; You can't run this command now,你正在以错误的次序调用客户函数!
这可能发生,例如,如果你正在使用mysql_use_result()并且在你已经调用了mysql_free_result()之前试图执行新查询。如果你在mysql_use_result()或mysql_store_result()之间试图执行返回数据的2个查询,它也可能发生。
Ignoring user错误
如果你得到下列错误:
Found wrong password for user: 'some_user@some_host'; Ignoring user
这意味着在mysqld启动时或在它再次装载权限表时,它在user表中找到了一个有一个无效口令的条目。结果,条目简单地被权限系统忽略。
可能导致这个问题的原因和修正:
你可能正在运行一个有一个老的user表的新版本mysqld。你可以通过执行mysqlshow mysql user看看口令字段是否少于 16个字符来检查它。如果是这样,你可以通过运行scripts/add_long_password脚本改正这种情况。
用户有一个老式的口令(8个字符长)并且你没使用--old-protocol选项启动mysqld。用一个新口令更新在user表中的用户或用--old-protocol重启mysqld。
你没有使用PASSWORD()函数在在user表中指定了一个口令。使用mysql以一个新口令更新在user表中的用户。确保使用PASSWORD()函数:
mysql> update user set password=PASSWORD('your password')
where user='XXX';
Table 'xxx' doesn't exist错误
如果你得到错误Table 'xxx' doesn't exist或Can't find file: 'xxx' (errno: 2),这意味着在当前数据库中没有名为xxx的表存在。
注意,因为MySQL使用目录和文件存储数据库和表,数据库和表名件是区分大小写的!(在Win32上,数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!)
你可以用SHOW TABLES检查你在当前数据库中有哪个表。
Mar
14
理想的情况是,MySQL从首次安装以来始终平稳地运行。但有时确实会由于各种原因而出现问题,其范围可以从电源断电到硬件故障到不正常地关闭MySQL服务器(如用kill -9 终止服务器或机器崩溃)。诸如这样的情况大部分都超出您的控制范围,它们会导致数据库表的毁坏,尤其是在对表进行修改且未完全写入时所引起的。
本章的重点是检测和解决表的问题,而不论问题是如何引起的。对于表的检查和修复,MySQL管理员最好的朋友是myisamchk 和isamchk 实用程序。这两个程序有好几个功能,我们已经在第4章讨论了怎样使用它们执行索引键的分布分析和索引的释放与激活。还可以使用它们检查表和修复有问题的表。这使您能在表变坏之前(使表不能使用之前)修正故障。
myisamchk 和isamchk 提供的全部选项的清单在附录E 中。有关其他的背景,请参阅MySQL参考指南的“维护MySQL安装”一章。
表的故障检测和修正的一般过程如下:
1) 检查出错的表。如果该表检查通过,则完成任务,否则必须修复它。
2) 在开始修复之前对表文件进行拷贝,以防万一。
3) 试着修复表。
4) 如果修复操作失败,从数据库备份和更新日志中恢复此表。
上述过程的最后一步假定您已经执行了数据库备份并允许更新日志有效。如果不是这样的话,系统将有危险。参考第11章查找一下怎样使用mysqlaump 和怎样开启更新日志。您肯定不想不可挽回地丢失一个表,因此,应努力地做备份。
在使用myisamchk 或isamchk 检查或修复表之前,应该满足一些初步需求:
建立常规的数据库备份过程并允许更新日志,以防事情越来越糟使表的毁坏不能修复。笔者好像在以前提醒过这一点?
在开始试验之前应先仔细地阅读本章的内容。尤其是不应该在阅读“避免与MySQL服务器交互作用”之前进行操作,因为它将讨论当您试图在一个表上执行检查或修复过程时服务器正在使用这个表所引起的问题。它还讨论怎样在服务器运行时防止那些问题发生。
当运行表检查或修复时,您应该被注册在运行mysql的账号下,因为您需要对表文件读写访问。
myisamchk 和isamchk 的调用语法
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 报告表有错误,应用下节中的说明修复它们。
修复表
表的修复是一项可怕的工作,如果具体问题非常独特则更难进行。然而,有一些常规的指导思想和过程,可以遵循它们来增加修正表的机会。通常,开始时可以用最快的修复方法,看看是否能修正故障。如果发现不行的话,可以逐步升级到更彻底的(但更慢的)修复方法上,直到故障被修复或您不能继续升级为止(实际上,大多数问题不用更大规模的和更慢的方法就能修正)。如果表不能修复,则从备份中恢复该表。有关使用备份文件和更新日志进行恢复的指导在已第11章中给出。
1. 执行标准的表修复
为了修复一个表,执行下列步骤:
1) 试着用--recover 选项修正表,但也可以用--quick 选项试图只根据索引文件的内容进行恢复。这样将不触及数据文件:
% myisamchk --recover --quick tbl_name
% isamchk --recover --quick tbl_name
2) 如果问题仍存在,再试一下上一步的命令,但忽略--quick 选项,以允许my i s a m c h k或isamchk 前进并修改数据文件:
% myisamchk --recover tbl_name
% isamchk --recover tbl_name
3) 如果还不工作,试一试--safe-recover 修复方法。这种方法比普通的恢复方法要慢,但能够修正-recover 方法不能修正的几个问题:
% myisamchk --safe-recover tbl_name
% isamchk --safe-recover tbl_name
如果myisamchk 或isamchk 由于一个“C a n’t create new temp file: file_name” 的错误消息在任何一步中停止,应该重复这个命令并增加--force 选项以迫使清除临时文件。这个临时文件可能是从上一次失败的修复中留下的。
在修复表之前拷贝它们在执行表修复前应该遵循的一个常规的预防措施是做该表的新拷贝。这种情况未必出现,但如果发生,则可以从拷贝文件中做该表的新的拷贝并试试另一种恢复方法。
2. 标准表修复方法失败时怎么办
如果标准的修复过程未能修复表,则索引文件可能在修复时丢失或毁坏。尽管未必可能,但还是有可能使表的描述文件丢失。不论哪种情况,都需要替换受影响的文件,然后再试试标准修复过程。
为了重新生成索引文件,可以使用下列过程:
1) 定位到包含崩溃表的数据库目录中。
2) 将该表的数据文件移到安全的地方。
3) 调用mysql并通过执行下列语句重新创建新的空表,该语句使用表的描述文件tbl_name.frm 重新开始生成新的数据和索引文件:
mysql> Delete FROM tbl_name;
4) 退出mysql,将原始的数据文件移回到数据库目录中,替换刚建立的新的空文件。
5) 再试试标准表修复方法。
为了恢复该表的描述文件,可先从备份文件中恢复,然后再试着用标准修复方法。如果由于某些原因没有备份,但知道建立表的Create TABLE 语句,则仍可以恢复该文件:
1) 定位到包含崩溃表的数据库目录中。
2) 将该表的数据文件移动到安全的地方。如果想要使用索引的话,还需将索引文件移走。
3) 调用mysql并发布Create TABLE 语句建立该表。
4) 退出mysql,将原始数据文件移回数据库目录中,替换刚才新建的数据文件。如果在步骤2移动了索引文件,则也要将其移回数据库目录中。
5) 再试试标准表修复方法。
避免与MySQL服务器交互作用
当您正在运行表的检查/修复实用程序时,您或许不想让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;
快速运行myisamchk 和i s a m c h k
myisamchk 和isamchk 的运行可能会花很长时间,尤其是您正在处理一个大表或使用一个更广泛的检查或修复方法时。通过告诉这些程序在运行时使用更多的内存,能够提高它们的速度。这两个实用程序都有几个可设置的操作参数。其中最重要的是控制程序使用的缓冲
区大小的变量:
变量 含义
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
本章的重点是检测和解决表的问题,而不论问题是如何引起的。对于表的检查和修复,MySQL管理员最好的朋友是myisamchk 和isamchk 实用程序。这两个程序有好几个功能,我们已经在第4章讨论了怎样使用它们执行索引键的分布分析和索引的释放与激活。还可以使用它们检查表和修复有问题的表。这使您能在表变坏之前(使表不能使用之前)修正故障。
myisamchk 和isamchk 提供的全部选项的清单在附录E 中。有关其他的背景,请参阅MySQL参考指南的“维护MySQL安装”一章。
表的故障检测和修正的一般过程如下:
1) 检查出错的表。如果该表检查通过,则完成任务,否则必须修复它。
2) 在开始修复之前对表文件进行拷贝,以防万一。
3) 试着修复表。
4) 如果修复操作失败,从数据库备份和更新日志中恢复此表。
上述过程的最后一步假定您已经执行了数据库备份并允许更新日志有效。如果不是这样的话,系统将有危险。参考第11章查找一下怎样使用mysqlaump 和怎样开启更新日志。您肯定不想不可挽回地丢失一个表,因此,应努力地做备份。
在使用myisamchk 或isamchk 检查或修复表之前,应该满足一些初步需求:
建立常规的数据库备份过程并允许更新日志,以防事情越来越糟使表的毁坏不能修复。笔者好像在以前提醒过这一点?
在开始试验之前应先仔细地阅读本章的内容。尤其是不应该在阅读“避免与MySQL服务器交互作用”之前进行操作,因为它将讨论当您试图在一个表上执行检查或修复过程时服务器正在使用这个表所引起的问题。它还讨论怎样在服务器运行时防止那些问题发生。
当运行表检查或修复时,您应该被注册在运行mysql的账号下,因为您需要对表文件读写访问。
myisamchk 和isamchk 的调用语法
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 报告表有错误,应用下节中的说明修复它们。
修复表
表的修复是一项可怕的工作,如果具体问题非常独特则更难进行。然而,有一些常规的指导思想和过程,可以遵循它们来增加修正表的机会。通常,开始时可以用最快的修复方法,看看是否能修正故障。如果发现不行的话,可以逐步升级到更彻底的(但更慢的)修复方法上,直到故障被修复或您不能继续升级为止(实际上,大多数问题不用更大规模的和更慢的方法就能修正)。如果表不能修复,则从备份中恢复该表。有关使用备份文件和更新日志进行恢复的指导在已第11章中给出。
1. 执行标准的表修复
为了修复一个表,执行下列步骤:
1) 试着用--recover 选项修正表,但也可以用--quick 选项试图只根据索引文件的内容进行恢复。这样将不触及数据文件:
% myisamchk --recover --quick tbl_name
% isamchk --recover --quick tbl_name
2) 如果问题仍存在,再试一下上一步的命令,但忽略--quick 选项,以允许my i s a m c h k或isamchk 前进并修改数据文件:
% myisamchk --recover tbl_name
% isamchk --recover tbl_name
3) 如果还不工作,试一试--safe-recover 修复方法。这种方法比普通的恢复方法要慢,但能够修正-recover 方法不能修正的几个问题:
% myisamchk --safe-recover tbl_name
% isamchk --safe-recover tbl_name
如果myisamchk 或isamchk 由于一个“C a n’t create new temp file: file_name” 的错误消息在任何一步中停止,应该重复这个命令并增加--force 选项以迫使清除临时文件。这个临时文件可能是从上一次失败的修复中留下的。
在修复表之前拷贝它们在执行表修复前应该遵循的一个常规的预防措施是做该表的新拷贝。这种情况未必出现,但如果发生,则可以从拷贝文件中做该表的新的拷贝并试试另一种恢复方法。
2. 标准表修复方法失败时怎么办
如果标准的修复过程未能修复表,则索引文件可能在修复时丢失或毁坏。尽管未必可能,但还是有可能使表的描述文件丢失。不论哪种情况,都需要替换受影响的文件,然后再试试标准修复过程。
为了重新生成索引文件,可以使用下列过程:
1) 定位到包含崩溃表的数据库目录中。
2) 将该表的数据文件移到安全的地方。
3) 调用mysql并通过执行下列语句重新创建新的空表,该语句使用表的描述文件tbl_name.frm 重新开始生成新的数据和索引文件:
mysql> Delete FROM tbl_name;
4) 退出mysql,将原始的数据文件移回到数据库目录中,替换刚建立的新的空文件。
5) 再试试标准表修复方法。
为了恢复该表的描述文件,可先从备份文件中恢复,然后再试着用标准修复方法。如果由于某些原因没有备份,但知道建立表的Create TABLE 语句,则仍可以恢复该文件:
1) 定位到包含崩溃表的数据库目录中。
2) 将该表的数据文件移动到安全的地方。如果想要使用索引的话,还需将索引文件移走。
3) 调用mysql并发布Create TABLE 语句建立该表。
4) 退出mysql,将原始数据文件移回数据库目录中,替换刚才新建的数据文件。如果在步骤2移动了索引文件,则也要将其移回数据库目录中。
5) 再试试标准表修复方法。
避免与MySQL服务器交互作用
当您正在运行表的检查/修复实用程序时,您或许不想让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;
快速运行myisamchk 和i s a m c h k
myisamchk 和isamchk 的运行可能会花很长时间,尤其是您正在处理一个大表或使用一个更广泛的检查或修复方法时。通过告诉这些程序在运行时使用更多的内存,能够提高它们的速度。这两个实用程序都有几个可设置的操作参数。其中最重要的是控制程序使用的缓冲
区大小的变量:
变量 含义
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
Mar
5
经过半天的努力终于将JSP+PHP+apache+resin在LINUX平台下全部配置完毕并完全整和通过测试成功
http://www.dfmqp.cn
本人的全部安装过程提供给LINUX爱好者共同分享,需要软件如下
resin:http://www.caucho.com/
jdk:http://java.sun.com/
apache:http://www.apache.org
mysql:http://www.mysql.com
php:http://www.php.net
jdbc:http://mmmysql.sourceforge.net/
本人所用的软件版本如下:
resin-3.0.10.tar.gz
j2sdk-1_4_2_05-linux-i586.bin
httpd-2.0.52.tar.gz
mysql-4.1.9.tar.gz
php-4.3.10.tar.gz
mysql-connector-java-3.1.6.tar.gz
一.安装MYSQL
我把他全部下在到/root 目录下
# chmod 755 mysql-4.1.9.tar.gz
# tar xfz mysql-4.1.9.tar.gz
解压后生成mysql-4.1.9目录,我们进入该目录:
cd mysql-4.1.9
进入后就开始配置mysql了,配置过程中我们要给mysql设置一个安装目录,我们设置在 /usr/local/mysql 下,以为把文件放到一个地方比较容易管理,如果你还想获得更多的配置信息,使用 ./configure --help:
在这里我要特别强调在 编译的时候要选择好MYSQL的默认编码,因为如果不选择按默认安装的时候在JSP中就不支持GBK编码了
所以我这样编译
# ./configure --prefix=/usr/local/mysql --with-charset=gbk
然后等几秒钟,配置完成后就编译源代码
# make
这个编译的过程比较长,如果机器比较慢的话,可能要近二十分种 ( 我的是联想服务器都需要了15分钟 ) . 编译完成后就安装:
# make install
等上几秒钟,安装完成.下面就到了最关键的部分了,为什么老安装不成功,(至少我是安装了N次,N > 10 ,呵呵),问题关键就在这里,访问mysql要一个专门的用户,而且必须给相应的访问权限,这里我们就设置root和mysql有权限访问.
我们先建立一个mysql和mysql用户来访问mysql:
# groupadd mysql #建立mysql组
# useradd mysql -g mysql #建立mysql用户并且加入到mysql组中
建立用户后我们就初始化表 (注意:必须先执行本步骤后才能进行以下步骤)
# ./scripts/mysql_install_db --user=mysql #初试化表并且规定用mysql用户来访问初始化表以后就开始给mysql和root用户设定访问权限, 我们先到安装mysql的目录:
# cd /usr/local/mysql
然后设置权限
# chown -R root . #设定root能访问/usr/local/mysql
# chown -R mysql var #设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件
# chown -R mysql var/. #设定mysql用户能访问/usr/local/mysql/var下的所有文件
# chown -R mysql var/mysql/. #设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件
# chgrp -R mysql . #设定mysql组能够访问/usr/local/mysql
设置完成后,基本上就装好了,好了,我们运行一下我们的mysql:
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
如果没有问题的话,应该会出现类似这样的提示:
[1] 42264
# Starting mysqld daemon with databases from /usr/local/mysql/var
这就证明你安装成功了
用如下命令修改MYSQL密码,默认安装密码为空,为了安全你必须马上修改
/usr/local/mysql/bin/mysqladmin -uroot password pengyong
现在修改的密码为:pengyong
二、安装jdk
# chmod 755 j2sdk-1_4_2_05-linux-i586.bin
# ./j2sdk-1_4_2_05-linux-i586.bin 释放j2sdk-1_4_2_05-linux-i586.bin
在/root目录下生成j2sdk1.4.2_05目录和文件我是将JDK装到/usr/java/目录下
将文件剪切到/usr/java/目录下
# mv j2sdk1.4.2_05/ /usr/java/
设置JDK变量环境
# vi /etc/profile
# /etc/profile
JAVA_HOME=/usr/java/j2sdk1.4.2_05
RESIN_HOME=/usr/resin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/htmlco
nverter.jar:$RESIN_HOME/lib:/usr/java/jdbc/mysql-connector-java-3.1.6-bin.jar
退出当前登录的环境,重新登录,这样刚刚设定的环境变量就会生效,然后用如下命令测试:
[root@LINUX root]# echo $JAVA_HOME
/usr/java/j2sdk1.4.2_05
[root@LINUX root]# echo $CLASSPATH
.:/usr/java/j2sdk1.4.2_05/lib/dt.jar:/usr/java/j2sdk1.4.2_05/lib/tools.jar:/usr/
java/j2sdk1.4.2_05/lib/htmlconverter.jar:/usr/resin/lib:/usr/java/jdbc/mysql-con
nector-java-3.1.6-bin.jar
[root@LINUX root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi
n:/usr/local/sbin:/usr/bin/X11:/usr/java/j2sdk1.4.2_05/bin:/usr/X11R6/bin:/root/
bin
[root@LINUX root]# java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
看到类似信息就表示jdk环境已经好了。其实在上面的/etc/profile中,我们不仅仅设置了jdk的环境变量,还一并设置了resin和jdbc的环境变量,这些都是后面安装resin所必需的设定
三、安装mysql的jdbc
# tar xfz mysql-connector-java-3.1.6.tar.gz
# mv mysql-standard-4.0.23-pc-linux-i686/ /usr/java/ 将解压的文件剪切到/usr/java/目录下。
# cd /usr/java/
# ln -s mysql-standard-4.0.23-pc-linux-i686/ jdbc 创建JDBC的软连接与/usr/java/目录下
四、安装apache
# chmod 755 httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
开始配置APACHE
# ./configure --prefix=/usr/java/httpd2 --enable-module=most --enable-shared=max
察看编译进apache的模块:
#/usr/java/httpd2/bin/httpd -l
[root@LINUX root]# /usr/java/httpd2/bin/httpd -l
compiled-in modules:
http_core.c
mod_so.c
看到以上的信息表明apache支持dso方式了。这样就可以用dso的方式把php和resin的模块加进来。
五、安装php
我们使用的PHP版本是4.3.10,先去下载: http://www.php.net/downloads.php, 下回来的包叫做 php-4.3.10.tar.gz, 放到/usr/local/src目录下.
首先进入该目录后解压缩:
# cd /usr/local/src
# tar xfz php-4.3.10.tar.gz
解压后进入目录:
# cd php-4.3.10
进行配置,这一步比较关键,一定要设置好,特别是要考虑到你要支持什么,比如GD库,xml,mysql等等,如果想知道详细的配置,执行 ./configure --help来获得:
# ./configure --with-mysql=/usr/java/mysql --with-apxs=/usr/java/httpd2/bin/apxs
果上面的配置没有错误的话,那么应该最后会显示感谢使用PHP等字样,那么证明配置成功,如果上面的配置选项不支持的话,会提示错误.
比如你没有安装mysql,那么--with-mysql就无法使用,所以一定要注意对应选项系统是否能够支持,如果出现错误,那么就先安装对应的程序,或者去掉相关选项,配置之后就进行编译:
# make
编译成功后出现"Build complete."字样,那么就可以进行安装了:
# make install
安装完成后把/usr/local/src/php-4.3.8/php.ini-dist复制到/usr/local/lib/,并重命名为php.ini
# cp /usr/local/src/php-4.3.10/php.ini-dist /usr/local/lib/php.ini
基本到这里PHP就安装成功了,如果中间出现错误,除了在配置的时候没有选对选项之后一般都不出现错误.
为了让Apache能够直接解析php,我们还要进行一些配置.
# vi /usr/java/httpd/conf/httpd.conf
在httpd.conf文件中,添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
应该将以上两句添加在其他AddType之后。
确保文件中有以下一句话,没有就自己添加在所有LoadModule之后。
LoadModule php4_module modules/libphp4.so
好了,在vi中使用":wq"保存httpd.conf文件,退出vi。启动apache server:
# /usr/java/httpd2/bin/apachectl restart
现在apache就能够运行php了,写个文件测试一下,在/usr/java/httpd2/htdocs目录下,新建一个phpinfo.php文件,
文件中只有一行代码:
<? phpinfo(); ?>
保存此文件, 在你的浏览器中输入http://localhost/phpinfo.php,你应该看到PHP的系统信息。
如果出现错误,比如提示你下灾phpinfo.php,那么apache就是还无法解析php文件,那么请仔细检查以上的操作是否正确.
六.安装resin
下载的resin的安装包解开后应该可以直接单独运行的。笔者将其解开后放到/usr/java/目录下
# tar xfz resin-3.0.10.tar.gz
# mv resin-3.0.10 /usr/java/
# cd /usr/java/
# ln -s resin-3.0.10/ resin
启动resin
# /usr/java/resin/bin/httpd.sh start
现在就能够从http://localhost:8080/上能看到resin的页面,这也就表示单独的resin运行成功了。然后,为了整合resin和apache,我们需要重新编译一下,以生成mod_caucho给apache调用。
# cd /usr/java/resin
# ./configure --with-apache=/usr/java/httpd2
# make
# make install
修改/usr/java/resin/conf/resin.conf,大约在最后(安装的resin版本不同,配置文件的内容可能有所不同),将<document-directory>修改成自己的apache的documentroot的值。
<document-directory>/usr/java/httpd2/htdocs</document-directory> ##这里修改成/usr/java/httpd2/htdocs
最后vi /usr/java/httpd2/conf/httpd.conf
复制以下内容
<location /caucho-status>
sethandler caucho-status
</location>
保存后。从启APACHE和RESIN
# /usr/java/resin/bin/httpd.sh restart
# /usr/java/httpd2/bin/apachectl restart
通过浏览器去访问http://localhost/caucho-status/,如果出现以下页面刚表示resin和apache已经成功整合了。
http://www.dfmqp.cn/caucho-status/
七.建立resin和apache的虚拟主机 我们建立的是tes1.jsp.com test2.jsp.com 两个虚拟主机
vi /usr/java/httpd2/conf/httpd.conf
复制如下内容到httpd.conf里
NameVirtualHost 192.168.0.1 虚拟主机建立所在的IP
<VirtualHost 199.199.0.1>
DocumentRoot /home/jsp1/ 文件所在目录
ServerName tes1.jsp.com 访问的域名
</VirtualHost>
VirtualHost 192.168.0.1>
DocumentRoot /home/jsp2/
ServerName test2.jsp.com
</VirtualHost>
vi /usr/java/resin/conf/resin.conf
查找如下代码并修改:
<host id="" root-directory=".">
<!--
- configures an explicit root web-app matching the
- webapp's ROOT
-->
<web-app id='/' document-directory="/usr/java/httpd2/htdocs"/>
</host>
<host id='tes1.jsp.com'>
<web-app id='/' document-directory="/home/jsp1"/>
</host>
<host id='tes2.jsp.com'>
<web-app id='/' document-directory="/home/jsp2"/>
</host>
保存从启apache和resin
tes1.jsp.com 和tes2.jsp.com 虚拟主机可以运行了
可以做如下测试http://localhost/caucho-status/
可以看到测试面上有
Virtual Host: tes1.jsp.com:80
Virtual Host: tes2.jsp.com:80
证明JSP虚拟主机工作很正常
http://www.dfmqp.cn
本人的全部安装过程提供给LINUX爱好者共同分享,需要软件如下
resin:http://www.caucho.com/
jdk:http://java.sun.com/
apache:http://www.apache.org
mysql:http://www.mysql.com
php:http://www.php.net
jdbc:http://mmmysql.sourceforge.net/
本人所用的软件版本如下:
resin-3.0.10.tar.gz
j2sdk-1_4_2_05-linux-i586.bin
httpd-2.0.52.tar.gz
mysql-4.1.9.tar.gz
php-4.3.10.tar.gz
mysql-connector-java-3.1.6.tar.gz
一.安装MYSQL
我把他全部下在到/root 目录下
# chmod 755 mysql-4.1.9.tar.gz
# tar xfz mysql-4.1.9.tar.gz
解压后生成mysql-4.1.9目录,我们进入该目录:
cd mysql-4.1.9
进入后就开始配置mysql了,配置过程中我们要给mysql设置一个安装目录,我们设置在 /usr/local/mysql 下,以为把文件放到一个地方比较容易管理,如果你还想获得更多的配置信息,使用 ./configure --help:
在这里我要特别强调在 编译的时候要选择好MYSQL的默认编码,因为如果不选择按默认安装的时候在JSP中就不支持GBK编码了
所以我这样编译
# ./configure --prefix=/usr/local/mysql --with-charset=gbk
然后等几秒钟,配置完成后就编译源代码
# make
这个编译的过程比较长,如果机器比较慢的话,可能要近二十分种 ( 我的是联想服务器都需要了15分钟 ) . 编译完成后就安装:
# make install
等上几秒钟,安装完成.下面就到了最关键的部分了,为什么老安装不成功,(至少我是安装了N次,N > 10 ,呵呵),问题关键就在这里,访问mysql要一个专门的用户,而且必须给相应的访问权限,这里我们就设置root和mysql有权限访问.
我们先建立一个mysql和mysql用户来访问mysql:
# groupadd mysql #建立mysql组
# useradd mysql -g mysql #建立mysql用户并且加入到mysql组中
建立用户后我们就初始化表 (注意:必须先执行本步骤后才能进行以下步骤)
# ./scripts/mysql_install_db --user=mysql #初试化表并且规定用mysql用户来访问初始化表以后就开始给mysql和root用户设定访问权限, 我们先到安装mysql的目录:
# cd /usr/local/mysql
然后设置权限
# chown -R root . #设定root能访问/usr/local/mysql
# chown -R mysql var #设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件
# chown -R mysql var/. #设定mysql用户能访问/usr/local/mysql/var下的所有文件
# chown -R mysql var/mysql/. #设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件
# chgrp -R mysql . #设定mysql组能够访问/usr/local/mysql
设置完成后,基本上就装好了,好了,我们运行一下我们的mysql:
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
如果没有问题的话,应该会出现类似这样的提示:
[1] 42264
# Starting mysqld daemon with databases from /usr/local/mysql/var
这就证明你安装成功了
用如下命令修改MYSQL密码,默认安装密码为空,为了安全你必须马上修改
/usr/local/mysql/bin/mysqladmin -uroot password pengyong
现在修改的密码为:pengyong
二、安装jdk
# chmod 755 j2sdk-1_4_2_05-linux-i586.bin
# ./j2sdk-1_4_2_05-linux-i586.bin 释放j2sdk-1_4_2_05-linux-i586.bin
在/root目录下生成j2sdk1.4.2_05目录和文件我是将JDK装到/usr/java/目录下
将文件剪切到/usr/java/目录下
# mv j2sdk1.4.2_05/ /usr/java/
设置JDK变量环境
# vi /etc/profile
# /etc/profile
JAVA_HOME=/usr/java/j2sdk1.4.2_05
RESIN_HOME=/usr/resin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/htmlco
nverter.jar:$RESIN_HOME/lib:/usr/java/jdbc/mysql-connector-java-3.1.6-bin.jar
退出当前登录的环境,重新登录,这样刚刚设定的环境变量就会生效,然后用如下命令测试:
[root@LINUX root]# echo $JAVA_HOME
/usr/java/j2sdk1.4.2_05
[root@LINUX root]# echo $CLASSPATH
.:/usr/java/j2sdk1.4.2_05/lib/dt.jar:/usr/java/j2sdk1.4.2_05/lib/tools.jar:/usr/
java/j2sdk1.4.2_05/lib/htmlconverter.jar:/usr/resin/lib:/usr/java/jdbc/mysql-con
nector-java-3.1.6-bin.jar
[root@LINUX root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi
n:/usr/local/sbin:/usr/bin/X11:/usr/java/j2sdk1.4.2_05/bin:/usr/X11R6/bin:/root/
bin
[root@LINUX root]# java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
看到类似信息就表示jdk环境已经好了。其实在上面的/etc/profile中,我们不仅仅设置了jdk的环境变量,还一并设置了resin和jdbc的环境变量,这些都是后面安装resin所必需的设定
三、安装mysql的jdbc
# tar xfz mysql-connector-java-3.1.6.tar.gz
# mv mysql-standard-4.0.23-pc-linux-i686/ /usr/java/ 将解压的文件剪切到/usr/java/目录下。
# cd /usr/java/
# ln -s mysql-standard-4.0.23-pc-linux-i686/ jdbc 创建JDBC的软连接与/usr/java/目录下
四、安装apache
# chmod 755 httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
开始配置APACHE
# ./configure --prefix=/usr/java/httpd2 --enable-module=most --enable-shared=max
察看编译进apache的模块:
#/usr/java/httpd2/bin/httpd -l
[root@LINUX root]# /usr/java/httpd2/bin/httpd -l
compiled-in modules:
http_core.c
mod_so.c
看到以上的信息表明apache支持dso方式了。这样就可以用dso的方式把php和resin的模块加进来。
五、安装php
我们使用的PHP版本是4.3.10,先去下载: http://www.php.net/downloads.php, 下回来的包叫做 php-4.3.10.tar.gz, 放到/usr/local/src目录下.
首先进入该目录后解压缩:
# cd /usr/local/src
# tar xfz php-4.3.10.tar.gz
解压后进入目录:
# cd php-4.3.10
进行配置,这一步比较关键,一定要设置好,特别是要考虑到你要支持什么,比如GD库,xml,mysql等等,如果想知道详细的配置,执行 ./configure --help来获得:
# ./configure --with-mysql=/usr/java/mysql --with-apxs=/usr/java/httpd2/bin/apxs
果上面的配置没有错误的话,那么应该最后会显示感谢使用PHP等字样,那么证明配置成功,如果上面的配置选项不支持的话,会提示错误.
比如你没有安装mysql,那么--with-mysql就无法使用,所以一定要注意对应选项系统是否能够支持,如果出现错误,那么就先安装对应的程序,或者去掉相关选项,配置之后就进行编译:
# make
编译成功后出现"Build complete."字样,那么就可以进行安装了:
# make install
安装完成后把/usr/local/src/php-4.3.8/php.ini-dist复制到/usr/local/lib/,并重命名为php.ini
# cp /usr/local/src/php-4.3.10/php.ini-dist /usr/local/lib/php.ini
基本到这里PHP就安装成功了,如果中间出现错误,除了在配置的时候没有选对选项之后一般都不出现错误.
为了让Apache能够直接解析php,我们还要进行一些配置.
# vi /usr/java/httpd/conf/httpd.conf
在httpd.conf文件中,添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
应该将以上两句添加在其他AddType之后。
确保文件中有以下一句话,没有就自己添加在所有LoadModule之后。
LoadModule php4_module modules/libphp4.so
好了,在vi中使用":wq"保存httpd.conf文件,退出vi。启动apache server:
# /usr/java/httpd2/bin/apachectl restart
现在apache就能够运行php了,写个文件测试一下,在/usr/java/httpd2/htdocs目录下,新建一个phpinfo.php文件,
文件中只有一行代码:
<? phpinfo(); ?>
保存此文件, 在你的浏览器中输入http://localhost/phpinfo.php,你应该看到PHP的系统信息。
如果出现错误,比如提示你下灾phpinfo.php,那么apache就是还无法解析php文件,那么请仔细检查以上的操作是否正确.
六.安装resin
下载的resin的安装包解开后应该可以直接单独运行的。笔者将其解开后放到/usr/java/目录下
# tar xfz resin-3.0.10.tar.gz
# mv resin-3.0.10 /usr/java/
# cd /usr/java/
# ln -s resin-3.0.10/ resin
启动resin
# /usr/java/resin/bin/httpd.sh start
现在就能够从http://localhost:8080/上能看到resin的页面,这也就表示单独的resin运行成功了。然后,为了整合resin和apache,我们需要重新编译一下,以生成mod_caucho给apache调用。
# cd /usr/java/resin
# ./configure --with-apache=/usr/java/httpd2
# make
# make install
修改/usr/java/resin/conf/resin.conf,大约在最后(安装的resin版本不同,配置文件的内容可能有所不同),将<document-directory>修改成自己的apache的documentroot的值。
<document-directory>/usr/java/httpd2/htdocs</document-directory> ##这里修改成/usr/java/httpd2/htdocs
最后vi /usr/java/httpd2/conf/httpd.conf
复制以下内容
<location /caucho-status>
sethandler caucho-status
</location>
保存后。从启APACHE和RESIN
# /usr/java/resin/bin/httpd.sh restart
# /usr/java/httpd2/bin/apachectl restart
通过浏览器去访问http://localhost/caucho-status/,如果出现以下页面刚表示resin和apache已经成功整合了。
http://www.dfmqp.cn/caucho-status/
七.建立resin和apache的虚拟主机 我们建立的是tes1.jsp.com test2.jsp.com 两个虚拟主机
vi /usr/java/httpd2/conf/httpd.conf
复制如下内容到httpd.conf里
NameVirtualHost 192.168.0.1 虚拟主机建立所在的IP
<VirtualHost 199.199.0.1>
DocumentRoot /home/jsp1/ 文件所在目录
ServerName tes1.jsp.com 访问的域名
</VirtualHost>
VirtualHost 192.168.0.1>
DocumentRoot /home/jsp2/
ServerName test2.jsp.com
</VirtualHost>
vi /usr/java/resin/conf/resin.conf
查找如下代码并修改:
<host id="" root-directory=".">
<!--
- configures an explicit root web-app matching the
- webapp's ROOT
-->
<web-app id='/' document-directory="/usr/java/httpd2/htdocs"/>
</host>
<host id='tes1.jsp.com'>
<web-app id='/' document-directory="/home/jsp1"/>
</host>
<host id='tes2.jsp.com'>
<web-app id='/' document-directory="/home/jsp2"/>
</host>
保存从启apache和resin
tes1.jsp.com 和tes2.jsp.com 虚拟主机可以运行了
可以做如下测试http://localhost/caucho-status/
可以看到测试面上有
Virtual Host: tes1.jsp.com:80
Virtual Host: tes2.jsp.com:80
证明JSP虚拟主机工作很正常
Feb
13
1、装IIS6,这个不用教吧。
2、装PHP5,(建意用这里的版本
http://www.discuz.com/index.php?category=4)
把PHP5解压到C:/php 目录下。把这几个文件复制到C:/WINDOWS 下“ php.ini-dist php5ts.dll php.exe”php.ini-dist 改成PHP.INI
如果懒得去找的话,把根目录下的都放到C:/WINDOWS 下。再把所有目录里的DLL文件放到C:\WINDOWS\system32里,
包括根目录和子目录(其实有的不用全站放,为了怕你们选错,还是全放吧)
3、在IIS web 服务扩展 里 添加一个 web 服务扩展 ,名称写PHP或别的都可以。添加文件:C:\WINDOWS\system32\php5isapi.dll 设为充许
4、设置网站:点网站属性-主目录-置制-添加一个ISAPI-指到C:\WINDOWS\system32\php5isapi.dll 扩展名写.PHP
OK啦。。PHP5可以运行了。 最好重起下IIS。
5、装MYSQL:默认方式一直装下去。。装好后,运行一下这个文件C:\mysql\bin\winmysqladmin.exe 。MYSQL下次就会自动运行了。注:这个程序会提示一个用户名密码,这个不是真正的MYSQL密码,随便设个就行。真正的MYSQL密码对菜鸟来说还是装个PHPMYADMIN再去改,,默认是空!
再找到c:/windows/php.ini 文件。把这个;extension=php_mysql.dll 前面的;去掉就行了。
重起下IIS ,就OK啦。。再按默认方式装Zend就可以了。
IIS6+PHP5+MYSQL 完成。。
IIS6+resin+JSP 待续……明天写了……
本文是本人原创,“快速装好,执行速度快” 转载请注明!我喜欢打错字,大家帮我查查,呵呵。。
好!下面写JSP的啦。。看好了。
接上一编:
1、装j2sdk-1_4_2_08-windows-i586-p.exe 为了安装顺利,最好用我同样的版本。2、把resin-pro-3.0.14.zip解压到C:/resin 目录
3、环境变量。在我的电脑上单击鼠标右键→属性→高级→环境变量。
1)新建两个系统变量(单击下面的新建):
①变量名:JAVA_HOME
变量值:D:\J2SDK(J2SDK安装的目录)
②变量名:classpath
变量值:.;%JAVA_HOME%\lib\tools.jar(注:前面是一个小数点加个分号,直接复制就可以)
③变量名:RESIN_HOME
变量值:D:\Resin_3.0.14(Resin安装的目录)
2)编辑系统变量Path
在变量值后面追加;%JAVA_HOME%\bin\
4、复制文件:
1)C:\Inetpub下面新建一个文件夹,重命名为scripts
2)把Rensin_3.0.14\win32下的isapi_srun.dll复制到
C:\Inetpub\scripts下
3)在C:\Inetpub\scripts新建一个resin.ini文件。
文件内容下面两行数据:
ResinConfigServer localhost 6802
IISPriority high
5、设置IIS。
1)在默认网站上单击右键→属性→ISAPI筛选器→添加
筛选器名称:Resin_3.0.14(可随便填)
可执行文件:C:\Inetpub\scripts\isapi_srun.dll
2)在默认网站上单击右键→新建→虚拟目录
别名:scripts
本地路径:C:\Inetpub\scripts
3)单击WEB服务扩展→添加一个新的WEB服务扩展
扩展名:Resin(可随便添)
要求文件:C:\Inetpub\scripts\isapi_srun.dll
选中设置扩展状态为允许
4)设置网站:点网站属性-主目录-置制-添加一个ISAPI-指到C:\Inetpub\scripts\isapi_srun.dll扩展名写.jsp
6、设置Resin_3.0.14\conf\resin.conf。
在文件中找到(大概是在最后)
doc
改成
c:/inetpub/wwwroot (c:/inetpub/wwwroot,为你的默认网站的目录)
好,到这里,我们就完全设置完了。
然后先运行net stop w3svc关闭IIS服务。
再运行net start w3svc重新启动IIS。
7、d:\resin_3.0.14\bin\httpd.exe -install 这样Resin就会开机启动这样就OK啦。比PHP复杂点。。调试时细心一点,要不容易出错。 写的仓促,有错的地方,请指出谢谢。。
2、装PHP5,(建意用这里的版本
http://www.discuz.com/index.php?category=4)
把PHP5解压到C:/php 目录下。把这几个文件复制到C:/WINDOWS 下“ php.ini-dist php5ts.dll php.exe”php.ini-dist 改成PHP.INI
如果懒得去找的话,把根目录下的都放到C:/WINDOWS 下。再把所有目录里的DLL文件放到C:\WINDOWS\system32里,
包括根目录和子目录(其实有的不用全站放,为了怕你们选错,还是全放吧)
3、在IIS web 服务扩展 里 添加一个 web 服务扩展 ,名称写PHP或别的都可以。添加文件:C:\WINDOWS\system32\php5isapi.dll 设为充许
4、设置网站:点网站属性-主目录-置制-添加一个ISAPI-指到C:\WINDOWS\system32\php5isapi.dll 扩展名写.PHP
OK啦。。PHP5可以运行了。 最好重起下IIS。
5、装MYSQL:默认方式一直装下去。。装好后,运行一下这个文件C:\mysql\bin\winmysqladmin.exe 。MYSQL下次就会自动运行了。注:这个程序会提示一个用户名密码,这个不是真正的MYSQL密码,随便设个就行。真正的MYSQL密码对菜鸟来说还是装个PHPMYADMIN再去改,,默认是空!
再找到c:/windows/php.ini 文件。把这个;extension=php_mysql.dll 前面的;去掉就行了。
重起下IIS ,就OK啦。。再按默认方式装Zend就可以了。
IIS6+PHP5+MYSQL 完成。。
IIS6+resin+JSP 待续……明天写了……
本文是本人原创,“快速装好,执行速度快” 转载请注明!我喜欢打错字,大家帮我查查,呵呵。。
好!下面写JSP的啦。。看好了。
接上一编:
1、装j2sdk-1_4_2_08-windows-i586-p.exe 为了安装顺利,最好用我同样的版本。2、把resin-pro-3.0.14.zip解压到C:/resin 目录
3、环境变量。在我的电脑上单击鼠标右键→属性→高级→环境变量。
1)新建两个系统变量(单击下面的新建):
①变量名:JAVA_HOME
变量值:D:\J2SDK(J2SDK安装的目录)
②变量名:classpath
变量值:.;%JAVA_HOME%\lib\tools.jar(注:前面是一个小数点加个分号,直接复制就可以)
③变量名:RESIN_HOME
变量值:D:\Resin_3.0.14(Resin安装的目录)
2)编辑系统变量Path
在变量值后面追加;%JAVA_HOME%\bin\
4、复制文件:
1)C:\Inetpub下面新建一个文件夹,重命名为scripts
2)把Rensin_3.0.14\win32下的isapi_srun.dll复制到
C:\Inetpub\scripts下
3)在C:\Inetpub\scripts新建一个resin.ini文件。
文件内容下面两行数据:
ResinConfigServer localhost 6802
IISPriority high
5、设置IIS。
1)在默认网站上单击右键→属性→ISAPI筛选器→添加
筛选器名称:Resin_3.0.14(可随便填)
可执行文件:C:\Inetpub\scripts\isapi_srun.dll
2)在默认网站上单击右键→新建→虚拟目录
别名:scripts
本地路径:C:\Inetpub\scripts
3)单击WEB服务扩展→添加一个新的WEB服务扩展
扩展名:Resin(可随便添)
要求文件:C:\Inetpub\scripts\isapi_srun.dll
选中设置扩展状态为允许
4)设置网站:点网站属性-主目录-置制-添加一个ISAPI-指到C:\Inetpub\scripts\isapi_srun.dll扩展名写.jsp
6、设置Resin_3.0.14\conf\resin.conf。
在文件中找到(大概是在最后)
改成
好,到这里,我们就完全设置完了。
然后先运行net stop w3svc关闭IIS服务。
再运行net start w3svc重新启动IIS。
7、d:\resin_3.0.14\bin\httpd.exe -install 这样Resin就会开机启动这样就OK啦。比PHP复杂点。。调试时细心一点,要不容易出错。 写的仓促,有错的地方,请指出谢谢。。
Feb
13
早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题。稍整理了一下,将经验记录在这篇文章里:《解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记》
朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了。一启用,则马上上升。
MYSQL CPU 占用 100% 的解决过程
今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB。按这个数据,MySQL 不可能占用这么高的资源。
于是在服务器上运行命令,将 mysql 当前的环境变量输出到文件 output.txt:
d:\web\mysql> mysqld.exe --help >output.txt
发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini, 将 tmp_table_size 赋值到 200M:
d:\web\mysql> notepad c:\windows\my.ini
[mysqld]
tmp_table_size=200M
然后重启 MySQL 服务。CPU 占用有轻微下降,以前的CPU 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。
于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句:
mysql> show processlist;
反复调用此命令(每秒刷两次),发现网站 A 的两个 SQL 语句经常在 process list 中出现,其语法如下:
Select t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
orDER BY t1.pid
LIMIT 0,15
调用 show columns 检查这三个表的结构 :
mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;
终于发现了问题所在:_mydata 表,只根据 pid 建立了一个 primary key,但并没有为 userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中:
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
_mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userid 建立了一个索引:
mysql> Alter TABLE `_mydata` ADD INDEX ( `userid` )
建立此索引之后,CPU 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processlist 中的 sql 语句:
Select COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
Where t1.pid=t2.pid and t2.keywords = '孔雀'
经检查 _mydata_key 表的结构,发现它只为 pid 建了了 primary key, 没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引:
mysql> Alter TABLE `_mydata_key` ADD INDEX ( `keywords` )
建立此索引之后,CPU立刻降了下来,在 50%~70%之间震荡。
再次调用 show prosslist,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序, Discuz论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。
解决 MYSQL CPU 占用 100% 的经验总结
增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。 这是 mysql 官方关于此选项的解释:
tmp_table_size
This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory.
对 Where, JOIN, MAX(), MIN(), orDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。
根据 mysql 的开发文档:
索引 index 用于:
快速找出匹配一个Where子句的行
当执行联结(JOIN)时,从其他表检索行。
对特定的索引列找出MAX()或MIN()值
如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。
在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。
假定你发出下列Select语句:
mysql> Select * FROM tbl_name Where col1=val1 AND col2=val2;
如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。
开发人员做 SQL 数据表设计的时候,一定要通盘考虑清楚。
朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了。一启用,则马上上升。
MYSQL CPU 占用 100% 的解决过程
今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB。按这个数据,MySQL 不可能占用这么高的资源。
于是在服务器上运行命令,将 mysql 当前的环境变量输出到文件 output.txt:
d:\web\mysql> mysqld.exe --help >output.txt
发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini, 将 tmp_table_size 赋值到 200M:
d:\web\mysql> notepad c:\windows\my.ini
[mysqld]
tmp_table_size=200M
然后重启 MySQL 服务。CPU 占用有轻微下降,以前的CPU 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。
于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句:
mysql> show processlist;
反复调用此命令(每秒刷两次),发现网站 A 的两个 SQL 语句经常在 process list 中出现,其语法如下:
Select t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
orDER BY t1.pid
LIMIT 0,15
调用 show columns 检查这三个表的结构 :
mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;
终于发现了问题所在:_mydata 表,只根据 pid 建立了一个 primary key,但并没有为 userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中:
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
_mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userid 建立了一个索引:
mysql> Alter TABLE `_mydata` ADD INDEX ( `userid` )
建立此索引之后,CPU 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processlist 中的 sql 语句:
Select COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
Where t1.pid=t2.pid and t2.keywords = '孔雀'
经检查 _mydata_key 表的结构,发现它只为 pid 建了了 primary key, 没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引:
mysql> Alter TABLE `_mydata_key` ADD INDEX ( `keywords` )
建立此索引之后,CPU立刻降了下来,在 50%~70%之间震荡。
再次调用 show prosslist,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序, Discuz论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。
解决 MYSQL CPU 占用 100% 的经验总结
增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。 这是 mysql 官方关于此选项的解释:
tmp_table_size
This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory.
对 Where, JOIN, MAX(), MIN(), orDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。
根据 mysql 的开发文档:
索引 index 用于:
快速找出匹配一个Where子句的行
当执行联结(JOIN)时,从其他表检索行。
对特定的索引列找出MAX()或MIN()值
如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。
在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。
假定你发出下列Select语句:
mysql> Select * FROM tbl_name Where col1=val1 AND col2=val2;
如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。
开发人员做 SQL 数据表设计的时候,一定要通盘考虑清楚。