MySQL:内存不足/MariaDB

MySQL: Out of Memory / MariaDB

你好亲爱的堆垛机!

我的 Debian 8 Server VServer(1GB Ram,CPU 2x1GHz)共享有问题。 MariaDB。 我得到了三个需要保留 运行 的 Wordpress 安装和 几个其他网站 。我不知道是什么问题,这种情况每隔几天就会发生,或者当一群客户同时浏览 Wordpress 站点时。

我得到的错误是 Wordpress 无法连接到数据库(因为 数据库崩溃)。

我尝试了很多不同的方法,其中之一是 禁用性能架构 (= 关闭),但没有任何改变。我还将 MySQL 更改为 Mixed,这解决了一些警告(不确定是否已修复)。 Wordpress 无法通过自动修复数据库来解决问题(未发现错误)。

提前致谢! :)

my.cnf的一部分:

(...)
max_connections         = 100
connect_timeout         = 5
wait_timeout            = 600
max_allowed_packet      = 16M
thread_cache_size       = 128
sort_buffer_size        = 4M
bulk_insert_buffer_size = 16M
tmp_table_size          = 32M
max_heap_table_size     = 32M

(...)

# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine  = InnoDB
# you can't just change log file size, requires special procedure
#innodb_log_file_size   = 50M
innodb_buffer_pool_size = 256M
innodb_log_buffer_size  = 8M
innodb_file_per_table   = 1
innodb_open_files       = 400
innodb_io_capacity      = 400
innodb_flush_method     = O_DIRECT
(...)

Journalctl

(...)
Apr 17 23:07:39 Debian-84-jessie-64-LAMP mysqld[618]: 2017-04-17 23:07:39 139847238380288 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe beca
Apr 17 23:20:33 Debian-84-jessie-64-LAMP mysqld[618]: 2017-04-17 23:20:33 139847221811968 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe beca
Apr 18 00:01:56 Debian-84-jessie-64-LAMP mysqld[618]: 2017-04-18  0:01:56 139847220599552 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe beca
Apr 18 00:07:46 Debian-84-jessie-64-LAMP systemd[1]: mariadb.service: main process exited, code=killed, status=9/KILL
Apr 18 00:07:46 Debian-84-jessie-64-LAMP systemd[1]: Unit mariadb.service entered failed state.
Apr 18 00:07:51 Debian-84-jessie-64-LAMP systemd[1]: mariadb.service holdoff time over, scheduling restart.
Apr 18 00:07:51 Debian-84-jessie-64-LAMP systemd[1]: Stopping MariaDB database server...
Apr 18 00:07:51 Debian-84-jessie-64-LAMP systemd[1]: Starting MariaDB database server...
Apr 18 00:07:51 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:51 140160371898304 [Note] /usr/sbin/mysqld (mysqld 10.1.14-MariaDB-1~jessie) starting as process 2956 ...
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Using mutexes to ref count buffer pool pages
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: The InnoDB memory heap is disabled
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Memory barrier is not used
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Compressed tables use zlib 1.2.8
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Using Linux native AIO
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Using SSE crc32 instructions
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] InnoDB: Initializing buffer pool, size = 256.0M
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: InnoDB: mmap(276824064 bytes) failed; errno 12
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] Plugin 'InnoDB' init function returned error.
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] mysqld: Out of memory (Needed 128663552 bytes)
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [Note] Plugin 'FEEDBACK' is disabled.
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] Unknown/unsupported storage engine: InnoDB
Apr 18 00:07:52 Debian-84-jessie-64-LAMP mysqld[2956]: 2017-04-18  0:07:52 140160371898304 [ERROR] Aborting
Apr 18 00:07:52 Debian-84-jessie-64-LAMP systemd[1]: mariadb.service: main process exited, code=exited, status=1/FAILURE
Apr 18 00:07:52 Debian-84-jessie-64-LAMP systemd[1]: Failed to start MariaDB database server.
Apr 18 00:07:52 Debian-84-jessie-64-LAMP systemd[1]: Unit mariadb.service entered failed state.
(MANUALLY RESTARTED SERVER)

如今 1 GB 并不多。当然,您仍然可以在 1G 主机上 运行 MariaDB 10.1,但是您需要对配置文件进行一些调整。

下面是一些如何减少 MariaDB 服务器启动 时内存使用量的示例。

请注意,有不同的参数会影响客户端连接和查询执行时的内存使用,但您的错误日志表明您在启动时遇到了问题。

另请注意,并非所有这些变量都可以一次减少,而且您并非总是可以选择最小值。没有一劳永逸的建议,这取决于您使用的引擎以及您如何使用它们。检查您打算调整的每个变量的文档,以了解它究竟会影响什么。

最后,由于您没有引用整个配置,您可能还有其他一些实际增加内存使用的选项。以下注释基于硬编码默认值。

这是我的 10.1.21 服务器在一个新的干净数据目录上以所有默认值(无配置选项)启动:

所有默认选项

  VIRT    RES    SHR COMMAND
747040  95108  14756 mysqld

它是下面所有内存使用示例的基准。

innodb_buffer_pool_size

10.1中默认值为128M。你把它增加到256M,所以你就失去了128M:

所有默认选项 + --innodb_buffer_pool_size=256M

    VIRT    RES    SHR COMMAND
  888608 104856  14820 mysqld

相反,您可以减少它,最小可能值为 5M:

所有默认选项 + --innodb_buffer_pool_size=5M

    VIRT    RES    SHR COMMAND
  606752  85928  14848 mysqld

aria_pagecache_buffer_size

默认值为128M,最小为128K:

所有默认选项 + --aria-pagecache-buffer-size=128K

    VIRT    RES    SHR COMMAND
  611872  90004  14932 mysqld

key_buffer_size

默认值为 128M,根据文档最小值为 8(尽管在我的机器上所有低于 4K 的内容都调整为 0):

所有默认选项 + --key_buffer_size=8

    VIRT    RES    SHR COMMAND
  611872  71264  14748 mysqld

innodb_log_buffer_size

默认值为16M,最小为256K:

所有默认选项 + --innodb_log_buffer_size=256K

    VIRT    RES    SHR COMMAND
  718368  74980  14756 mysqld

二进制日志

您提到您 "changed the MySQL to Mixed",它允许删除一些警告。显然,这意味着您设置了 binlog_format=mixed,并且启用了 log-bin(默认情况下禁用)。将二进制日志格式调整为 MIXED 就可以了,但是二进制日志本身会占用一些内存,即使在默认配置下也是如此:

所有默认选项 + --log-bin

    VIRT    RES    SHR COMMAND
  747312  95240  14820 mysqld

如果你不需要它,你可以禁用它,它会为你节省一点内存,并会提高性能。

整个InnoDB

在极少数情况下您根本不需要 InnoDB,您可以禁用它,它将为您节省大量内存:

所有默认选项 + --skip-innodb --default-storage-engine=MyISAM

    VIRT    RES    SHR COMMAND
  383948  55696  12668 mysqld

现在一起

因此,假设,如果您一次完成所有这些操作(您应该而不是!),您可以显着减少初始内存分配:

所有默认选项 + --aria-pagecache-buffer-size=128K --innodb_log_buffer_size=256K --key_buffer_size=8 --innodb_buffer_pool_size=5M --skip-innodb --default-storage-engine=MyISAM

    VIRT    RES    SHR COMMAND
  113612  26572  12784 mysqld