iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 启动失败报错无法更新pid文件
  • 331
分享到

MySQL 启动失败报错无法更新pid文件

mysql数据库服务器mysqld.pidmysql.sock.lock 2023-09-09 19:09:04 331人浏览 八月长安
摘要

一、问题描述 某次因Mysql故障,一线人员反馈mysql启动,一直无法启动,报错:启动mysql失败 ERROR! The server quit without updating PID file

一、问题描述

某次因Mysql故障,一线人员反馈mysql启动,一直无法启动,报错:启动mysql失败 ERROR! The server quit without updating PID file (/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).

在这里插入图片描述

二、问题分析

1)pid文件缺失,MySQL本身存在重启pid文件丢失,重启不会重建mysqld目录的问题。可能原因:

mysql的端口被占用
生成pid文件的目录mysql的权限不足或mysqld的目录不存在
mysql对应的my.cnf配置文件错误
mysql的启动脚本有问题
mysql有残余数据影响了服务的启动

2)MySQL启动:除了以服务形式启动,可使用脚本来启动。MySQL启动是会读取配置文件里的选项
作为mysqld的启动选项,初始化buffer pool,检查上次事务,如果配置文件出错,mysqld照样无法启动,也会报上述错误。

mysql.server也是一个用于管理MySQL服务器的脚本,其底层调用的是mysqld_safe脚本。
mysql.server start

对于多实例的启动,mysqld_multi是MySQL提供的用于管理多个MySQL服务器的脚本,可以同时启动或停止多个MySQL服务器,当我们运行mysqld_multie脚本时,该脚本会在配置文件中查找名称为[mysqldN]的选项,N可以是任意的正整数。

mysqld_multi [options] {start|stop|reload|report} N
#配置文件示例:
[mysqld1]
Socket = /tmp/mysql.sock2
port = 3306
pid-file = /usr/local/mysql/data2/hostname.pid2
datadir = /usr/local/mysql/data2
language = /usr/local/mysql/share/mysql/english
user = unix_user1

[mysqld2]
mysqld = /path/to/mysqld_safe
ledir = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket = /tmp/mysql.sock3
port = 3307
pid-file = /usr/local/mysql/data3/hostname.pid3
datadir = /usr/local/mysql/data3
language = /usr/local/mysql/share/mysql/swedish
user = unix_user2

mysqld_multi start #启动配置文件里所有示例
mysqld_multi start 1 #启动mysqld1
mysqladmin -p -u root shutdown #关闭mysqld

3)关于MySQL启动,默认使用普通用户来启动,设置启动账号可按如下配置:

1)vi /etc/my.cnf
[mysqld]
user=mysql

2)命令中指定:mysqld -u mysql,如果配置文件中指定的选项与在命令行中指定的选项相同,则以命令行中指定的选项为优先

MySQL建议使用mysql普通用户启动,如果使用了“超级管理员”或者“本地系统用户”来运行“MySQL数据库”,就会被黑客利用,利用SYSTEM用户权限入侵服务器。因此,为了服务器安全,务必将MySQL运行在“普通用户”的状态下。查看mysqld_safe启动脚本可看到:
在这里插入图片描述

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.sock.lock,进而导致再次重启时失败报错。

三、处理

1)检查pid_file配置,确认pid文件存在且权限为mysql;收到重写pid文件:

chown mysql.mysql /var/run/mysqld/ps -ef|grep mysqld|awk '{print $2}'|sed 1d |sed 2d > mysql.pid

在这里插入图片描述

使用mysqld_safe启动mysql时,mysqld_safe会检查pid文件。如果不存在,mysqld启动后会通过create_pid_file函数新建pid文件,通过getpid()获取当前进程pid并将PID写入pid文件。

2)journalctl -xe检查日志找到报错点,一般是权限问题,本次事件中是data下的bin日志文件权限问题,修改为mysql后,启动恢复;现场报错:File ‘./mysql-bin.index’ not found (Errcode: 13 - Permission denied),errcode13,一般就是权限问题。

3)检查MySQL配置文件,是否有错误配置想,本次事件中是my.cnf中错误配置skip-grant-tables,修正后启动恢复。
在这里插入图片描述
4)当不确定启动脚本或mysql.server配置文件内参数是否正常时,先使用mysqld_safe方式启动,查看是否可启动

./mysqld_safe --defaults-file=/etc/my.cnf --user=mysql或./mysqld_safe --user=mysql&

如果可以启动,查看mysql启动脚本或mysql.server配置文件内参数并进行修改。

mysql.server程序主要是会用到两个程序和一个函数,分别是my_print_defaults、myslqd_safe和parse_server_arguments;mysql.server启动首先会对参数–datedir和–pid-file赋值,这两个参数是从my.cnf文件[mysqld]部分中读取来的,而且这两个参数的值不会受到mysqld_safe程序中的参数赋值给覆盖。但是在my.cnf中其它的参数值如果[mysqld]和[mysqld_safe]相同的话就以mysqld_safe为主。

my_print_defaults:读取my.cnf配置文件,输出参数传递给parse_server_arguments,该程序只读my.cnf中[mysqld]中的参数。

parse_server_arguments:该函数处理my_print_defaults传递过来的参数赋值给–basedir、–datadir、–pid-file、–server-startup-timeout

myslqd_safe:mysqld_safe程序调用mysqld程序来启动mysql服务.

在这里插入图片描述
5)报错:

执行:mysqld-debug,报错:

mysqld-debug: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

安装:yum install -y libaio

6)执行:mysql_upgrade
Looking for ‘mysql’ as: mysql
Looking for ‘mysqlcheck’ as: mysqlcheck
Error: Failed while fetching Server version! Could be due to unauthorized access.
FATAL ERROR: Upgrade failed

7)当初始化mysql时出现错误: mysql安装报FATAL ERROR: please install the following Perl modules before executing

原因:缺少perl模块中的Data::Dumper;安装autoconf库(此包安装时会安装Data:Dumper模块)

解决方法 :安装autoconf库

命令:yum -y install autoconf

再次执行初始化数据库后,启动MySQL成功 ,由此可表明数据库里有脏数据所致,因我是整个包从master拷贝过来的。

/support-files/mysql.server start  //输出如下Starting MySQL. SUCCESS! 

8)有一次,是因为加固基线修改配置文件,增加了如下配置,但未配置server-id和slow-log-query–file参数写错
在这里插入图片描述

log-error=/var/log/mysql/mysqld.log#mysql log configgeneral_log = ongeneral_log_file=/var/log/mysql/general.logslow_query_log = onslow-query-log-file=/var/log/mysql/slowquery.loglong_query_time=2server-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,或直接删除,之后再启动就可正常了。

四、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 2esacexit $retval    #执行脚本后,有返回值才更专业。

在这里插入图片描述
更多参看MySQL用户及权限

来源地址:https://blog.csdn.net/ximenjianxue/article/details/124663828

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 启动失败报错无法更新pid文件

本文链接: https://www.lsjlt.com/news/401837.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作