浏览器访问网站突然出现“建立数据库连接时出错”,什么情况?于是进入服务器管理页,重启了服务器,网站正常了。
是什么原因因此“建立数据库连接时出错”?查看一下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计划!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/wp/260164.html