Mysql

MySQL 死亡的苦恼

自从一次升级后,我的 VPS 就一直不大稳定。情况是,一些用到 MySQL 的应用常常发生丢失数据库链接错误,比如 WordPress 和 Fever。那段时间我很苦恼,因为我的博客常常不能访问,而我通过 Reeder 来访问 Fever 里的数据,每次刷新时,2 秒钟之内完事儿,数据也没有更新。几次后,我发现这些都是因为 MySQL 进程不知不觉被杀死了的缘故。

怎么回事?因为发生这个故障实在我升级了 MySQL 之后,我觉得是不是 MySQL 的问题。我过了一遍配置文件,把一些限制的地方都调低了,也没解决。是不是 MySQL 本身有问题?我 apt-get 升级了好几次,看 MySQL 都迭代了几个新版本了,也没有改善这个情况。我想会不会是 WordPress 的事儿?于是我安装了 Memcached,觉得这样就减少了使用 MySQL 的次数吧,应该可以解决?最后还是没有。

近期没有什么经历,于是就这么靠着。发现博客无法访问了,或者 Reeder 刷新时 2 秒钟完事儿,我就上后台重启一下 MySQL,或者嫌麻烦干脆重启 VPS,也能解决一段时间的问题。

后来我在 LISH 后台看到了一些输出,意思是内存不足了,于是杀死了 MySQL 进程。我想这就是问题原因,不过不清楚是为什么。

这周二,我有一次遇到了这个问题,觉得挺烦,于是有搜索了一下。这次找到了更多的信息。通过查看 /var/log/kern.log,我看到了更多信息,明确表示了是 php5-cgi 引发了 oom-killer,也就是说是 PHP 占用了太多的内存,导致了 MySQL 被杀死。于是我走了一遍 PHP 的配置文件,把里面的一些限制都调低,一直到现在也没有出现问题。

Ubuntu 升级后 MySQL 无法启动

上一篇文章中我说道,我遇到了 MySQL 的严重问题。在这里专门说一说。

当时我写好了程序,已经通过 FTP 上传到服务器上了,然后就上服务器上调试。由于近期 Ubuntu 12.04 LTS 出来了,因此每次我登陆的时候,都会有升级的提示,让我运行 do-release-update 来升级。因为我用的是 VPS,我不确定 Linode 是怎么说这个事的,是不是有问题,因此我在这半个月中一直忽视它。今天又看到了这个提示,觉得大概是时候把它处理一下了。

于是我搜索了 Linode 的页面,看到它的 blog 上写的可以升级。我过去在用 Ramhost 和 YardVPS 的时候都做过这个,因此虽然脑子里想的是不是要备份一下数据库,但考虑到过去都很顺利的通过了,于是就没有再管,直接升级了。

升级中间出来一个窗口,让我设置 MySQL 的 root 密码。虽然我过去设置过,但我这次还是重新输入了两次,接着提示我说设置 root 密码失败,原因可能是我过去设置过 root 密码,或者是配置出了问题。我一看,我过去设置过 root 密码啊,于是就没有考虑这个,直接选择继续了。

升级结束后我开始测试我的程序。我选择了手动创建数据库,但在运行 MySQL 客户端的时候,却出现了错误信息:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

无论我用普通帐号还是 root 帐号都出现了这种问题。开始时我以为是个小问题,于是重启 MySQL,结果发现启动不起来了,运行 service mysql restart 的结果是:

start: Job failed to start

这时,我意识到可能是 MySQL 系统出问题了,去浏览器访问我的 blog,果然提示数据库连接不正常。

我上网搜索,确实有人有过这种经历,但原因是因为硬盘空间满了,清除出一些空间来就解决了。还有人说跟 /var/run/mysqld 的权限有关,我试过修改权限,但仍然不管用。

VPS 转移

我在这次购买新的 VPS 的时候之前的一段时间里,由于长时间没有上 VPS 的终端,因此对于 VPS 的一些设定什么的都忘的差不多了。那时我一直对于再次登陆 VPS 的终端有种排斥的感觉。当我的新 VPS 开通后,如何转移数据让我头疼了一阵子。好在现在已经转移成功,我可以写一篇文章把当中出现过的一些问题给记录下来,之后再遇到类似情况可以轻松一些。

其实 Linux 系统的数据转移很简单,反正都是文件,开通 FTP 之后镜像一下就一切搞定。不过我在之前的一篇文章中说过,我这次想要用与过去不同的软件来搭建主机,所以有些东西需要重新配置。对于新软件不熟悉,导致了这次的一些问题的发生。不过这也是一次学习机会,通过这次转移,我又积累了一些服务器方面的经验。

先说一下我过去用的软件吧:Debian 5.0 + Lighttpd + PHP-CGI + MySQL + phpMyAdmin + MemCache + Exim4 + vsftpd。我这次用的软件为:Debian 6.0 + Nginx + PHP-FPM + MySQL + Exim4 + vsftpd。操作系统方面都是 Debian,没什么问题。Web 服务器需要重新配置。我过去用过 Nginx 建网站,不过当时用的也是 PHP-CGI,所以有些参数的位置不同。数据库方面,我过去的所有操作都是通过 phpMyAdmin 来完成的,而对于用 SQL 语句来操纵用户权限,我没有接触过。我的站点规模都很小,因此从之前的经验上看来 MemCache 没有起太大的作用,所以这次就没有再用它。其它的邮件和 FTP 服务器都是一样的。

Web 服务器

Nginx 和 Lighttpd 的配置都挺简单的,看一下例子把内容按照自己的需求修改一下就可以了。不过因为用的软件不同,有些配置都变了位置。比如说 PHP 进程的个数,原来在 Lighttpd 的配置文件里可以设定,现在需要去 /etc/php5/fpm/pool.d/www.conf 里面设定。

我这次使用 WordPress 遇到了几次内存限制的问题。由于缓存方面配置的失误(缓存那部分说),我没有通过转移数据库的方式来转移 blog,而是在新 VPS 上新安装了一个 WordPress,然后从旧的 WordPress 那里选择 export 后再在新 WordPress 那里 import。本来我觉得这么操作不会有任何问题的,结果上传文件的时候我收到了这样的错误信息:

Ultimate Tag Warrior总算能用了

在phpMyAdmin里捣鼓了一晚上,终于让UTW正常了。之前我的数据库默认编码是latin1,默认连接校对是latin1_swedish_ci,虽然从wp-config.php里面改成了utf8/utf8_general_ci,但数据库的默认设置没有改。而且我用的是虚拟主机,自己也没有权限更改这些全局变量。然后自己研究导出的数据库文件,发现数据库在建立的时候已经确定了这些基本属性。我本想把它们在文件中改过来,重新建立数据库,但我的虚拟主机又是与别人分享的,不能自己删除数据库。

走投无路下,我从网上搜索SQL语法,找到了ALTER命令,用SQL语句修改了表的字符集。我先把SK2和UTW这两个插件禁用,然后用了这两条代码:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;

ALTER TABLE table_name DEFAULT CHARACTER SET utf8;

虽然不是很明了具体是怎么回事,但总算是成功的修改了字符集设置,而且似乎默认的字符集也被改了过来。

接着把wp_tags表清空,终于恢复到了刚启用插件的状态。然后再把分类目录转换一下,这次没有报告错误,成功完成了。接着设置了别名,总算“步入正轨”了。

虽然这样,我还是不知道如何用Tag来替代分类目录,这篇文章就当做小白鼠来测试吧。