Systemd Mysql不会停止


17

升级到15.04之后,我对认识systemd感到很开心。我想除了我无法停止mysql.service之外,其他所有东西都可以工作;systemctl命令只是挂起,而mysql继续运行。有没有其他人经历过这种情况,或者可能知道发生了什么事?


2
默认情况下,它会在3分钟后用SIGKILL破坏服务(如果服务无法正常终止)。可能您必须阅读mysql.service的配置。
Velkan

2
您正在运行哪个版本的MySQL?您使用他们的本机mysql.service脚本还是自己滚动脚本?
2015年

它是5.6,来自官方生动的仓库。我正在使用该软件包随附的脚本。
Craig Dunford

我们遇到了同样的问题,并提交了错误报告
EOLE队

Answers:


25

我遇到了同样的问题(使用官方文件和配置升级到15.04)。

我必须进行以下更改,才能mysql手动停止守护程序,sytemctl并在系统重新引导/关闭时自动停止守护程序:

  1. 使用户/etc/mysql/debian.cnf可读mysql

    sudo chgrp mysql /etc/mysql/debian.cnf; sudo chmod 640 /etc/mysql/debian.cnf
    
  2. 提供稍微修改的mysql.service文件:

    sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/
    sudo chmod 755 /etc/systemd/system/mysql.service
    
  3. 通过在编辑器中打开复制的文件来提供明确的停止命令:

    sudo nano /etc/systemd/system/mysql.service
    

    并在该[Service]部分下添加以下行:

    ExecStop=/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown
    

    在Nano中,使用Ctrl + O保存(Linux方式!),使用Ctrl + X退出。

  4. 使系统知道新的服务文件:

    sudo systemctl daemon-reload
    

我的Kubuntu在关闭期间开始冻结,原因是MySQL Community Server正在运行停止作业[1min 16s / 10min]。这个答案解决了这个问题,非常感谢。
lolmaus-安德烈·米哈伊洛夫(Andrey Mikhaylov),2015年

我的14.10-> 15.04升级(将MySQL 5.5移至5.6)引起了相同的问题。尽管MySQL可以正常运行,但无法正常关闭,因此Ubuntu会在关闭时挂起。该问题似乎与MySQL版本更改以及systemd替换新贵有关。此链接涵盖了对MySQL配置的一些更新,以整理出警告等信息。启动MySQL总是也会抱怨不正确的关闭,因为systemd会在10分钟后杀死该进程,如果您可以等待那么长时间。
迈克

1
Debian Jessie中的相同问题/使用MySQL 5.6测试-感谢您解决了:)
Majenko 2015年

我讨厌这样做,但是我很高兴它能起作用,谢谢Udo!
加布里埃尔·贝克

它不能解决LinuxMint 18上的问题。– sivaprasadreddy.k
2016年

1

我在Ubuntu 15.10 Desktop上遇到了相同的问题,并且找到了解决方法:

/etc/mysql/mysql.conf.d/mysqld.cnf中的log_error参数已被注释掉。取消注释该参数后,systemd会毫无问题地关闭mysqld。


我在Ubuntu LTS 16.04上遇到了相同的问题。仅禁用error.log在起作用。现在,mysqld通过该--log-syslog选项将日志写入日志。可能是原因:根文件系统是btrfs。
ingopingo

1

您的问题是thread_pool_size。如果它比内核/线程数高得多,除非使用mysqladmin shutdown命令,否则将无法正确关闭。

例如:您有2核CPU和4个线程。如果将其设置为1-4,它将可以正常工作。如果您将其设置为16(如许多“高性能”博客中所建议的那样),它会令人讨厌。


1

我也遇到了类似的问题,mysql / mariadbsystemd指示下无法停止,无论是关机还是手动调用sudo service mysql stop

在我的情况下,我以UEFI模式双重引导Ubuntu / Windows,并且这些OS解释不同的硬件时间,因此这两个OS在启动时都会与Internet时间服务器同步。

如果在运行时更改了硬件时间,MySQL(和Mariadb)将无法停止。

您需要将启动MySQL的时间推迟到时间同步之后。理想情况下,可以通过在mysql上插入一个时间依赖来完成,After: time-sync但这对我不起作用。

对我有用的解决方案(您可以用mariadb替换mysql以达到相同的效果):

  1. 使用禁用MySQL sudo systemctl disabled mysql.service

  2. 创建一个脚本(确保它是可执行的),该脚本将在/usr/bin/delay_mysql内容延迟一段时间后启动mysql :

    #!/bin/sh
    sleep 30s
    /etc/init.d/mysql start
    
  3. 创建一个systemd服务以运行/etc/systemd/system/delay_mysql.service 包含内容的新脚本 :

    [Unit]
    Description=Delay start of MySQL / MariaDB
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/delay_mysql
    
    [Install]
    WantedBy=multi-user.target  
    
  4. 使用注册新服务 sudo systemctl enable delay_mysql.service

这将使您的脚本以多用户级别运行,在Ubuntu上为3、4、5。


解决了我的问题。但是,需要特别注意的是,在重新安装MySql之前,应禁用delay_mysql.service,否则会出现错误。
SiGe

0

只是在复制时,mysql.service您就需要做些chmod之后的事情。

cp /lib/systemd/system/mysql.service /etc/systemd/system/
chmod 755 /etc/systemd/system/mysql.service

0

在我的情况下,它是为维护用户的密码不匹配debian-sys-maint之一之间/etc/mysql/debian.cnf,一个在MySQL数据库。

该用户用于MySQL关闭和其他功能。MySQL更新后,可能会发生文件和数据库之间的传递不匹配的情况。如果将数据库从一个MySQL迁移到另一个MySQL,也可能会发生这种情况。如果要从其他计算机上的其他MySQL导入所有数据库和用户,则需要重新同步维护用户(debian-sys-maint)密码。

您需要执行以下操作:在ubuntu / debian文件中检查当前密码:

sudo cat /etc/mysql/debian.cnf

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = n4aSHUP04s1J32X5
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password = n4aSHUP04s1J32X5
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

您可以在此处查看系统将使用的密码: password = n4aSHUP04s1J32X5

下一步是将MySQL更新为相同的密码:登录MySQL:

~$ mysql -u root -p

输入密码以访问MySQL

mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'n4aSHUP04s1J32X5';**

之后,关闭不再有问题,没有10分钟的等待,安装使用该维护帐户(如phpmyadmin)的应用程序也没有问题。

更新:不幸的是,这并没有解决问题。它是随机的-有时我可以停止服务而不会发出其他通知,因为它将在服务停止时冻结。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.