推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

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

   2023-07-23 网络整理佚名2170
核心提示:MySQL启动是会读取配置文件里的选项pool,检查上次事务,如果配置文件出错,照样无法启动,也会报上述错误。4)检查mysql日志里,定位mysql启动失败原因。lock,进而导致再次重启时失败报错。1)检查配置,确认pid文件存在且权限为mysql;收到重写pid文件:3)检查MySQL配置文件,是否有错误配置想,本次事件中是f中错误配置skip-grant-,修正后启动恢复。

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

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON