阿里云 ECS 服务器部署 MySQL 后,经常数据库假死

为什么要在 ECS 上直接部署 MySQL ,而不是使用阿里云提供的 RDS 数据库,当然是因为穷

更多精彩

问题描述

  1. 在阿里云的 ECS 服务器上部署了 MySQL 8.0
  2. 一开始用的挺好,几个月之后突然出现无法连接的情况
  3. 进入服务器通过 mysql -uroot -p 连接时会抛出 can't connect to local xxx '/var/lib/mysql/mysql.sock’ 的异常
  4. 通过 ps -ef|grep mysql 却可以看到 MySQL 进程是存在的,但是却无法连接

解决办法

懒人版

  1. 直接在服务器端输入 service mysqld restart 重启 MySQL 服务即可解决
  2. 但这不能根本性的解决问题,大概 5 天之后数据库就会再次出现假死情况
  3. 如果不嫌麻烦,则重复步骤一即可

一劳永逸版

  1. 5 天就要上服务器重启一次实在太无语了,而且主要还是担心哪天起不来了,数据库真的崩了,数据也丢了,那就搞大了
  2. 所以还是打算认真解决一下这个问题
  3. 首先前往 /var/log/mysqld.log 查看 MySQL 的运行日志得到以下报错
    • 这段报错信息,在该日志里就是 5 天一次,所以基本可以确定这是和数据库假死直接相关的报错信息
1
2
3
4
5
6
[ERROR] [MY-012681] [InnoDB] mmap(137363456 bytes) failed; errno 12
[ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
[ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting
  1. 关键信息在 mmap(137363456 bytes) failed; errno 12 这一句话
    • 这是说 MySQL 的缓存超过了当前服务器的最大限度
    • 说来心酸,这台 ECS 服务器是阿里云做活动时团购的,内存只有 1G
  2. 那么如何调整?前往 /etc/my.cnf ,并搜索 innodb_buffer_pool_size ,我这里找到如下内容
    • 可以看到缓存池的大小设置是没有启用的
  3. 复制这段 innodb_buffer_pool_size = 128M 添加到文件底部
  4. 128M 改为 64M 之后保存并退出
  5. 为保险起见,输入 service mysqld restart 重启一下 MySQL
  6. 这么做到底有没有用还不知道,如果这次 5 天后数据库没有假死,那就说明是有效的