Mysql因为内存不够而不能启动

本文记录了一次云上数据库无法连接的问题排查过程。在尝试重启数据库时遇到内存分配失败,通过查看日志确定为内存不足导致。通过增加swap分区解决了内存不足问题,恢复正常数据库服务。

问题描述

由于数据库在云上放着,在写项目的过程中组里成员突然发现数据库连不上了,然后我就登陆服务器看了一眼:

  1. 数据库连不上
  2. 然后我重启数据库的时候会提示一下:
    Job for mysqld.service failed because a fatal signal was delivered to the control process. See "systemctl status mysqld.service" and "journalctl -xe" for details.
    然后我使用journalctl -xe进行排查,发现没有啥有效信息
  3. 之后适用tail -n 20 /var/log/mysqld.log去看数据库的日志,发现了以下信息:
2020-04-29T01:16:10.459072Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 835
2020-04-29T01:16:16.885066Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1020
2020-04-29T01:16:17.181143Z 0 [ERROR] [MY-012681] [InnoDB] mmap(137363456 bytes) failed; errno 12
2020-04-29T01:16:17.181305Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
2020-04-29T01:16:17.181427Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2020-04-29T01:16:17.182891Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2020-04-29T01:16:17.183205Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-04-29T01:16:17.183382Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-04-29T01:16:17.189397Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.

问题原因

从上面可以看到,是因为mmap(啊,这个mmap我面试腾讯的时候还问过)申请不到内存,可以理解为内存不够了
然后先用free看一下当前读的内存

              total        used        free      shared  buff/cache   available
Mem:        1883724     1298816      400560      106920      184348      364396
Swap:             0           0           0

发现果然是swap的问题

解决办法

增加swap

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 #增加1G的SWAP进去
sudo mkswap /swapfile
sudo swapon /swapfile

之后重启mysql
解决办法出处

MySQL 8.0 在启动时会根据配置文件中的参数初始化多种缓冲区和缓存,以提升数据库的性能。要查看 MySQL 8.0 启动时的内存配置,可以通过以下几种方式实现: ### 查看配置文件中的内存相关参数 MySQL 的配置文件(如 `my.cnf` 或 `my.ini`)中定义了多个与内存相关的参数。以下是一些关键的配置项: - `innodb_buffer_pool_size`:定义 InnoDB 缓冲池的大小,是影响性能的核心参数之一。 - `key_buffer_size`:用于 MyISAM 存储引擎的键缓冲区大小。 - `max_allowed_packet`:控制允许的最大数据包大小。 - `tmp_table_size` 和 `max_heap_table_size`:控制内存中临时表的最大大小[^1]。 可以通过查看配置文件来了解这些参数的设置: ```ini [mysqld] innodb_buffer_pool_size = 2G key_buffer_size = 64M max_allowed_packet = 64M tmp_table_size = 64M max_heap_table_size = 64M ``` ### 使用 SQL 查询当前内存配置 MySQL 提供了系统表和函数,可以用来查询当前的内存使用情况。例如,可以通过以下 SQL 查询查看缓冲池的使用情况: ```sql SELECT pool_size * page_size AS buffer_pool_bytes, (pool_size - free_pages) * page_size AS used_buffer_pool_bytes FROM information_schema.innodb_buffer_pool_stats WHERE pool_id = 0; ``` 此外,还可以通过以下命令查看全局的内存使用情况: ```sql SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%'; ``` ### 使用 Performance Schema 查看内存分配 MySQL 8.0 的 Performance Schema 提供了更详细的内存使用信息。可以通过以下查询查看内存分配情况: ```sql SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED, HIGH_NUMBER_OF_BYTES_USED FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE '%buffer%'; ``` ### 查看 MySQL 启动日志 MySQL 启动时会将内存配置信息记录在日志文件中。可以通过查看日志文件来确认启动时的内存分配情况。例如: ```bash sudo grep 'Buffer pool' /var/log/mysqld.log ``` 该命令可以显示 InnoDB 缓冲池的初始化信息,包括缓冲池的大小和页面数量。 ### 监控工具 除了手动查询之外,还可以使用第三方监控工具(如 `MySQL Enterprise Monitor`、`Prometheus + Grafana` 等)来实时监控 MySQL内存使用情况。这些工具通常提供更直观的图表和告警功能,有助于快速定位内存瓶颈。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值