【发布时间】:2016-03-31 20:59:00
【问题描述】:
每天一次,我通过 cron 重新启动我的 mysql。有时,服务挂起并且无法启动。所以,我需要检查 mysql 是否正在运行(例如:服务 mysqld 状态),如果没有运行,则启动 mysqld。有人可以为此操作提供一个简单的脚本吗?
【问题讨论】:
标签: mysql linux service centos
每天一次,我通过 cron 重新启动我的 mysql。有时,服务挂起并且无法启动。所以,我需要检查 mysql 是否正在运行(例如:服务 mysqld 状态),如果没有运行,则启动 mysqld。有人可以为此操作提供一个简单的脚本吗?
【问题讨论】:
标签: mysql linux service centos
首先创建一个 bash 脚本
#!/bin/bash
UP=$(service mysql status|awk '{ print $1}');
if [ "$UP" != 'SUCCESS!' ];
then
echo "MySQL is down.";
sudo service mysql start
else
echo "All is well.";
fi
第二次添加一个 crontab,每 3 分钟运行一次
*/3 * * * * /home/user/scripts/monitor.sh > /dev/null 2>&1
注意:此解决方案必须根据您的发行版(服务、/etc/init.d/systemctl、mysql、mysqld)进行编辑
原始答案(我认为应该使用 Cpanel,因为标记 cpanel 它已发布)
Cpanel 允许您控制某些服务,并通过 chksrvd 轻松添加其他服务。 Mysql 为此你只需要配置它。
首页 >> 服务配置 >> 服务管理器
Alli 可以为这个监控配置 MySQL,如果他们试图通过系统解除跌倒。
https://documentation.cpanel.net/display/CKB/TailWatch
最好修改 /var/lib/mysql/.err generalemnte 中的 MySQL 日志
【讨论】:
简单回答:您可以使用单个命令并将其添加到 cron 作业中,而不是使用 bash 脚本。
* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld
详细回答:
如果 MySQL 退出,可能是您的服务器配置 (Apache | nginx) 或 MySQL 配置有问题。 DOS 攻击或系统进程可能会导致系统资源使用量激增(见图)。最终结果是 MySQL 进程被内核关闭。对于长期解决方案,应该着眼于优化您的 Apache 或 MySQL 配置。
还有其他几个讨论 Stack Overflow 这些主题以及 MySQL 手册和 Percona 博客:
MySQL 手册 - MySQL 如何使用内存:
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
Percona 服务器:使用 Percona 线程池提高可扩展性
https://www.percona.com/blog/2014/01/28/10-mysql-performance-tuning-settings-after-installation/
Percona - 配置最佳 MySQL 内存使用的最佳实践:
https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/
如何使用 MySQLTuner 优化 MySQL 性能:
https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/
Apache 内存使用配置:
https://serverfault.com/questions/254436/apache-memory-usage-optimization
Apache 性能调优手册:
https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
调整 Apache 服务器:
https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/
但是,就您最初的问题而言,是的,您可以编写一个临时解决方案来检查 MySQL 服务是否已加载并处于活动状态,如果 MySQL 服务未加载且处于活动状态,则将重新启动它。
您没有提及您使用的是什么操作系统。这将有助于给你一个特定的命令。我会给你一个 CentOS linux 的例子。
查看命令systemctl status mysql 的以下输出。您可以在顶部看到该服务已加载并且活动。
[root@centos-mysql-demo ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 3353 (mysqld)
CGroup: /system.slice/mysqld.service
└─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.
如果服务没有加载,那么一个命令比如:
systemctl status mysqld || systemctl restart mysqld
将完成重新启动该过程的技巧。您可以 cron:
* * * * * systemctl status mysqld || systemctl restart mysqld
但是,如果 mysql 已加载,但服务未激活,您的 cron 将什么也不做。因此,您应该使用更详细的命令,例如:
* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld
这种情况下,如果服务loaded但inactive比如DOS攻击可以离开你的mysql服务的状态,该命令也会重启mysql。使用--quiet 标志只是指定该命令只返回一个状态码,不向屏幕输出任何内容。如果省略--quiet 标志,您将看到active 或inactive 的状态输出。
您也可以创建一些交换空间来为您的服务器添加更多可用的 RAM 资源,尽管 Apache 和 MySQL 手册都指定您不希望这些应用程序需要交换空间。
sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h
【讨论】: