mysql启动shell问题

时间:2015-06-03 01:57:14

标签: mysql shell

由于遇到了很多启动错误,我决定分析mysql启动shell。虽然有些代码片段我无法理解清楚。

版本:

mysql Ver 14.14使用readline 5.1为osx10.8(i386)分发5.5.43

Grid

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行的目的是什么?有点奇怪

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

乍一看,这确实非常奇怪......但这里解决了这个谜团。

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'

"这一切都很好,"我听到你说,"但为什么要经历所有这些旋转(显然)比较和按摩两个固定的文字字符串?我们已经知道了答案,那么所有的测试和替换是什么?"

这是一个公平的问题。

我的第一个怀疑是,我发现存在某种神奇的狂欢,但我不知道,但不,这段代码真的太简单了,不能成为这样的东西。

我的第二个怀疑,因为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" value应相对于当前目录表示并相应地修改此脚本,该逻辑测试实际上推迟到运行时,比较在构建时替换为其占位符的两个文字。

我已经完成了这么多细节,不是因为它会帮助你排除故障,因为我怀疑它不会。然而,这有点奇怪,值得进一步调查。

如果你在运行MySQL服务器时遇到困难......好吧,你不应该这样做,因为它是一个完善的系统而它应该可以运行。如果您系统上的/bin/sh未与/bin/bash进行符号链接,则可能需要将mysqld_safe的shebang行从#!/bin/sh更改为#!/bin/bash但是,除此之外,我怀疑你是通过查看mysqld_safe来探究错误的兔子洞以找到问题的根源。与mysqld_safe一样令人费解的是,不能说它没有经过时间测试。正如他们所说,"问题出在其他地方。"

如果可以的话,我建议您熟悉我们可能找到您需要的答案的其他社区,尤其是Ask UbuntuSuper UserServer FaultDatabase Administrators。熟悉每个网站的社区,范围以及每个社区在那里提出问题的人所期望的现有专业水平,并搜索网站以了解您的特定问题&# 39;重新遇到。很可能有人见过它,我们已经修好了其中一个,如果不是这样的话。