WordPress出现“建立数据库连接时出错”解决记录

昨天晚上正在使用WinSCP连接服务器,上传修改主题的一些CSS样式,发现WinSCP怎么频繁中断需要重新链接。浏览器访问网站突然出现“建立数据库连接时出错”,什么情况?于是进入服务器管理页,重启了服务器,网站正常了。

是什么原因因此“建立数据库连接时出错”?查看一下var/log/里面的各种日志,虽然不太会看。

mysqld.log日志文件

2019-01-09T13:24:04.615230Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-01-09T13:24:04.617096Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.**) starting as process 23937 ...
2019-01-09T13:24:04.620930Z 0 [Note] InnoDB: PUNCH HOLE support available
2019-01-09T13:24:04.620954Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-01-09T13:24:04.620960Z 0 [Note] InnoDB: Uses event mutexes
2019-01-09T13:24:04.620964Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2019-01-09T13:24:04.620968Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-01-09T13:24:04.620971Z 0 [Note] InnoDB: Using Linux native AIO
2019-01-09T13:24:04.621268Z 0 [Note] InnoDB: Number of pools: 1
2019-01-09T13:24:04.621377Z 0 [Note] InnoDB: Using CPU crc32 instructions
2019-01-09T13:24:04.622890Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2019-01-09T13:24:04.622937Z 0 [ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
2019-01-09T13:24:04.622945Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2019-01-09T13:24:04.622952Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-01-09T13:24:04.622959Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-01-09T13:24:04.622963Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-01-09T13:24:04.622967Z 0 [ERROR] Failed to initialize builtin plugins.
2019-01-09T13:24:04.622969Z 0 [ERROR] Aborting

2019-01-09T13:24:04.622988Z 0 [Note] Binlog end
2019-01-09T13:24:04.623035Z 0 [Note] Shutting down plugin 'CSV'
2019-01-09T13:24:04.623243Z 0 [Note] /usr/sbin/mysqld: Shutdown complete

上述只截取了mysqld.log部分ERROR报错,上述日志重复出现了5次,mysql无法启动。网上搜索关于此现象,大概是内存不足引起mysql无法启动。

怎么解决此问题?

环境为:CentOS7.3

配置为:1核1G

参考各种资料,总结两种方法

A、创建swap交换分区

因为轻量应用服务器1核1G,搞不定mysql5.7这个耗资源大户。只能创建一个类似Windows系统的虚拟内存,来解决内存不足引起的各种问题。

B、配置 php-fpm.conf 文件,控制php-fpm的子进程数

可能是由于php-fpm子进程过多耗光了内存,造成mysql的进程被干掉了。

现在我只是实行了A计划,创建了swap交换分区,暂时还没再次遇到mysql被干掉。这需要服务器连续工作10天左右,才能验证问题是否得到解决。如果问题没有得到很好的解决,再来实行B计划。

A、创建swap交换分区

首先查看当前内存用量 free -m 

[root@iz2zecnv***sp3z ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         517          59          48         415         262
Swap:             0           0           0

可以看到Swap没有容量,因此我们需要创建一个Swap交换分区。

### 建立交换分区文件swapfile ###
[root@iz2zecnv***sp3z ~]# dd if=/dev/zero of=/swapfile bs=1024 count=2048k
### bs=每块字节数1024K count=2048块 ###

2097152+0 records in
2097152+0 records out
2147483648 bytes (2.1 GB) copied, 15.3131 s, 140 MB/s

将swapfile文件指定为交换文件

[root@iz2zecnv***sp3z ~]# mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=0fa99a4c-05e8-4662-9011-286012868e08

将swapfile映射为Swap分区

[root@iz2zecnv***sp3z ~]# swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
[root@iz2zecnv***sp3z ~]# chmod 600 /swapfile

查看交换文件设置信息

[root@iz2zecnv***sp3z ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile                               file    2097148 0       -1

再次查看当前内存用量 free -m

[root@iz2zecnv***sp3z ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         498         103          48         390         265
Swap:          2047           0        2047

创建swap分区成功后,设置swap分区开机自动加载。需要修改系统的fstab文件,vi /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Aug 18 03:51:14 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 /                       ext4    defaults        1 1
/swapfile swap swap sw 0 0

在fstab文件最后面添加一行 /swapfile swap swap sw 0 0 即可,修改此文件千万不能出错。

假如不想用这个交换分区了

### 关闭交换内存 ###
swapoff /swapfile

### 删除交换文件 ###
rm -f /swapfile

### vi编辑fstab文件,删除开机自动挂载/swapfile swap swap sw 0 0 ###
vi /etc/fstab

以上是Swap交换分区创建与删除的整个流程,观察几天之后再看看是否能有效解决物理内存不足导致mysql被干掉的情况了。如果情况不太乐观的话,进一步实行B计划!

“WordPress出现“建立数据库连接时出错”解决记录”的一个回复

  1. Swap交换分区确实已经解决了物理内存不足导致mysql被干掉的情况了。但是当站点同一时间多人访问,物理内存不足时,站点会非常卡,卡一小段时间后又恢复流畅。

    应该是调用虚拟内存导致卡顿的吧?反正访问量并不大,并没有频繁出现这种情况,也暂时不知道怎么处理…

发表评论