首先先粘贴出来我的错误信息,如下:
2019-07-16T00:53:18.285919Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.15) starting as process 18555 2019-07-16T00:53:18.506674Z 0 [ERROR] [MY-012681] [InnoDB] mmap(137428992 bytes) failed; errno 12 2019-07-16T00:53:18.506740Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool 2019-07-16T00:53:18.506757Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error. 2019-07-16T00:53:18.509371Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine 2019-07-16T00:53:18.510501Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2019-07-16T00:53:18.513074Z 0 [ERROR] [MY-010119] [Server] Aborting 2019-07-16T00:53:18.518947Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15) MySQL Community Server - GPL.
可以看到服务启动失败,关键看这么一句:Cannot allocate memory for the buffer pool。表明的意思是不能再给innodb的缓存池分配内存了。想到的我的服务器内存很小,才1G,十分有可能是这个原因,进而查资料得知innodb_buffer_pool_size这个默认值是128M,我通过free查看了我的内存剩余200多兆,但是没有设置swap分区大小,或许就是因为系统本身所需内存也不足无法为服务分配空间而导致的服务宕机吧。
那么,接下来我做的事情就两步了:
其一:修改innodb_buffer_pool_size的大小,放置在mysql的配置文件中,我的配置文件是在/etc/mysql/mysql.conf.d/mysqld.cnf中,你们的可能是在/etc/mysql/my.cnf下,根据实际情况来吧。
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log innodb_buffer_pool_size = 64M # add here,default is 128M bind-address = 0.0.0.0
其二:为系统swap分区分配一个值,swap存在的本身作用也就是在系统的物理内存(这里应该是运行内存)不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。用以下命令创建一个swap文件挂载在系统上,需要你在root权限下执行这些操作。
dd if=/dev/zero of=/swapfile bs=1M count=1024 mkswap /swapfile swapon /swapfile
然后添加/swapfile swap swap defaults 0 0
到/etc/fstab
文件里面。【作用是保证重启系统前面的操作不会丢失,要让系统重启的时候能自动挂载,需要在fstab文件中配置挂载项。】
LABEL=cloudimg-rootfs / ext4 defaults 0 0 /swapfile swap swap defaults 0 0 # add here
最后重启一下mysql就可以了。