1、背景
我的网站经历了将近2年的频繁出现这个“Error Establishing a database connection” 之后,我终于在两周前下狠心去解决了,目前观察了2周依旧很稳定,所以我终于可以拍胸脯的说我解决了这个问题。
这里我也特别想申明一下,解决这个问题对于不懂wordpress的人来说,真的是隔行如隔山。这两年我挣扎过,放弃了几次。我发现在百度里的博主也好,阿里云的客服也好,他们都不是真心想帮你解决问题的。
阿里云的客服回复大致是可能是插件问题,你要么加个内存吧。但是阿里云的提升1G的内存,价格每个月多了一倍。我只好寻求百度的帮助,但是百度大家都懂前篇一律的转载,整个百度就2个答案:一个是某个插件的原因,由于某个插件占用内存过高导致。但是网站已经搭建好了,要一个一个排除该怎么做到呢,即使做到对网站也很伤。另一个则是前篇一律的转载,都是说搭建网站过程中密码错误呀的这类问题,而我的网站不是不能正常运行,而是偶尔会down掉,所以和这个也无关。
但我在坚持寻找出路的过程中的确看到了很多人也遇到同样的问题,我也终于在Google找到了我想要的答案。这里分享给大家。
2、解决方案概要
这里不拐弯抹角,先一句话道出问题的原因:还是内存的原因,但是抛开“加内存”和“排除插件问题”这些旁门左道的方法,这里告诉你一个阿里云不愿告诉你的方案,就是可以在某些内存出现峰值的场景,能临时使用硬盘做为内存交换区,顶住压力,保证网站持续稳定。
3、方案详细介绍
3.1、我网站的环境
我的网站是阿里云的“轻量应用服务器”,配置是最低配的:1G内存,20G的SSD硬盘。网站用的是wordpress搭建的,数据库是mysql。
我的问题现象是:有时1周、或者频繁的话一天好几次出现数据库挂掉了,导致网站无法访问。
3.2、排查方案
思路:
- 知道网站大致down掉的时间,在阿里云后台找到mysql的异常日志,分析确认真实原因
- 如果是内存问题,那么设置交换区
3.2.1、分析mysql日志
在阿里云后台的“应用详情”找到mysql信息,点击“远程连接”
mysql的位置在/usr/local/mysql,你可以在下面位置找到:
进入到后台会如下显示:
这个时候你要进到data目录下面:
1 |
sudo ls -l data |
找到红框框圈出来的error日志文件。注意,这里有很多err后缀的文件,我们看哪一个呢,我们可以看时间,选最近的那一个。
接下来打开这个文件,查看到对应时间的错误日志,错误在/usr/local/mysql/bin/mysqld: Shutdown complete 附近
下面截图我们看到错误原因是内存分配失败,也就是内存不够分配了。也许你的情况是别的问题,不过没关系,你走到这一步时也能找到自己的错误的原因是啥了,这样可以针对解决,不是盲目的用那些排除法来解决,那样效率太低,而且对网站很伤。
3.2.2、解决内存问题
既然找到了是内存的问题,那么有上面说的3个方法可以解决:
- 升级硬件配置,加内存
- 排除部分插件对内存占用过高问题
- 使用硬盘做为内存交换区
这里介绍第3种,使用硬盘空间做为内存交换区。
可以参考下面两个链接
- https://www.cnblogs.com/cherish-code/p/14768331.htmlcat%20/proc/swaps
- https://blog.csdn.net/diaoliyi1350/article/details/101752011
下面也会详细介绍一下
1、首先查看当前是否已经启用swap分区
如果没有启用,这里是不会显示大小的。我这里是已经开启了,所以这里有size
2、创建一个文件用于swap分区
我是在mysql目录创建的swaps文件。命令如下:
1 |
dd if=/dev/zero of=swaps bs=512 count=8388616 |
以上命令创建了一个4G大小的文件,相当于加了4G的内存,此时的心里还是很开心的~
注:此文件的大小是count的大小乘以bs大小,上面命令的大小是4294971392,即4GB
上面这个命令需要一些时间,可以等待一会。
创建完成以后 通过mkswap swaps
命令将上面新建出的swaps文件做成swap分区:
3、设置交换区的配置
这一步主要是设置在内存剩余多少时启用该虚拟内存。此时使用cat /proc/sys/vm/swappiness
查看数值应该是0,需要sysctl -w vm.swappiness=85
把它改成85,这里85的含义是:100%-85%=15%,即物理内存剩下15%的时候时启用虚拟内存。这个值根据个人需要来吧,我的环境内存本来就不大,总共1G,平时运行都已经占一大半了
查看内存使用情况,在linux下可以使用free命令。例如 free -m 可以以Mega(兆字节)为单位,看目前内存剩余情况,例如:
我们可以看到当前内存总共1G,已经使用了350M,可用419M。我们也有一个交换分区,大小为4G,使用了355M,剩余3.7G。
若想永久修改,则编辑/etc/sysctl.conf
文件,改文件中有vm.swappiness
变量配置。
1 |
vim /etc/sysctl.conf |
修改内容如下,然后保存即可:
4、启用交换分区
1 2 3 4 |
[admin@izbp13310o9pbgxk9renrfz ~]$ cd /usr/local/mysql [admin@izb mysql]$ ls bin COPYING data docs include lib man README share support-files swaps [admin@izbp13310o9pbgxk9renrfz mysql]$ swapon swaps |
注意:如果swapon命令失败,提示swapon 失败:设备或资源忙,则可以使用使用swapoff 先关闭分区,然后再使用该命令开启。
swapoff命令如下:
1 |
swapoff swaps |
5、添加开机自动挂载
目的是服务器重启时能自动开启swap。这个需要在/etc/fstab
文件添加如下一句:
1 |
/usr/local/mysql/swaps swap swap defaults 0 0 |
注意我的swaps文件在mysql目录下面,你可以替换成你自己的目录。
修改后的内容如下:
可以通过vim查看:
1 |
sudo vim /etc/fstab |
注意:需要加sudo,或者 sudo su,不然会提示你没有权限。
6、大功告成
接下来可以通过 cat /proc/swaps 再看下分区是否已经启用。如果你看到Used那一栏有数据了,那代表已经使用上了,那恭喜你问题已经解决。可以尝试重启服务器确认是否也能正常启动。
1 2 3 |
[admin@izbp mysql]$ cat /proc/swaps Filename Type Size Used Priority /usr/local/mysql/swaps file 4194304 365756 -1 |