MySQL:内存不足/MariaDB

标签 mysql wordpress debian innodb mariadb

亲爱的堆垛机,你好!

我的 Debian 8 服务器 VServer(1GB RAM,CPU 2x1GHz)共享出现问题。 MariaDB。 我安装了三个需要保持运行的 Wordpress 安装,以及一些其他网站。我不知道问题出在哪里,这种情况每隔几天就会发生一次,或者当一群客户同时浏览 WordPress 网站时发生。

我收到错误消息:Wordpress 无法连接到数据库(因为数据库崩溃了)。

我尝试了很多不同的方法,其中之一是禁用性能架构(=关闭),这不会改变任何东西。我还将MySQL更改为混合,这解决了一些警告(不确定是否是脏修复)。 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

二进制日志

您提到您“将 MySQL 更改为混合”,并且它可以消除一些警告。显然,这意味着您设置了 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-引擎=MyISAM

    VIRT    RES    SHR COMMAND
  113612  26572  12784 mysqld

关于MySQL:内存不足/MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466124/

相关文章:

mysql - 使用普通的 java 类来处理与 servlet 的数据库连接是否可以?

mysql 错误代码 : 1066. 不唯一的表/别名: 't2'

html - wordpress 菜单上的 responsive-nav.js 不起作用

wordpress - 使用按钮而不是下拉菜单选择 Woocommerce 产品变体?

python - Windows Python 代码不适用于 Linux Debian

docker - 安装 davfs2 卷时无法在 docker 容器中打开 fuse 设备

tomcat - 无法加载配置文件 solrconfig.xml

Python peewee 更新关键字作为变量

Python MySQL 在 Blob 中插入和检索列表

javascript - wordpress 中的自定义菜单无法正常工作,谁能告诉我为什么?