跳至正文

一次MySQL内存分配失败的解决

前2天访问个人网站时,页面出现错误提示:“数据库连接错误”,经过一番折腾,最终解决了。

步骤如下:

  1. 首先登录个人网站所在的阿里云服务器,使用 netstat -tunpl 查看端口信息,发现mysqld使用的3306端口不在列表中,说明MySQL未启动。一开始以为是终端连接断开时mysql不能自动启动,所以尝试把mysql加入到自动启动列表;
  2. 使用命令 chkconfig --list 查看,mysql果然不在列表,所以使用 chkconfig --add mysqld 加入到启动列表,再次 chkconfig --list ,mysqld加入成功;
  3. 使用命令 service mysql start 启动MySQL,提示Failed;
  4. 使用命令 systemctl status mysqld.service 查看详细信息,提示:Failed to start LSB: start and stop MySQL,还是不知道什么原因;
  5. 决定查看MySQL日志,使用命令 cat /alidata/log/mysql/error.log,发现有如下报错信息:
    171224 21:20:37 InnoDB: Initializing buffer pool, size = 128.0M
    InnoDB: mmap(137363456 bytes) failed; errno 12
    171224 21:20:37 InnoDB: Completed initialization of buffer pool
    171224 21:20:37 InnoDB: Fatal error: cannot allocate memory for the buffer pool
    171224 21:20:37 [ERROR] Plugin 'InnoDB' init function returned error.
    171224 21:20:37 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
  6. 看来是内存分配失败,free -m 查看系统内存,发现可用内存只有60多M,因为这台服务器仅仅是个人网站使用,内存只申请了1G,也不想增加内存了,决定减小InnoDB的分配内存,但怎么知道MySQL使用哪个配置文件呢;
  7. 使用命令 vi /etc/init.d/mysqld 打开启动脚本,发现其中有字段:conf=/etc/my.cnf,就是它了;
  8. 使用命令 vi /etc/my.cnf 打开配置文件,找到如下字段:
    # You can set .._buffer_pool_size up to 50 - 80 %
    # of RAM but beware of setting memory usage too high
    # innodb_buffer_pool_size = 16M
    #innodb_additional_mem_pool_size = 2M
    这些字段虽然被注释,但从前面 error.log 中可以看到,innoDB默认分配了128M内存,需要调小,因此把这行的注释打开,并修改值为32M,如下:
    innodb_buffer_pool_size = 32M
    保存文件退出;
  9. 再次启动Mysql,使用命令 service mysql start,提示MySQL启动成功。再次查看日志, cat /alidata/log/mysql/error.log,有如下信息:
    171224 21:53:31 InnoDB: Initializing buffer pool, size = 32.0M
    171224 21:53:31 InnoDB: Completed initialization of buffer pool
    171224 21:53:31 InnoDB: highest supported file format is Barracuda.
    说明内存分配成功。
  10. 最后使用命令 netstat -tunpl 确认,可以看到 3306 端口显示在列表中,此时网站访问也正常了。

注:本服务器使用的阿里云,执行目录可能和正常的不一样。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注