1.问题描述
有一次,由于MySQL故障,一线工作人员报告MySQL无法启动,报错: to start mysql ERROR! 退出PID文件(/usr/local/mysql/data/mysql.pid)
/support-files/mysql.server start //报错如下
Starting MySQL... ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
2.问题分析
1)pid文件丢失。 MySQL本身存在一个问题,重启后pid文件丢失,并且重启后目录不会重建。 可能的原因:
mysql端口被占用
生成pid文件的目录mysql权限不足或目录不存在
mysql对应的f配置文件错误
mysql的启动脚本有问题
Mysql有残留数据影响服务启动
2)MySQL启动:除了作为服务启动外,还可以使用脚本启动。 MySQL启动时会读取配置文件中的选项
作为启动选项,初始化池并检查最后的事务。 如果配置文件错误,仍然无法启动,也会报上述错误。
mysql。 也是管理MySQL服务器的脚本,其底层调用该脚本。
mysql.start
对于多个实例的启动,是MySQL提供的一个脚本,用于管理多个MySQL服务器。 可以同时启动或停止多个MySQL服务器。 当我们运行脚本时,脚本会在配置文件中查找名为[]的选项,N可以是任意正整数。
[] {开始|停止||}N
#配置文件示例:
[]
= /tmp/mysql.sock2
端口=3306
pid 文件 = /usr/local/mysql/data2/.pid2
= /usr/local/mysql/data2
= /usr/local/mysql/share/mysql/
用户=
[]
= /路径/到/
ledir = /路径/到/-/
= /路径/到/
= /tmp/mysql.sock3
端口=3307
pid 文件 = /usr/local/mysql/data3/.pid3
= /usr/local/mysql/data3
= /usr/local/mysql/share/mysql/
用户=
start #启动配置文件中的所有示例
开始 1 # 开始
-p -u root #关闭
3)关于MySQL的启动,默认由普通用户启动,启动账号可配置如下:
1)vi /etc/f
[]
用户=mysql
2)命令中指定:-u mysql,如果配置文件中指定的选项与命令行中指定的选项相同,则命令行中指定的选项优先
建议使用普通mysql用户启动MySQL。 如果使用“超级管理员”或“本地系统用户”运行“MySQL数据库”,就会被黑客利用,以用户权限入侵服务器。 因此,为了服务器安全,MySQL必须以“普通用户”身份运行。 查看启动脚本可以看到:
4)检查mysql日志,定位mysql启动失败的原因。
2023-06-22T09:36:07.486970Z 0 [ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock.
2023-06-22T09:36:07.486975Z 0 [ERROR] Unable to setup unix socket lock file.
2023-06-22T09:36:07.486980Z 0 [ERROR] Aborting
报上述错误是因为Mysql主机上的定时任务日志根目录已满,即磁盘已满,导致MySQL重启时崩溃,并且mysql.
三、加工
1)检查配置,确认pid文件存在且权限为mysql; 接收重写后的pid文件:
chown mysql.mysql /var/run/mysqld/
ps -ef|grep mysqld|awk '{print $2}'|sed 1d |sed 2d > mysql.pid
当使用启动mysql时,会检查pid文件。 如果不存在,启动后会通过该函数创建一个新的pid文件,通过()获取当前进程pid并将PID写入到pid文件中。
2)用-xe查看日志,找到错误点,一般是权限问题。 本例将data下的bin日志文件权限问题改为mysql,开始恢复; 现场报错:File './mysql-bin.index' not find (: 13 - ),一般是权限问题。
3)检查MySQL配置文件是否有配置错误。 本例f中skip-grant-配置错误,修正后开始恢复。
4)当你不确定启动脚本中的参数还是mysql. 配置文件正常,先使用方法启动,检查是否可以启动
./mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
或
./mysqld_safe --user=mysql&
如果可以启动,检查mysql启动脚本或者mysql.conf文件中的参数。 配置文件并修改它们。
mysql。 程序主要使用了两个程序和一个函数,分别是和ts; mysql。 首先会给参数-和-pid-file赋值,这两个参数是从f文件的[]部分读取的,并且这两个参数的值不会被程序中的参数赋值覆盖。 但是,如果f中的其他参数值与[]和[]相同,那么它将被视为。
:读取f配置文件,输出参数传递给ts,程序只读取f中[]中的参数。
ts:该函数处理传递参数到 –, –, –pid-file, –- 的分配
:程序调用程序启动mysql服务。
5)错误报告:
执行:-debug,错误:
-debug: error while: .so.1: 打开文件: 没有这样的文件或
安装:yum -y
6)执行:
对于“mysql”为:mysql
对于作为:
错误:同时! 可能是由于 .
致命错误:
7)初始化mysql时发生错误:mysql安装报FATAL ERROR: Perl
原因:缺少数据::; perl模块中的安装库(数据:安装此包时将安装模块)
解决方法:安装库
命令:yum -y
重新初始化数据库后,MySQL成功启动,这说明数据库中有脏数据,因为我复制了整个包。
/support-files/mysql.server start //输出如下
Starting MySQL. SUCCESS!
8)有一次,由于加固基线,修改了配置文件,添加了如下配置,但是-id和slow-log-query--file参数没有配置,写错了
log-error=/var/log/mysql/mysqld.log
#mysql log config
general_log = on
general_log_file=/var/log/mysql/general.log
slow_query_log = on
slow-query-log-file=/var/log/mysql/slowquery.log
long_query_time=2
server-id=1 ##给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号
log-bin=master-bin ##这个可单独
log-bin-index=master-bin.index #这个可单独
log_slave_updates = on
9)对于因/mysql.sock.lock而无法启动的mysql,执行:mv /tmp/mysql.sock.lock /tmp/mysql.sock.lock.bak,或者直接删除,然后重启即可正常。
4.MySQL启动脚本及权限
#!/bin/bash
# chkconfig: 2345 64 36 #配置系统自启动
# description: A very fast and reliable SQL database engine.
##############################################################
# File Name: mysqld
# Version: V1.0
# Author:
# Organization:
# Created Time : 2020-03-05
##############################################################
#引入系统函数库
. /etc/init.d/functions
#基础路径定义
basedir='/application/mysql'
bindir='/application/mysql/bin'
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
mysqld_pid_file_path='$basedir/data/`uname -n`.pid'
#成功提示函数
log_success_msg(){
#action为特殊的提示函数,$@为所有参数。
action "SUCCESS! $@" /bin/true
}
#失败提示函数
log_failure_msg(){
action "ERROR! $@" /bin/false
}
#mysql启动函数
start(){
echo $"Starting MySQL"
#测试mysqld_safe是否可执行
if test -x $bindir/mysqld_safe
then
#后台执行启动mysql命令
$bindir/mysqld_safe &>/dev/null &
#获取返回值
retval=$?
#判断返回值是否为0
if [ $retval -eq 0 ]
then
#调用成功提示函数。
log_success_msg "mysql Startup"
if test -w "$lockdir" #判断锁目录是否可写。
then
touch "$lock_file_path" #创建锁文件。
fi
return $retval #给返回值是专业的表现。
else
log_failure_msg "MySQL Startup" #调用失败函数提示。
return $retval
fi
else
log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
fi
}
#停止MySQL函数。
stop(){
#判断mysql pid file大小是否为0。
if test -s "$mysqld_pid_file_path"
then
#读取pidfile
mysqld_pid=`cat "$mysqld_pid_file_path"`
#判断mysql pid对应的进程是否存在。
if (kill -0 $mysqld_pid 2>/dev/null)
then
echo $"Shutting down MySQL"
kill $mysqld_pid #停止MySQL命令。
retval=$?
if [ $retval -eq 0 ]
then
log_success_msg "MySQL Stop" #调用停止成功函数。
if test -f "$lock_file_path"
then
rm -f "$lock_file_path" #删除锁文件。
fi
return $retval
else
log_failure_msg "MySQL Stop."
return $retval
fi
else
log_failure_msg "MySQL server process mysqld_pid is not running!"
rm "$mysqld_pid_file_path"
fi
else
log_failure_msg "MySQL server PID file is null or not exist!"
fi
}
#接收传参判断并执行相应函数。
case "$1" in
start)
start
retval=$?
;;
stop)
stop
retval=$?
;;
restart)
stop
sleep 2 #这里很重要,要休息一下。
start
retval=$?
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 2
esac
exit $retval #执行脚本后,有返回值才更专业。