WordPress 博客从虚拟机搬家到 VPS 还没两天就悲剧了。进入网站就是十个大字 “建立数据库连接时出错” ,然后后台也进不去。拿出 Putty 连接 SSH。发现 MySQL 服务进程被 Kill 了。然后重启 MySQL。博客恢复正常。可没过30分钟,博客又挂了。还是同样的错误。

好吧,架起 Google 搜索大法,找到一堆关于 “Wordpress 建立数据库连接时出错” 的文章,不过大部分不是我想要的答案。不过确实,这些问题也会造成数据库连接出错的问题。这里 Forece 还是稍微写一下吧。

1. wp-config.php 文件配置不当

因为 wp-config.php 是配置你主机及数据库信息的文件,当你网站搬家后,新建的数据库与wp-config名称或密码不符的话,就会造成这个问题,检查下 wp-config 看下数据库配置是否正确即可修复这个问题。

2. 数据库 wp_options 表单需要修复

登陆 phpmyadmin 然后选择 wp_options 表单,然后进行修复即可,或者在 wp-config.php 中添加一句话

1
define('WP_ALLOW_REPAIR', true);

然后登陆网站后台 /wp-admin/ 进行自动修复。

然而,以上解决方案均不是 Forece 想要的解决方案!!!继续查~~~~~~~

3. 服务器配置太低,需要优化 Mysql 和 php.ini

造成系统资源不够,这个倒是有可能。不过我买的是一个中等VPS,还带不起来一个日IP2000的博客吗?比较怀疑。所以直接 Pass 了这个方案,想尝试的问题自己搜索如何优化吧,项目实在太多了。有空 Forece 会写一篇文章详细介绍的。等不及的可以看下这篇文章

4. 创建脚本自动重启 MySQL 服务(治标不治本的方法)

创建脚本自动检测 MySQL 服务进程是否被 Kill,如果进程被杀,那么自动重启MySQL,虽然这个也管用,但是还是没有找到问题的最终所在,就是把我们之前的手动重启 MySQL 给变成自动化而已。

1
2
3
wget http://www.hostusvps.com/script/mysql_check.sh
crontab -e
*/3 * * * * /bin/bash /root/mysql_check.sh

这样的功能就是在定时每三分钟检测一次MYSQL的pid是否正常,如果不正常就执行定时脚本重启MYSQL。

5. 建立 Swap 分区(最终解决方案!)

咱们先了解一下什么是swap分区。swap分区即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

其实说白了SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。

需要注意的是,虽然这个swap分区能够作为“虚拟”的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于swap,最好的办法仍然是加大物理内存,swap分区只是临时的解决办法。

5.1 准备工作:

在设置 Swap 文件之前,有必要先检查一下系统里有没有既存的 Swap 文件。运行以下命令:
swapon -s
如果返回的信息概要是空的,则表示 Swap 文件不存在。

5.2 检查文件系统

在设置 Swap 文件之前,同样有必要检查一下文件系统,看看是否有足够的硬盘空间来设置 Swap 。运行以下命令:
df -hal
检查返回的信息,还剩余足够的硬盘空间即可。

5.3 增加swap交换文件

使用dd命令创建一个swap交换文件
dd if=/dev/zero of=/home/swap bs=1024 count=1024000
这样就建立一个/home/swap的分区文件,大小为1G。
这里要解释一下bs和count,bs为每个块的大小(byte),count为块数,交换文件的总大小就是bs*count

制作为swap格式文件:
mkswap /home/swap

再用swapon命令把这个文件分区挂载swap分区
/sbin/swapon /home/swap

我们用free -m命令看一下,发现已经有交换分区了。

但是重启系统后,swap分区又变成0了。
为防止重启后swap分区变成0,要修改/etc/fstab文件

vi /etc/fstab
在文件末尾(最后一行)加上

/home/swap swap swap default 0 0
这样就算重启系统,swap分区还是有的。

5.4 删除swap交换文件

如果因为特殊情况需要删除 swap 交换文件,那么请参考下方信息,否则请略过。

先停止swap分区

/sbin/swapoff /home/swap
删除swap分区文件

rm -rf /home/swap
删除自动挂载配置命令

vi /etc/fstab
删除/etc/fstab文件中的这一行

/home/swap swap swap default 0 0
这样就能把手动增加的交换文件删除了。

注意:
增加删除swap的操作只能使用root用户来操作。
装系统时分配的swap分区貌似删除不了。
swap分区一般为内存的2倍,但最大不超过2G

附录:以后遇到服务器错误基本排查方案

1.检查磁盘空间是否已满 排除硬性故障原因
有人说 MySQL 的日志经年累积可能会吃掉所有硬盘,所以可以禁用日志(不推荐),因为你就无法根据日志排除错误了啊。不过对于洁癖患者可以无视我的话。另外如果你一万年也不看日志的话,可以禁用这个日志功能。

vi /etc/my.cnf
找到log-bin=mysql-bin和binlog_format=mixed两行,在前面加#注释掉然后保存。接着

/etc/init.d/mysql restart
重启MYSQL生效。

cd /usr/local/mysql/var/
rm -rf mysql-bin.0*

删除掉mysql-bin.0000*之类的日志文件
这样,就可以解决MYSQL日志文件导致的硬盘占用过大的问题。

2.检查当前HTTP、SQL连接数是否正常 排除被攻击原因 (降低MySQL配置文件中的 max_connections 连接数请求)
3.检查程序数据配置文件 排除配置原因
4.检查日志文件

如果不知道日志文件在哪的话,那么去 /etc/my.cnf 查看 log 存放位置,如果你和 Forece 一样用的 LNMP 的话,那么你的 MySQL Log 存放地址应该是 /usr/local/mysql/var/主机名.err

然后用 vi 或者 vim 自行查看日志内容,也可以用 SFTP 下载在本机查看。

Kernal Log
/var/log/kern.log

ref:
http://www.marsitman.com/wordpress/wp_notconn_db.html
http://www.seoimo.com/wordpress-vps/