由于遇到了如此多的启动错误,我决定分析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行的目的是什么?有点奇怪
任何帮助都将不胜感激。
发布于 2015-06-04 10:49:38
乍一看,这确实很奇怪……但这里有一个解开这个谜团的方法。
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,因为我们不需要看到它,我们只想比较它。
“嗯,”你插话道,“这已经很明显了。问题是为什么?”跟上我。
如果匹配:
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。
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中,上面的代码片段看起来非常不同:
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 Ubuntu、Super User、Server Fault和Database Administrators。熟悉每个站点的社区、范围和每个社区对提出问题的人所期望的现有专业知识水平,并在站点中搜索您遇到的具体问题。很可能有人已经看到了它,我们已经把它固定在其中一个上了,如果不在这里的话。
https://stackoverflow.com/questions/30609575
复制相似问题