博客的流量增大后,服务器升级了一下,发现还会出现如下的一些问题,尤其是mysql,这不又出现下面的问题:
2018-12-20 19:22:33 139652136695552 [Note] InnoDB: Dumping buffer pool(s) not yet started 2018-12-20 19:22:33 139653036742464 [ERROR] mysqld: Out of memory (Needed 128663552 bytes)
产生的原因:
流量大导致了mysql的内存不够了,由于自己的系统服务器可以定制,就按照网友的方法增加了一个swap分区
具体步骤:
在使用
free -m
查看内存信息时,发现 swap 分区大小为 0。难怪说数据库服务器无法启动呢,在内存不够用的情况下,又无法使用 swap 分区,自然崩溃了。由于 VPS 使用了 SSD,性能自然不错。下面我们给服务器系统 CentOS 7 添加 1024M 的 swap 分区,采用的方法是创建一个 swap 文件:
使用下面的命令创建 swapfile :
# 1048576 = 1024 * 1024
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
使用下面的命令配置 swap 文件:
mkswap /swapfile
接下来,使用下面的命令立即启用 swapfile ,这样就不用等到下次重启时自动启用:
swapon /swapfile
最后,我们在 /etc/fstab 中添加下面一行,这样可以在系统下次重启时自动生效创建的 swapfile :
/swapfile swap swap defaults 0 0
使用
cat /proc/swaps
或
free -m
查看 swapfile 的生效情况,如下图所示:
在完成上面的步骤后,我们还可以在 my.cnf 配置文件中添加一些配置信息,降低 mysql 资源需求
此外关于innodb_buffer_pool_size说明如下:
innodb_buffer_pool_size是整个MySQL服务器最重要的变量。
1. 为什么需要innodb buffer pool?
在MySQL5.5之前,广泛使用的和默认的存储引擎是MyISAM。MyISAM使用操作系统缓存来缓存数据。InnoDB需要innodb buffer pool中处理缓存。所以非常需要有足够的InnoDB buffer pool空间。
2. MySQL InnoDB buffer pool 里包含什么?
- 数据缓存
InnoDB数据页面 - 索引缓存
索引数据 - 缓冲数据
脏页(在内存中修改尚未刷新(写入)到磁盘的数据) - 内部结构
如自适应哈希索引,行锁等。
3. 如何设置innodb_buffer_pool_size?
innodb_buffer_pool_size默认大小为128M。最大值取决于CPU的架构。在32-bit平台上,最大值为2**32 -1,在64-bit平台上最大值为2**64-1。当缓冲池大小大于1G时,将innodb_buffer_pool_instances设置大于1的值可以提高服务器的可扩展性。
大的缓冲池可以减小多次磁盘I/O访问相同的表数据。在专用数据库服务器上,可以将缓冲池大小设置为服务器物理内存的80%。
3.1 配置缓冲池大小时,请注意以下潜在问题
- 物理内存争用可能导致操作系统频繁的paging
- InnoDB为缓冲区和control structures保留了额外的内存,因此总分配空间比指定的缓冲池大小大约大10%。
- 缓冲池的地址空间必须是连续的,这在带有在特定地址加载的DLL的Windows系统上可能是一个问题。
- 初始化缓冲池的时间大致与其大小成比例。在具有大缓冲池的实例上,初始化时间可能很长。要减少初始化时间,可以在服务器关闭时保存缓冲池状态,并在服务器启动时将其还原。
- innodb_buffer_pool_dump_pct:指定每个缓冲池最近使用的页面读取和转储的百分比。 范围是1到100。默认值是25。例如,如果有4个缓冲池,每个缓冲池有100个page,并且innodb_buffer_pool_dump_pct设置为25,则dump每个缓冲池中最近使用的25个page。
- innodb_buffer_pool_dump_at_shutdown:默认启用。指定在MySQL服务器关闭时是否记录在InnoDB缓冲池中缓存的页面,以便在下次重新启动时缩短预热过程。
- innodb_buffer_pool_load_at_startup:默认启用。指定在MySQL服务器启动时,InnoDB缓冲池通过加载之前保存的相同页面自动预热。 通常与innodb_buffer_pool_dump_at_shutdown结合使用。
增大或减小缓冲池大小时,将以chunk的形式执行操作。chunk大小由innodb_buffer_pool_chunk_size配置选项定义,默认值为128 MB。
缓冲池大小必须始终等于或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数。
如果将缓冲池大小更改为不等于或等于innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数的值,
则缓冲池大小将自动调整为等于或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数的值。
innodb_buffer_pool_size可以动态设置,允许在不重新启动服务器的情况下调整缓冲池的大小。 可以通过状态变量Innodb_buffer_pool_resize_status报告在线调整缓冲池大小操作的状态。