mysql 服务无法启动/挂断 - 超时(Ubuntu、MariaDB)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40997257/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
mysql service fails to start/hangs up - timeout (Ubuntu, MariaDB)
提问by Lw Bi
I set up my first Ubuntu Server with Ubuntu 16.04, nginx, php7.0, MariaDB, nextcloud and external DynDNS using this tutorial here: Install Nextcloud 9 on Ubuntu 16.04
我在此处使用本教程使用 Ubuntu 16.04、nginx、php7.0、MariaDB、nextcloud 和外部 DynDNS 设置了我的第一个 Ubuntu 服务器:在 Ubuntu 16.04 上安装 Nextcloud 9
Everything worked fine but since I restarted the server the next day, nextcloud just shows me a blank page. After clicking through all logs of nginx, MariaDB and nextcloud, I found out that the mysql service just doesn't start. So run service mysql start
and everything worked fine again (calling nextcloud from server as well as other workstations). I just wondered that the terminal didn't "close" the line. Like it was still working on the command. After about 5 minutes, the line "closes" and the following message appears:
一切正常,但由于我第二天重新启动服务器,nextcloud 只显示一个空白页面。点开nginx、MariaDB和nextcloud的所有日志后,发现mysql服务就是没有启动。所以运行service mysql start
,一切正常(从服务器和其他工作站调用 nextcloud)。我只是想知道终端没有“关闭”线路。就像它仍在处理命令一样。大约 5 分钟后,该行“关闭”并显示以下消息:
"Job for mariadb.service failed because a timeout was exceeded. See "systemctl status mariadb.service" and "journalctl -xe" for details."
“mariadb.service 的作业因超时而失败。有关详细信息,请参阅“systemctl status mariadb.service”和“journalctl -xe”。”
Then the clients again just get a blank page in nextcloud. When I run the command and close the terminal immediately, clients get the access as well but still loses it after 5 minutes.
然后客户端再次在 nextcloud 中得到一个空白页面。当我运行命令并立即关闭终端时,客户端也可以获得访问权限,但在 5 分钟后仍然丢失它。
I tried backing up the nextcloud, sql and run apt-get purge --auto-remove mariadb-server
. Then again run the MariaDB installation steps out of the tutorial with importing the backup sql instead of creating a new one. Didn't change everything.
我尝试备份 nextcloud、sql 和 run apt-get purge --auto-remove mariadb-server
。然后再次运行教程中的 MariaDB 安装步骤,导入备份 sql 而不是创建一个新的。没有改变一切。
Next try was update-rc.d mysql defaults
and update-rc.d mysql enable
. But after a restart just the blank page again. Access is only possible for 5 minutes by starting the service manual.
下一次尝试是update-rc.d mysql defaults
和update-rc.d mysql enable
。但是重启后又是空白页。通过启动服务手册,只能访问 5 分钟。
I also tried the BUM - BootUpManagerbut the service seems to be enabled. I saw you can start services out oft it manually as well. So tried it with mysql and surprise: nextcloud available for 5 minutes while BUM just hangs up.
我也尝试了BUM - BootUpManager,但该服务似乎已启用。我看到您也可以手动启动服务。所以用 mysql 和惊喜尝试了一下:nextcloud 可用 5 分钟,而 BUM 只是挂断了。
I found mariadb.com/kb/en/mariadb/starting-and-stopping-mariadb-automatically/ as well but tried nothing of it because it seems like there is something else really wrong.
我也找到了 mariadb.com/kb/en/mariadb/starting-and-stopping-mariadb-automatically/ 但什么也没试,因为似乎还有其他事情真的错了。
root@s1:~# systemctl status mariadb.service
:
root@s1:~# systemctl status mariadb.service
:
\u25cf mariadb.service - MariaDB database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset:
Drop-In: /etc/systemd/system/mariadb.service.d
\u2514\u2500migrated-from-my.cnf-settings.conf
Active: failed (Result: timeout) since Di 2016-12-06 14:52:51 CET; 55s ago
Process: 3565 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WS
Process: 3415 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR
Process: 3409 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START
Process: 3405 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/ru
Main PID: 3565 (code=exited, status=0/SUCCESS)
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] /usr/sbin
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] Event Sch
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 2147785536 [Note] InnoDB: F
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] InnoDB: S
Dez 06 14:52:49 s1 mysqld[3565]: 2016-12-06 14:52:49 3067387712 [Note] InnoDB: W
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] InnoDB: S
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] /usr/sbin
Dez 06 14:52:51 s1 systemd[1]: Failed to start MariaDB database server.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Unit entered failed state.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Failed with result 'timeout'.
root@s1:~# journalctl -xe
:
root@s1:~# journalctl -xe
:
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] Event Scheduler: Purging the queue. 0 events
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 2147785536 [Note] InnoDB: FTS optimize thread exiting.
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] InnoDB: Starting shutdown...
Dez 06 14:52:49 s1 mysqld[3565]: 2016-12-06 14:52:49 3067387712 [Note] InnoDB: Waiting for page_cleaner to finish flushing of buffer po
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] InnoDB: Shutdown completed; log sequence number 111890806
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] /usr/sbin/mysqld: Shutdown complete
Dez 06 14:52:50 s1 audit[3648]: AVC apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profi
Dez 06 14:52:50 s1 kernel: audit: type=1400 audit(1481032370.973:29): apparmor="DENIED" operation="sendmsg" info="Failed name lookup -
Dez 06 14:52:50 s1 audit[3565]: AVC apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profi
Dez 06 14:52:50 s1 kernel: audit: type=1400 audit(1481032370.973:30): apparmor="DENIED" operation="sendmsg" info="Failed name lookup -
Dez 06 14:52:51 s1 systemd[1]: Failed to start MariaDB database server.
-- Subject: Unit mariadb.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mariadb.service has failed.
--
-- The result is failed.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Unit entered failed state.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Failed with result 'timeout'.
Dez 06 14:54:54 s1 x11vnc[2665]: 06/12/2016 14:54:54 cursor_noshape_updates_clients: 1
Dez 06 14:55:16 s1 ntpd[1244]: 46.4.1.155 local addr 192.168.178.50 -> <null>
Dez 06 14:57:30 s1 ntpd[1244]: 89.238.66.98 local addr 192.168.178.50 -> <null>
Content in /ect/init.d (if useful):
/ect/init.d 中的内容(如果有用):
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: mysql
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $network $named $time
# Should-Stop: $network $named $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop the mysql database server daemon
# Description: Controls the main MariaDB database server daemon "mysqld"
# and its wrapper script "mysqld_safe".
### END INIT INFO
#
set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
test -x /usr/sbin/mysqld || exit 0
. /lib/lsb/init-functions
SELF=$(cd $(dirname $ echo "/usr/sbin/mysqld { }" > /etc/apparmor.d/usr.sbin.mysqld
$ apparmor_parser -v -R /etc/apparmor.d/usr.sbin.mysqld
$ systemctl restart mariadb
); pwd -P)/$(basename sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo service apparmor reload
sudo service mysql restart
)
CONF=/etc/mysql/my.cnf
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
# priority can be overriden and "-s" adds output to stderr
ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"
# Safeguard (relative paths, core dumps..)
cd /
umask 077
# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
# as many admins e.g. only store a password without a username there and
# so break my scripts.
export HOME=/etc/mysql/
# Source default config file.
[ -r /etc/default/mariadb ] && . /etc/default/mariadb
## Fetch a particular option from mysql's invocation.
#
# Usage: void mysqld_get_param option
mysqld_get_param() {
/usr/sbin/mysqld --print-defaults \
| tr " " "\n" \
| grep -- "--" \
| tail -n 1 \
| cut -d= -f2
}
## Do some sanity checks before even trying to start mysqld.
sanity_checks() {
# check for config file
if [ ! -r /etc/mysql/my.cnf ]; then
log_warning_msg ":~$ sudo aa-complain /usr/sbin/mysqld
: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
echo "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
fi
# check for diskspace shortage
datadir=`mysqld_get_param datadir`
if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit (>4096) }'; then
log_failure_msg "ERROR: /etc/apparmor.d/usr.sbin.mysqld contains no profile
: ERROR: The partition with $datadir is too full!"
echo "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
exit 1
fi
}
## Checks if there is a server running and if so if it is accessible.
#
# check_alive insists on a pingable server
# check_dead also fails if there is a lost mysqld in the process list
#
# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))
ps_alive=0
pidfile=`mysqld_get_param pid-file`
if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
if [ "" = "check_alive" -a $ping_alive = 1 ] ||
[ "" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then
return 0 # EXIT_SUCCESS
else
if [ "" = "warn" ]; then
echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
fi
return 1 # EXIT_FAILURE
fi
}
#
# main()
#
case "${1:-''}" in
'start')
sanity_checks;
# Start daemon
log_daemon_msg "Starting MariaDB database server" "mysqld"
if mysqld_status check_alive nowarn; then
log_progress_msg "already running"
log_end_msg 0
else
# Could be removed during boot
test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld
# Start MariaDB!
/usr/bin/mysqld_safe "${@:2}" > /dev/null 2>&1 &
# 6s was reported in #352070 to be too little
for i in $(seq 1 "${MYSQLD_STARTUP_TIMEOUT:-60}"); do
sleep 1
if mysqld_status check_alive nowarn ; then break; fi
log_progress_msg "."
done
if mysqld_status check_alive warn; then
log_end_msg 0
# Now start mysqlcheck or whatever the admin wants.
output=$(/etc/mysql/debian-start)
[ -n "$output" ] && log_action_msg "$output"
else
log_end_msg 1
log_failure_msg "Please take a look at the syslog"
fi
fi
;;
'stop')
# * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible
# at least for cron, we can rely on it here, too. (although we have
# to specify it explicit as e.g. sudo environments points to the normal
# users home and not /root)
log_daemon_msg "Stopping MariaDB database server" "mysqld"
if ! mysqld_status check_dead nowarn; then
set +e
shutdown_out=`$MYADMIN shutdown 2>&1`; r=$?
set -e
if [ "$r" -ne 0 ]; then
log_end_msg 1
[ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out"
log_daemon_msg "Killing MariaDB database server by signal" "mysqld"
killall -15 mysqld
server_down=
for i in `seq 1 600`; do
sleep 1
if mysqld_status check_dead nowarn; then server_down=1; break; fi
done
if test -z "$server_down"; then killall -9 mysqld; fi
fi
fi
if ! mysqld_status check_dead warn; then
log_end_msg 1
log_failure_msg "Please stop MariaDB manually and read /usr/share/doc/mariadb-server-10.1/README.Debian.gz!"
exit -1
else
log_end_msg 0
fi
;;
'restart')
set +e; $SELF stop; set -e
$SELF start
;;
'reload'|'force-reload')
log_daemon_msg "Reloading MariaDB database server" "mysqld"
$MYADMIN reload
log_end_msg 0
;;
'status')
if mysqld_status check_alive nowarn; then
log_action_msg "$($MYADMIN version)"
else
log_action_msg "MariaDB is stopped."
exit 3
fi
;;
'bootstrap')
# Bootstrap the cluster, start the first node
# that initiates the cluster
log_daemon_msg "Bootstrapping the cluster" "mysqld"
$SELF start "${@:2}" --wsrep-new-cluster
;;
*)
echo "Usage: $SELF start|stop|restart|reload|force-reload|status|bootstrap"
exit 1
;;
esac
Unfortunately, Google can't help me. I tried to explain as much as I can maybe this helps you in helping me. Thanks a lot!
不幸的是,谷歌帮不了我。我试着尽可能多地解释,也许这有助于你帮助我。非常感谢!
采纳答案by Lw Bi
Long question for nothing... Never heard of AppArmor but it was the reasen. The answer herefixed it. Don't care about apparmor's ERROR the profile wouldn't exist.
毫无意义的长问题......从未听说过AppArmor,但它是reasen。这里的答案修复了它。不关心 apparmor 的 ERROR 配置文件将不存在。
sudo aa-status
shows you what apparmor is doing; what actually has an enforced policy, versus what's just set to complain.
sudo apt-get install apparmor-utils
adds a few commands that make the apparmor profiles easier to deal with, such as...
sudo aa-complain /usr/sbin/mysqld
turns the profile from "enforce" to complain. (aa-enforce turns it back.)Once that's done,
sudo service apparmor reload
restarts apparmor, and voila...sudo /etc/init.d/mysql start
works, and the server stays up.
sudo aa-status
向您展示 apparmor 正在做什么;什么实际上有强制执行的政策,而不是刚刚设置的抱怨。
sudo apt-get install apparmor-utils
添加了一些使 apparmor 配置文件更易于处理的命令,例如...
sudo aa-complain /usr/sbin/mysqld
将配置文件从“强制”变为抱怨。(aa-enforce 将其返回。)完成后,
sudo service apparmor reload
重新启动 apparmor,瞧...sudo /etc/init.d/mysql start
工作,并且服务器保持运行状态。
回答by quazgar
In case you are bitten by this bug, the solution is given as a suggestion in the bug report:
如果你被这个 bug咬了,解决方案在 bug 报告中作为建议给出:
echo "/usr/sbin/mysqld { }" > /etc/apparmor.d/usr.sbin.mysqld
apparmor_parser -v -R /etc/apparmor.d/usr.sbin.mysqld
systemctl restart mariadb
echo "/usr/sbin/mysqld { }" > /etc/apparmor.d/usr.sbin.mysqld
apparmor_parser -v -R /etc/apparmor.d/usr.sbin.mysqld
systemctl restart mariadb
Background
背景
If you previously had MySQL installed, it activated an AppArmor profile which is incompatible with MariaDB. apt-get remove --purge
only removes the profile, but does not deactivate/unload it. Only manually unloading it lets MariaDB work unhindered by AppArmor.
如果您之前安装了 MySQL,它会激活一个与 MariaDB 不兼容的 AppArmor 配置文件。 apt-get remove --purge
仅删除配置文件,但不会停用/卸载它。只有手动卸载它才能让 MariaDB 工作不受 AppArmor 的阻碍。
回答by Gert Kruger
This last option worked for me (from quazgar). I have Ubuntu 18.10 installed with MariaDB 10.3.13:
最后一个选项对我有用(来自 quazgar)。我安装了带有 MariaDB 10.3.13 的 Ubuntu 18.10:
/usr/sbin/mysqld {
}
I had to use "sudo su" for it to work though.
不过,我必须使用“sudo su”才能使其工作。
回答by Vincent
Moving mysqld to "complain" group was not enough in my case (MariaDB 10.1.21 running on Ubuntu 16.04). I had to fully disable apparmor for mysqld:
在我的情况下,将 mysqld 移动到“抱怨”组还不够(MariaDB 10.1.21 在 Ubuntu 16.04 上运行)。我必须完全禁用 mysqld 的 apparmor:
sudo dpkg --configure -a
sudo service mysql start
Now everything works fine.
现在一切正常。
回答by kerzane
FYI:
供参考:
In my case neither the solution of Vincent or Lw Bi worked exactly, I needed some further actions.
就我而言,Vincent 或 Lw Bi 的解决方案都没有完全奏效,我需要采取一些进一步的行动。
Disabling the profile through placing a link in /etc/apparmor.d/disable/
simply didn't work, I don't know why.
通过放置链接来禁用配置文件/etc/apparmor.d/disable/
根本不起作用,我不知道为什么。
On the other hand, setting MySQL to complain mode didn't work either immediately.
另一方面,将 MySQL 设置为抱怨模式也不会立即起作用。
sudo tee /etc/systemd/system/mariadb.service.d/timeoutsec.conf <<EOF
[Service]
TimeoutStartSec=0
TimeoutStopSec=0
EOF
sudo systemctl daemon-reload
Setting /usr/sbin/mysqld
to complain mode.
设置/usr/sbin/mysqld
为投诉模式。
sudo killall mysqld
I needed to add the lines:
我需要添加以下几行:
sudo systemctl restart mysql.service
to /etc/apparmor.d/usr.sbin.mysqld
, and then I could set it to complain mode successfully.
到/etc/apparmor.d/usr.sbin.mysqld
,然后我可以成功地将它设置为抱怨模式。
回答by Dave Hindle
Please note that since 10.1.10, MariaDB uses systemd to start the service. If you have tried MYSQLD_STARTUP_TIMEOUT and it has not worked, you are probably using this or a later version. The /etc/init.d/mysql script is no longer used, so MYSQLD_STARTUP_TIMEOUT has no effect.
请注意,从 10.1.10 开始,MariaDB 使用 systemd 来启动服务。如果您尝试过 MYSQLD_STARTUP_TIMEOUT 并且没有奏效,则您可能正在使用此版本或更高版本。不再使用 /etc/init.d/mysql 脚本,因此 MYSQLD_STARTUP_TIMEOUT 不起作用。
You need to find your mariadb.service file. In our case, it did not contain a timeout so the MariaDB default was being used. Just add:
您需要找到您的 mariadb.service 文件。在我们的例子中,它不包含超时,因此使用的是 MariaDB 默认值。只需添加:
TimeoutStartSec = 0
超时开始秒 = 0
In the [Service] section, and it will never time out.
在 [Service] 部分,它永远不会超时。
It would be a good idea to create your own config file containing this so it doesn't get overwritten by later re-installs.
创建包含它的自己的配置文件是个好主意,这样它就不会被以后的重新安装覆盖。
On ubuntu 18.04, you will fine this file in
在 ubuntu 18.04 上,您将在
/lib/systemd/system/mariadb.service
/lib/systemd/system/mariadb.service
Put your own file in
放入自己的文件
/etc/systemd/system/mariadb.service.d
/etc/systemd/system/mariadb.service.d
Remember to run systemctl daemon-reload after adding the timeout somewhere (and maybe check /var/log/syslog to see if the reload was successful), otherwise your time out will be ignored.
记得在某处添加超时后运行 systemctl daemon-reload (可能检查 /var/log/syslog 以查看重新加载是否成功),否则您的超时将被忽略。
回答by Mahbub
Run the following commands:
运行以下命令:
##代码##回答by Jaguar
I also faced the same issue. You need to set appropriate timeout in the systemd config for mariadb service. Below solved same for me. for ex. When system requires SST it may take long time for mariadb service to come up causing the timeout in systemd.
我也面临同样的问题。您需要在 systemd 配置中为 mariadb 服务设置适当的超时。下面为我解决了同样的问题。例如。当系统需要 SST 时,mariadb 服务可能需要很长时间才能启动,从而导致 systemd 超时。
If you are using systemd 228 or older, then you can execute the following to set an infinite timeout.
如果您使用的是 systemd 228 或更早版本,则可以执行以下操作来设置无限超时。
##代码##For other options please refer to https://mariadb.com/kb/en/systemd/
回答by smac89
The solution for me was to run the following:
我的解决方案是运行以下命令:
##代码##If you are still experiencing this issue, run the command ps -aux | grep 'mysql'
. if anything shows up, just kill it as well.
如果您仍然遇到此问题,请运行命令ps -aux | grep 'mysql'
。如果出现任何情况,也将其杀死。
Finally run:
最后运行:
##代码##回答by Meetai.com
This is what worked for me:
这对我有用:
The correction didn't work for me.
$ sudo aa-complain /usr/sbin/mysqld Setting /usr/sbin/mysqld to complain mode.
ERROR: /etc/apparmor.d/usr.sbin.mysqld contains no profile So I disabled the profile (with aa-disable which seems to be equivalent to plutocrat's solution)
$ sudo aa-disable /usr/sbin/mysqld Disabling /usr/sbin/mysqld. I disabled mysqld-akonadi and mysqld-digikam as well.
An apparmor reload was not enough, so I had to reboot and mariadb started perfectly well.
修正对我不起作用。
$ sudo aa-complain /usr/sbin/mysqld 将 /usr/sbin/mysqld 设置为抱怨模式。
错误:/etc/apparmor.d/usr.sbin.mysqld 不包含配置文件所以我禁用了配置文件(使用 aa-disable 似乎相当于 plutocrat 的解决方案)
$ sudo aa-disable /usr/sbin/mysqld 禁用 /usr/sbin/mysqld。我也禁用了 mysqld-akonadi 和 mysqld-digikam。
apparmor 重新加载是不够的,所以我不得不重新启动并且 mariadb 启动得非常好。