mysqld_safe 启动数据库报找不到 mysqld 启动文件
.版本
1)操作系统
cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m
cat /proc/version
Linux version 2.6.32-696.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Mar 21 19:29:05 UTC 2017
2)mysql数据库版本
mysql --version
mysql Ver 14.14 Distrib 5.6.26, for linux-glibc2.5 (x86_64) using EditLine wrapper
2. 问题描述
2.1 发现问题
新公司数据库全部安装在/opt/路径下(二进制安装),在这之前我是所有的数据库都是按照官方文档部署在/usr/local目录下的。本来觉得这不是什么事,但是发现在/opt/下面安装完mysql 后 使用 mysqld_safe --defaults-file=/etc/my3306.cnf & 启动数据库的时候确报如下错误(my3306.cnf 文件中指已经指定了 basedir=/opt/mysql)
[root@dba-test-1-25 ~]# mysqld_safe --defaults-file=/etc/my3306.cnf &
[1] 42815
[root@dba-test-1-25 ~]# 180502 09:36:53 mysqld_safe Logging to '/data/mysql/mysql3306/log/error3306.log'.
180502 09:36:53 mysqld_safe The file /usr/local/mysql/bin/mysqld
does not exist or is not executable. Please cd to the mysql installation
directory and restart this script from there as follows:
./bin/mysqld_safe&
See http://dev.mysql.com/doc/mysql/en/mysqld-safe.html for more information[1]+ Exit 1 mysqld_safe --defaults-file=/etc/my3306.cnf
##启动的时候报找不到 /usr/local/mysql/bin/mysqld 可执行文件,我在配置文件中 指定了 basedir = /opt/mysql,怎么还会去/usr/local/mysql/bin下面找mysqld,应该是去/opt/mysql/bin/下面找才对啊。
2.2 问题原因
想要知道真正的原因,那我们就去看一下 mysqld_safe 到底是怎么去找 mysqld 文件,然后启动数据库的,下面我们截取 mysqld_safe脚本中 跟本问题 相关的部分代码(大家可以直接看自己mysqld_safe完整代码)
#
# First, try to find BASEDIR and ledir (where mysqld is)
#
####这部分就是 mysqld_safe 中用来判断 basedir 的那部分代码if echo '/usr/local/mysql/share' | grep '^/usr/local/mysql' > /dev/null
thenrelpkgdata=`echo '/usr/local/mysql/share' | sed -e 's,^/usr/local/mysql,,' -e 's,^/,,' -e 's,^,./,'`
else# pkgdatadir is not relative to prefix# pkgdatadir is not relative to prefixrelpkgdata='/usr/local/mysql/share'
fi
####上面的if循环 最后给变量赋值为 relpkgdata='./share'MY_PWD=`pwd`
####注意了这个 MY_PWD 变量就是问题的关键,这里把当前路径值赋值给 MY_PWD 这个变量# Check for the directories we would expect from a binary release install
if test -n "$MY_BASEDIR_VERSION" -a -d "$MY_BASEDIR_VERSION"
####注意了 MY_BASEDIR_VERSION 这个变量也是个关键点,mysqld_safe 脚本中的parse_arguments函数会通过启动时指定的配置文件和命令行参数,对该参数进行赋值,如果该参数在配置文件和命令中都出现,则命令行中的值覆盖配置文件中的(其实就是把basedir赋值给该变量)。但是因为脚本中parse_arguments函数的调用是在 "find BASEDIR and ledir" 这部分代码之后,所以,这里的 if test -n "$MY_BASEDIR_VERSION" 为false
then# BASEDIR is already overridden on command line. Do not re-set.# Use BASEDIR to discover le.if test -x "$MY_BASEDIR_VERSION/libexec/mysqld"thenledir="$MY_BASEDIR_VERSION/libexec"elif test -x "$MY_BASEDIR_VERSION/sbin/mysqld"thenledir="$MY_BASEDIR_VERSION/sbin"elseledir="$MY_BASEDIR_VERSION/bin"fi####上面的if循环用来在 MY_BASEDIR_VERSION 变量存在且是目录的时候,生成相应的basedir(如上面分析因为脚本中还未生成MY_BASEDIR_VERSION,我们也没有在执行脚本之前手动设置MY_BASEDIR_VERSION变量,所以脚本不会走到该部分)
elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/bin/mysqld"
then
####如果MY_BASEDIR_VERSION为空,或者不是目录,那么执行上面的 elif判断 "$relpkgdata"/english/errmsg.sys 是否为文件,并且"$MY_PWD/bin/mysqld"是否为可执行文件,如果条件成立,执行then部分(relpkgdata变量上面已经给出)MY_BASEDIR_VERSION="$MY_PWD" # Where bin, share and data are####这里是指定basedir目录ledir="$MY_PWD/bin" # Where mysqld is####这里是指定 mysqld 可执行文件路径
# Check for the directories we would expect from a source install
####下面的elif判断都类似上面的分析(用来指定basedir目录,和 mysqld 可执行文件路径)
elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/libexec/mysqld"
thenMY_BASEDIR_VERSION="$MY_PWD" # Where libexec, share and var areledir="$MY_PWD/libexec" # Where mysqld is
elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/sbin/mysqld"
thenMY_BASEDIR_VERSION="$MY_PWD" # Where sbin, share and var areledir="$MY_PWD/sbin" # Where mysqld is
# Since we didn't find anything, used the compiled-in defaults
elseMY_BASEDIR_VERSION='/usr/local/mysql'ledir='/usr/local/mysql/bin'####最后else这部分也是关键,就是在前面判断都不成立的情况下,就设置 basedir 为/usr/local/mysql,可执行文件路径为/usr/local/mysql/bin(这就是我执行mysqld_safe时报/usr/local/mysql/bin/mysqld 不存在的原因)
fi
在mysqld_safe脚本的开始部分,我们可以看到如下部分内容,也就是说,二进制安装如果我们的basedir没有用默认的/usr/local/mysql,那么我们必须在basedir 目录下执行mysqld_safe:
# This should be executed in the MySQL base directory if you are using a
# binary installation that is not installed in its compile-time default
# location
通过上面对mysqld_safe 中“First, try to find BASEDIR and ledir (where mysqld is)”这部分代码的分析,我们已经指定问题的原因了,下面总结一下:
其实代码中 MY_BASEDIR_VERSION(basedir) 的判断可以分为三部分:
第一部分 通过MY_BASEDIR_VERSION变量来判断basedir,把MY_BASEDIR_VERSION变量值赋值给 basedir
第二部分 通过 执行mysqld_safe命令的当前路径(pwd)来判断 basedir,把pwd赋值给 basedir
第三部分 如果前面的判断都不符合,则最后设置 MY_BASEDIR_VERSION=/usr/local/mysql (上面例子中执行失败就是因为MY_BASEDIR_VERSION被设置成了 /usr/local/mysql,ledir='/usr/local/mysql/bin')
3. 问题解决
3.1 方案1
如果二进制安装,并且安装路径不是/usr/local/mysql(即basedir 不为 /usr/local/mysql),按要求在 basedir 下执行mysqld_safe 命令
3.2 方案2
在执行 mysqld_safe 命令前,先手动设置 MY_BASEDIR_VERSION 变量为当前 basedir
export MY_BASEDIR_VERSION=/opt/mysql
##这样在 “First, try to find BASEDIR and ledir (where mysqld is)” 时可以使用该变量,就能对 basedir进行正确的赋值
##注意 mysqld_safe “# Second, try to find the data directory”这部分代码中也会用到 MY_BASEDIR_VERSION变量
3.3 方案3
改写 mysqld_safe 脚本,具体怎么改写在这里就不具体说了,如果有需要的朋友可以私下交流
mysqld_safe 启动数据库报找不到 mysqld 启动文件相关推荐
- 启动数据库报错(2)控制文件丢失
Show parameter control 控制文件查询 控制文件存在于参数文件,也存在快速恢复区 可以通过日志恢复,也可以来回create 复制 Shutdown inmediate/abort( ...
- mysql mysqld.sock_MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
首先,环境:ubuntu 14.04,采用apt-get的方式安装的,手动安装可能路径设置稍有区别. 1.安装MySQL后,用命令行首次启动时发现找不到Mysqld.sock文件,提示: ERROR ...
- 无法启动程序 系统找不到指定的文件
一:目的+问题 1.公司的ART板卡厂家案例程序,打开.重新生成运行发现报错了 1.想解决:无法启动程序 系统找不到指定的文件 二.参考 1.[解决]无法启动程序/exe 系统找不到指定的文件 htt ...
- ubuntu启动,而且找不到win10启动项!
最近在学习深度学习的内容,由于tensorflow不支持window,所以打算安装个ubuntu试试,结果安装完后总是直接从ubuntu启动,而且找不到win10启动项! 着急!紧张! 网上搜了下解决 ...
- 从ubuntu启动,而且找不到win10启动项!
最近在学习深度学习的内容,由于tensorflow不支持window,所以打算安装个ubuntu试试,结果安装完后总是直接从ubuntu启动,而且找不到win10启动项! 着急!紧张! 网上搜了下解决 ...
- 启动MySQL数据库时找不到mysqld.sock的解决办法!
问题: 在普通用户权限下运行:mysql -u root -p,回车之后如果会出现如下错误:ERROR 2002 (HY000): Can't connect to local MySQL serve ...
- vs2010 无法启动程序 系统找不到指定的文件
我经常遇到这样的问题,一直都迷糊$(OutDir)$(TargetName)$(TargetExt).$(SolutionDir)$(Configuration).闹不明白. 很多时候,我们会将一些低 ...
- 启动数据库报错(1)ORA-01157,ORA-01110
•添加这条命令可以选用启用哪个数据库:export ORACLE_SID=数据库名 •Sqlplus / as sysdba •startup •ORA-01157:cannot identify/l ...
- 问题:启动tomcat报找不到JAVA_HOME或者JRE_HOME环境变量的问题
一.错误来源 在非linux系统上(即外部)启动tomcat时显示的错误 二.报错原文 Neither the JAVA_HOME nor the JRE_HOME environment varia ...
最新文章
- 计算机安装双系统后系统引导修复的方法
- ADMM:交替方向乘子算法
- 入股壹品生鲜签约仪式 农业大健康·李喜贵:谋定功能性农产品
- 人体姿态估计论文总结 (2D + 视频)
- 一步一步学NUnit
- 移植tslib到开发板及部分问题解决
- React Native在美团外卖客户端的实践
- 推荐这款接口管理神器,集成了Swagger和postman,mock的功能
- vb四则运算计算机,怎么用VB做简易的四则运算计算器
- 监控zabbix 服务并在异常时python 邮件报警
- java border边框_简单实用的css边框属性border
- 学习Python的几个优质平台
- SPSS基础教程:SPSS菜单命令详解
- 计算机232接口接线,RS232串口的简单介绍_RS232接线方法及电气特性
- matlab的罗马数字怎么写好看图解,【我想知道1—100的罗马数字怎样写啊就是ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪ这些等】作业帮...
- python如何期货交易_基于Python的股指期货交易系统
- 采购销售价格搞错的后果及处理逻辑
- 华硕路由桥接模式进入不了界面
- ubuntu环境下增加-pie选项导致可执行程序无法通过双击启动的问题
- Spring boot @Value 注入 boolean 设置默认值问题