首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql启动shell问题

mysql启动shell问题
EN

Stack Overflow用户
提问于 2015-06-03 09:57:14
回答 1查看 27关注 0票数 1

由于遇到了如此多的启动错误,我决定分析mysql启动shell.while,一些我不清楚的代码片段。

版本:

mysql Ver 14.14 Distrib 5.5.43,适用于osx10.8 (i386),使用readline 5.1

368 # 369 # First, try to find BASEDIR and ledir (where mysqld is) 370 #

372 if echo '/usr/local/mysql/share' | grep '^/usr/local/mysql' > /dev/null 373 then 374 relpkgdata=echo '/usr/local/mysql/share' | sed -e 's,^/usr/local/mysql,,' -e 's,^/,,' -e 's,^,./,' 375 else 376 # pkgdatadir is not relative to prefix 377 relpkgdata='/usr/local/mysql/share' 378 fi

第372行的目的是什么?有点奇怪

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-06-04 10:49:38

乍一看,这确实很奇怪……但这里有一个解开这个谜团的方法。

代码语言:javascript
复制
372: if echo '/usr/local/mysql/share' | grep '^/usr/local/mysql' > /dev/null
373: then

如果匹配,grep将返回true,如果不匹配,则返回false,因此这将测试字符串/usr/local/mysql/share是否以(^) /usr/local/mysql开头。输出为/dev/null,因为我们不需要看到它,我们只想比较它。

“嗯,”你插话道,“这已经很明显了。问题是为什么?”跟上我。

如果匹配:

代码语言:javascript
复制
374:   relpkgdata=echo '/usr/local/mysql/share' | sed -e 's,^/usr/local/mysql,,' -e 's,^/,,' -e 's,^,./,'

/usr/local/mysql/share开始,去掉开头的/usr/local/mysql,然后去掉开头的/,然后加上./

所以/usr/local/mysql/share变成了./share

否则,使用字符串/usr/local/mysql/share

代码语言:javascript
复制
375: else
376:   # pkgdatadir is not relative to prefix
377:   relpkgdata='/usr/local/mysql/share'

“这也很好,”我听到你说,“但为什么要经历这么多周折来(显然)比较和推敲两个固定的文字字符串呢?我们已经知道了答案,那么为什么要进行所有的测试和替换呢?”

这是一个很好的问题。

我的第一个怀疑是,有一些我不认识的魔法bash黑客正在进行,但不是,这段代码真的太简单了,不可能是这样的。

我的第二个怀疑,因为这在MySQL 5.0.96 (我没有运行它,但手头有参考)中明显没有,这是一种放弃的尝试,试图在mysqld_safe中引入一些新的神奇行为,这些新的神奇行为从未完成,并被实际的变量取代,测试和修改这些变量比对文字字符串做同样的事情更有意义。

但是,不是。当你唯一的工具是锤子时,所有的东西看起来都像钉子。这是一个做一些简单事情的例子。艰难的方式。至少在我看来是这样的。实际上,这有一个合理的解释。要找到答案,您必须查看源代码(而不是二进制)发行版。

MySQL有很多“硬编码”的默认值。事实证明,这就是一个例子。

在源文件scripts/mysqld_safe.sh中,上面的代码片段看起来非常不同:

代码语言:javascript
复制
if echo '@pkgdatadir@' | grep '^@prefix@' > /dev/null
then
  relpkgdata=`echo '@pkgdatadir@' | sed -e 's,^@prefix@,,' -e 's,^/,,' -e 's,^,./,'`
else
  # pkgdatadir is not relative to prefix
  relpkgdata='@pkgdatadir@'
fi

啊,消息来源。模式替换。

在从源代码编译MySQL时,文件scripts/Makefile包含一些指令,这些指令使用sed@prefix@@pkgdatadir@等内容替换为文字值。当然,当Oracle或Linux disto维护者从源代码编译他们的二进制发行版时,也会发生同样的事情。这些路径被硬编码到代码中的许多地方,包括下面的脚本...导致了两个文字字符串之间的不可理解的比较,而这两个字符串应该已经有人知道答案。

不是在构建时测试一个路径是否是另一个路径的锚定子字符串,以及"relpkgdata“值是否应该相对于当前目录表示,并相应地修改此脚本,而是实际上将该逻辑测试推迟到运行时,比较在构建时替换其占位符的两个文字。

我讲了这么多细节,不是因为它能帮你解决问题,而是因为我怀疑它不会。然而,它已经足够奇怪了,需要进一步的调查。

如果您在运行MySQL服务器时遇到困难...嗯,你不应该这样,因为这是一个很好的系统,它应该是有效的。如果您系统上的/bin/sh不是/bin/bash的符号链接,那么您可能希望将mysqld_safe的代码行从#!/bin/sh更改为#!/bin/bash,但除此之外,我怀疑您通过查看mysqld_safe来找出问题的根源是错误的。尽管mysqld_safe很复杂,但不能说它没有经过时间测试。正如人们所说的,“问题出在别的地方。”

如果可以,我建议您熟悉我们的一些其他社区,在那里您可能会找到所需的答案,特别是Ask UbuntuSuper UserServer FaultDatabase Administrators。熟悉每个站点的社区、范围和每个社区对提出问题的人所期望的现有专业知识水平,并在站点中搜索您遇到的具体问题。很可能有人已经看到了它,我们已经把它固定在其中一个上了,如果不在这里的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30609575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档