CentOS 6 上的 MySQL 5.6 静默启动失败

CentOS 6 上的 MySQL 5.6 静默启动失败

我正在安装一个全新的 CentOS 6.5,并尝试运行 MySQL 5.6 服务器守护进程。该服务器是 DigitalOcean 基础设施上的一个新 droplet。大小为 512 MB。我使用了MySQL Yum 存储库。当我尝试启动它时,它莫名其妙地崩溃了,没有任何迹象表明出了什么问题。以下是一些详细信息:

首先,我的 /etc/my.cnf:

[mysqld]
innodb_buffer_pool_size = 5M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
explicit_defaults_for_timestamp = TRUE

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

当我运行时service mysqld start,我得到了这个:

[root@myserver ~]# service mysqld start
MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]

/var/log/mysqld.log输入该命令后的完整内容如下:

140104 22:53:41 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2014-01-04 22:53:42 8177 [Note] Plugin 'FEDERATED' is disabled.
2014-01-04 22:53:42 8177 [Note] InnoDB: The InnoDB memory heap is disabled
2014-01-04 22:53:42 8177 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2014-01-04 22:53:42 8177 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-01-04 22:53:42 8177 [Note] InnoDB: Using Linux native AIO
2014-01-04 22:53:42 8177 [Note] InnoDB: Not using CPU crc32 instructions
2014-01-04 22:53:42 8177 [Note] InnoDB: Initializing buffer pool, size = 5.0M
2014-01-04 22:53:42 8177 [Note] InnoDB: Completed initialization of buffer pool
2014-01-04 22:53:42 8177 [Note] InnoDB: Highest supported file format is Barracuda.
140104 22:53:43 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

没有错误,没有警告,什么都没有。当我运行 时service mysqld status,它显示mysqld dead but subsys locked

有任何想法吗?

更新:我进入 /etc/init.d/mysqld 并添加一行以将其使用的确切启动命令回显到控制台。然后我运行该命令(但不将任何输出重定向到 /dev/null 或使进程后台运行)。结果如下:

[root@myserver ~]# /usr/bin/mysqld_safe --datadir="/var/lib/mysql" --socket="/var/lib/mysql/mysql.sock" --pid-file="/var/run/mysqld/mysqld.pid" --basedir=/usr --user=mysql
140105 08:04:35 mysqld_safe Logging to '/var/log/mysqld.log'.
140105 08:04:35 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
/usr/bin/mysqld_safe: line 166: 10966 Killed                  nohup /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock < /dev/null >> /var/log/mysqld.log 2>&1
140105 08:04:36 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

看起来好像某个外部服务或看门狗在尝试启动时就杀死了 MySQL。但这是什么原因造成的呢?SELinux 似乎没有安装。我不知道还有什么原因……?

答案1

这肯定是内存问题。我查看后发现这一点很明显/var/log/messages。我尝试运行最新版本的 Nginx、PHP-FPM 和 MySQL,这三个的默认配置加在一起对于只有 512 MB 内存且没有交换空间的小 droplet 来说太多了。

我调整了我的/etc/my.cnfPHP-FPM 配置,一切开始正常工作。以下是我的新配置,my.cnf仅供参考:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
explicit_defaults_for_timestamp = TRUE
key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K
innodb_buffer_pool_size = 56M
innodb_flush_neighbors=0
innodb_flush_log_at_trx_commit=2
character-set-server=utf8
collation-server=utf8_general_ci

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

我添加的各种参数都是从各种专注于低内存 mysqld 部署的博客和教程网站拼凑起来的,例如这里这里

答案2

我首先要检查的是 SELinux。首先将其设置为 Permissive 模式

setenforce 0

然后尝试启动 mysql。如果它启动了,那么我们肯定知道 SELinux 是罪魁祸首。如果是这种情况,那么 /var/log/audit/audit.log 将包含与 MySQL 相关的 AVC 拒绝消息,这将有助于您进一步诊断问题。

不要忘记启用 SELinux 强制模式。

setenforce 1

相关内容