MySQL 退出且没有任何输出

MySQL 退出且没有任何输出

遇到一个奇怪的问题。前段时间,我在创建表时 MySQL 突然退出(我想是的),我将这个问题搁置到现在。它似乎启动了,但什么也没发生,它退出了:

141031 18:40:20 mysqld_safe 使用来自 /mnt/zfs/main/mysql 的数据库启动 mysqld 守护进程
2014-10-31 18:40:21 0 [警告] 带有隐式 DEFAULT 值的 TIMESTAMP 已弃用。请使用 --explicit_defaults_for_timestamp 服务器选项(有关更多详细信息,请参阅文档)。
141031 18:40:21 mysqld_safe mysqld 来自 pid 文件 /mnt/zfs/main/mysql/serve.pid 结束

注意:以上是日志文件;stdout 有或多或少相同的输出,但没有警告。

更奇怪的是,我刚刚在配置中修复了该警告,但一段时间内警告没有出现。我不确定发生了什么事导致它再次出现;我记得我唯一做过的事情是尝试mysql通过系统的启动脚本启动,这需要 10 秒左右的时间,并且不会在日志中写入任何内容。正如我之前所暗示的,我已将其添加explicit_defaults_for_timestamp = 1到我的配置中。

下面是我用来启动 MySQL 的命令行:

mysqld_safe --datadir=/mnt/zfs/main/mysql --user=mysql --defaults-extra-file=/usr/local/etc/mysql.cnf

不知道这里发生了什么,有什么想法吗?

编辑

后来我发现,这mysqld_safe实际上并不是 MySQL 服务器本身的一部分,而是一个最终运行实际服务器的 shell 脚本。shell 脚本的内容发布如下:

/bin/sh #!/bin/sh 复制代码
# 版权所有 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# 本文件属于公共领域,不附带任何形式的担保
#
# 启动 MySQL 守护进程并在其意外死亡时重新启动它的脚本
#
# 如果你正在使用
# 编译时默认未安装的二进制安装
# 地点
#
# mysql.server 的工作原理是首先执行 cd 到基目录,然后从那里
# 执行 mysqld_safe

# 初始化脚本全局变量
KILL_MYSQLD=1;
MYSQLD=
友善度=0
mysqld_ld_preload=
mysqld_ld_library_path=

# 初始日志记录状态:错误日志未打开,并且未使用 syslog
日志记录=初始化
want_syslog=0
syslog_tag=
用户='mysql'
pid_file=
错误日志=

syslog_tag_mysqld=mysqld
syslog_tag_mysqld_safe=mysqld_safe

陷阱 '' 1 2 3 15 # 我们不应该让任何人杀死我们
trap '' 13 # 甚至不是 SIGPIPE

# MySQL 特定的环境变量。首先,它不是一个真正的 umask,
# 这是所需的模式。其次,它遵循 umask(2),而不是 umask(3),因为
# 八进制需要明确。我们的 shell 可能是一个没有 printf 的正确 sh,
# 多基数算术和二进制算术,所以这会变得很难看。
# 我们拒绝十进制值,以使事情至少保持一半的合理性。
umask 007 # 后备
UMASK="${UMASK-0640}"
fmode =`echo“$UMASK”| sed -e's/[^0246]//g'`
octalp=`echo "$fmode"|cut -c1`
fmlen =`echo“$fmode”|wc -c|sed -e's/ //g'`
如果 [ “x$octalp” != “x0” -o “x$UMASK” != “x$fmode” -o “x$fmlen” != “x5” ]
然后
  fmode=0640
  echo "UMASK 必须是 3 位数字模式,并在前面加上 0 以表示八进制。" >&2
  echo "第一位数字将被更正为 6,其他数字可能是 0、2、4 或 6。" >&2
fmode =`echo“$fmode”|cut -c3-4`
fmode="6$fmode"
如果 [ “x$UMASK” != “x0$fmode” ]
然后
  echo "UMASK 从 $UMASK 更正为 0$fmode ..."

默认值=
案例“$1”
    --无默认值|--默认文件=*|--默认额外文件=*)
      默认值=“$1”;移位
      ;;
埃萨克

用法 () {
        猫>“$err_log”;;
    syslog)记录器-t“$syslog_tag_mysqld_safe”-p“$priority”“$*”;;
    *)
      echo "内部程序错误(非致命):" \
           “未知的日志记录方法‘$logging’” >&2
      ;;
  埃萨克
}

错误日志(){
  log_generic 守护进程.error "$@" >&2
}

登录通知 () {
  log_generic daemon.notice "$@"
}

eval_log_error(){
  cmd="$1"
  案例 $logging
    文件)cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" ;;
    系統記錄)
      # mysqld 经常在其消息前面加上时间戳,即
      # 当记录到系统日志时是多余的(它会添加自己的时间戳)
      # 但是,我们在这里不使用 sed 删除时间戳,因为
      # sed 缓冲输出(仅 GNU sed 支持 -u(无缓冲)选项)
      # 这意味着消息可能不会被发送到系统日志,直到
      #mysqld 进程退出。
      cmd="$cmd 2>&1 | logger -t'$syslog_tag_mysqld'-p daemon.error"
      ;;
    *)
      echo "内部程序错误(非致命):" \
           “未知的日志记录方法‘$logging’” >&2
      ;;
  埃萨克

  #echo "运行 mysqld:[$cmd]"
  评估“$cmd”
}

shell_quote_string() {
  # 此 sed 命令确保所有特殊字符都被引用,
  # 因此参数被准确地传递给服务器。
  回声“$1”| sed -e 's,\([^a-zA-Z0-9/_.=-]\),\\\1,g'
}

解析参数(){
  # 我们只需要将参数传递给服务器,如果我们不需要
  # 在这里处理它们。因此,我们收集无法识别的选项(传递到
  # 命令行)放入 args 变量中。
  pick_args=
  如果测试“$1”=PICK-ARGS-FROM-ARGV
  然后
    pick_args=1
    转移

  对于参数做
    # “=” 后的参数,若不匹配则为整个 $arg
    val =`echo“$arg”| sed -e's;^--[^=]*=;;'`
    # “=” 之前的内容,如果没有匹配,则为整个 $arg
    optname =`echo“$arg”| sed -e's/^\(--[^=]*\)=.*$/\1/'`
    # 将“_”替换为“-”;mysqld_safe 必须像 mysqld 一样接受“_”。
    optname_subst =`echo“$ optname”| sed's / _ / - / g'`
    arg =`echo $ arg | sed“ s / ^ $ optname / $ optname_subst /”`
    案例“$arg”
      # 这些被明确传递给mysqld
      --basedir=*) MY_BASEDIR_VERSION="$val" ;;
      --datadir=*) DATADIR="$val" ;;
      --pid 文件 = *) pid_file="$val" ;;
      --plugin-dir=*) PLUGIN_DIR="$val" ;;
      --用户=*) 用户="$val"; SET_USER=1 ;;

      # 这些可能已在 my.cnf 的 [mysqld_safe] 部分中设置
      # 它们被添加到 mysqld 命令行以覆盖 my.cnf 中的设置
      --log-error=*) err_log="$val" ;;
      --port=*) mysql_tcp_port="$val" ;;
      --socket=*) mysql_unix_port="$val" ;;

      # mysqld_safe 特定选项 - 必须在 my.cnf ([mysqld_safe]) 中设置!
      --核心文件大小=*) core_file_size="$val" ;;
      --ledir=*) ledir="$val" ;;
      --malloc-lib=*) set_malloc_lib "$val" ;;
      --mysqld=*) MYSQLD="$val" ;;
      --mysqld 版本=*)
        如果测试-n“$val”
        然后
          MYSQLD="mysqld-$val"
          PLUGIN_VARIANT="/$val"
        别的
          MYSQLD="mysqld"
        ;;
      --nice=*) niceness="$val" ;;
      --open-files-limit=*) open_files="$val" ;;
      --open_files_limit=*) open_files="$val" ;;
      --skip-kill-mysqld*) KILL_MYSQLD=0 ;;
      --syslog) want_syslog=1 ;;
      --skip-syslog) want_syslog=0 ;;
      --syslog-tag=*) syslog_tag="$val" ;;
      --timezone=*) TZ="$val"; 导出 TZ; ;;

      --help) 使用方法 ;;

      *)
        如果测试-n“$pick_args”
        然后
          append_arg_to_args“$arg”
        ;;
    埃萨克
  完毕
}


# 将单个共享库添加到将添加到的库列表中
# mysqld 的 LD_PRELOAD
#
# 由于 LD_PRELOAD 是一个空格分隔的值(出于历史原因),如果
# 共享库的路径包含空格,该路径将被添加到
#LD_LIBRARY_PATH 并从 lib 值中剥离。
添加mysqld_ld_preload() {
  lib_to_add="$1"
  log_notice “将‘$lib_to_add’添加到 mysqld 的 LD_PRELOAD”

  案例“$lib_to_add”
    *' '*)
      # 必须从 lib 中删除路径,并将其添加到 LD_LIBRARY_PATH
      lib_file=`基本名称“$lib_to_add”`
      案例“$lib_file”
        *' '*)
          # lib文件本身的名称中有一个空格,不能
          # 在 LD_PRELOAD 中使用
          log_error“库名‘$lib_to_add’包含空格,不能与LD_PRELOAD一起使用”
          出口 1
          ;;
      埃萨克
      lib_path=`目录名“$lib_to_add”`
      lib_to_add="$lib_file"
      [ -n “$mysqld_ld_library_path” ] && mysqld_ld_library_path="$mysqld_ld_library_path:"
      mysqld_ld_library_path="$mysqld_ld_library_path$lib_path"
      ;;
  埃萨克

  # LD_PRELOAD 是一个空格分隔的
  [ -n “$mysqld_ld_preload” ] && mysqld_ld_preload="$mysqld_ld_preload "
  mysqld_ld_preload="${mysqld_ld_preload}$lib_to_add"
}


# 返回 LD_PRELOAD(和 LD_LIBRARY_PATH,如果需要)文本,引用为
# 适合在调用 mysqld 的 eval 中使用。
#
# mysqld_ld_preload 中的所有值均添加到 LD_PRELOAD 的前面。
mysqld_ld_preload_text() {
  文本=

  如果 [ -n “$mysqld_ld_preload” ]; 那么
    new_text="$mysqld_ld_preload"
    [ -n “$LD_PRELOAD” ] && new_text="$new_text $LD_PRELOAD"
    文本=“${text}LD_PRELOAD=”`shell_quote_string“$new_text”`' '

  如果 [ -n “$mysqld_ld_library_path” ]; 那么
    new_text="$mysqld_ld_library_path"
    [ -n “$LD_LIBRARY_PATH” ] && new_text="$new_text:$LD_LIBRARY_PATH"
    文本=“${text}LD_LIBRARY_PATH=”`shell_quote_string“$new_text”`''

  回显“$text”
}


mysql_config=
获取mysql配置()
  如果 [ -z "$mysql_config" ]; 那么
    mysql_config =`echo“$ 0”| sed's,/[^/][^/] * $,/mysql_config,'`
    如果 [ !-x "$mysql_config" ]; 那么
      log_error“无法从‘$mysql_config’运行mysql_config $@”
      出口 1

  “$mysql_config” “$@”
}


# 设置 malloc_lib 库
# - 如果 LIB 为空,则不执行任何操作并返回
# - 如果 LIB 是“tcmalloc”,则在 /usr/lib 中查找 tcmalloc 共享库
# 然后 pkglibdir。tcmalloc 是 Google perftools 项目的一部分。
# - 如果 LIB 是绝对路径,则假定它是一个 malloc 共享库
#
# 将 LIB 放入 mysqld_ld_preload 中,当
# 运行 mysqld。有关详细信息,请参阅 ld.so。
设置_malloc_lib(){
  malloc_lib="$1"

  如果 [ “$malloc_lib” = tcmalloc ]; 然后
    pkglibdir=`get_mysql_config --variable=pkglibdir`
    malloc_lib=
    # 此列表故意保持简单。只需设置 --malloc-lib
    # 如果需要其他位置,则为完整路径。
    对于 /usr/lib 中的 libdir "$pkglibdir" "$pkglibdir/mysql";执行
      对于 _minimal'' _and_profiler _debug 中的风味;做
        tmp="$libdir/libtcmalloc$flavor.so"
        #log_notice “DEBUG:检查 malloc lib‘$tmp’”
        [ -r "$tmp" ] || 继续
        malloc_lib="$tmp"
        休息 2
      完毕
    完毕

    如果 [ -z "$malloc_lib" ]; 那么
      log_error“在/usr/lib或$pkglibdir中未找到--malloc-lib = tcmalloc的共享库”
      出口 1

  # 允许 --malloc-lib='' 覆盖其他设置
  [ -z "$malloc_lib" ] && 返回

  案例“$malloc_lib”
    /*)
      如果 [ !-r "$malloc_lib" ]; 那么
        log_error“--malloc-lib‘$malloc_lib’无法读取,将不会被使用”
        出口 1
      ;;
    *)
      log_error“--malloc-lib必须是绝对路径或‘tcmalloc’;”\
        “忽略值‘$malloc_lib’”
      出口 1
      ;;
  埃萨克

  添加mysqld_ld_preload“$malloc_lib”
}


#
# 首先,尝试找到 BASEDIR 和 ledir (mysqld 所在的位置)
#

如果回显'/usr/local/share/mysql'|grep'^/usr/local'> /dev/null
然后
  relpkgdata =`echo'/usr/local/share/mysql'|sed -e's,^/usr/local,,'-e's,^/,,'-e's,^,./,'`
别的
  # pkgdatadir 与前缀无关
  relpkgdata='/usr/local/share/mysql'

MY_PWD=`密码`
# 检查我们期望从二进制版本安装中获得的目录
如果测试-n“$MY_BASEDIR_VERSION”-a-d“$MY_BASEDIR_VERSION”
然后
  # BASEDIR 已在命令行上被覆盖。请勿重新设置。

  # 使用 BASEDIR 来发现文件。
  如果测试-x“$MY_BASEDIR_VERSION / libexec / mysqld”
  然后
    ledir="$MY_BASEDIR_VERSION/libexec"
  elif 测试-x“$MY_BASEDIR_VERSION / sbin / mysqld”
  然后
    ledir="$MY_BASEDIR_VERSION/sbin"
  别的
    ledir="$MY_BASEDIR_VERSION/bin"
elif 测试 -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/bin/mysqld"
然后
  MY_BASEDIR_VERSION="$MY_PWD" # bin、share 和 data 的位置
  ledir="$MY_PWD/bin" # mysqld 的位置
# 检查我们期望从源安装中获得的目录
elif 测试-f“$relpkgdata”/english/errmsg.sys-a-x“$MY_PWD/libexec/mysqld”
然后
  MY_BASEDIR_VERSION="$MY_PWD" # libexec、share 和 var 的位置
  ledir="$MY_PWD/libexec" # mysqld 的位置
elif 测试 -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/sbin/mysqld"
然后
  MY_BASEDIR_VERSION="$MY_PWD" # 其中 sbin、share 和 var
  ledir="$MY_PWD/sbin" # mysqld 的位置
# 由于我们没有找到任何东西,因此使用了编译后的默认值
别的
  MY_BASEDIR_VERSION='/usr/local'
  ledir ='/usr/local/libexec'


#
# 其次,尝试找到数据目录
#

# 尝试二进制安装的位置
如果测试-d $MY_BASEDIR_VERSION /数据/ mysql
然后
  DATADIR=$MY_BASEDIR_VERSION/数据
  如果测试-z“$defaults”-a-r“$DATADIR/my.cnf”
  然后
    默认值=“--defaults-extra-file=$DATADIR/my.cnf”
# 接下来尝试将源安装到哪里
elif 测试-d $MY_BASEDIR_VERSION/var/mysql
然后
  DATADIR=$MY_BASEDIR_VERSION/var
# 或者干脆放弃,使用我们内置的默认设置
别的
  DATADIR=/var/db/mysql

如果测试-z“$MYSQL_HOME”
然后
  如果测试-r“$MY_BASEDIR_VERSION/etc/my.cnf”&&测试-r“$DATADIR/my.cnf”
  然后
    log_error“警告:发现两个 my.cnf 实例 -
$MY_BASEDIR_VERSION/etc/my.cnf 和
$DATADIR/my.cnf
忽略 $DATADIR/my.cnf”

    MYSQL_HOME=$MY_BASEDIR_VERSION
  elif 测试-r“$DATADIR/my.cnf”
  然后
    log_error“警告:发现$DATADIR/my.cnf
数据目录是 my.cnf 的弃用位置,请将其移动到
$MY_BASEDIR_VERSION/etc/my.cnf”
    MYSQL_HOME=$DATADIR
  别的
    MYSQL_HOME=$MY_BASEDIR_VERSION
导出MYSQL_HOME


# 从 my.cnf 文件中获取第一个参数,组 [mysqld] 和 [mysqld_safe]
# 然后与命令行参数合并
如果测试-x“$MY_BASEDIR_VERSION / bin / my_print_defaults”
然后
  print_defaults="$MY_BASEDIR_VERSION/bin/my_print_defaults"
elif 测试-x`目录名$0`/my_print_defaults
然后
  print_defaults="`目录名称 $0`/my_print_defaults"
elif 测试-x./bin/my_print_defaults
然后
  print_defaults="./bin/my_print_defaults"
elif 测试-x /usr/local/bin/my_print_defaults
然后
  print_defaults="/usr/local/bin/my_print_defaults"
elif 测试-x /usr/local/bin/mysql_print_defaults
然后
  print_defaults="/usr/local/bin/mysql_print_defaults"
别的
  print_defaults="我的打印默认设置"

append_arg_to_args(){
  args="$args "`shell_quote_string"$1"`
}

参数=

设置用户=2
parse_arguments `$print_defaults $defaults --loose-verbose mysqld 服务器`
如果测试 $SET_USER -eq 2
然后
  设置用户=0

parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
解析参数 PICK-ARGS-FROM-ARGV "$@"

#
# 尝试找到插件目录
#

# 使用用户提供的参数
如果 [ -n "${PLUGIN_DIR}" ]; 那么
  plugin_dir="${PLUGIN_DIR}"
别的
  # 尝试查找相对于 basedir 的插件目录
  对于 lib/mysql/plugin 中的目录 lib/plugin
    如果 [ -d “${MY_BASEDIR_VERSION}/${dir}” ]; 然后
      plugin_dir="${MY_BASEDIR_VERSION}/${dir}"
      休息
  完毕
  # 放弃并使用默认编译
  如果 [ -z "${plugin_dir}" ]; 那么
    plugin_dir='/usr/local/lib/mysql/plugin'
plugin_dir="${plugin_dir}${PLUGIN_VARIANT}"

# 确定要使用的日志记录工具

# 确保“logger”存在(如果请求的话)
如果[$want_syslog-eq 1]
然后
  my_which 记录器 > /dev/null 2>&1
  如果 [ $? -ne 0 ]
  然后
    log_error“--请求了syslog,但未找到‘logger’程序。请确保‘logger’在您的PATH中,或者不要为mysqld_safe指定--syslog选项。”
    出口 1

如果[-n“$err_log”-o$want_syslog-eq 0]
然后
  如果[-n“$err_log”]
  然后
    # 如果 --log-error 没有扩展名,mysqld 将添加“.err”
    # 参数;必须与此处匹配,否则 mysqld_safe 将写入
    # 与 mysqld 不同的日志文件

    # mysqld 不会将“.err”添加到“--log-error=foo”中;它认为
    # 尾随“.”作为扩展

    如果 expr "$err_log" : '.*\.[^/]*$' > /dev/null
    然后
    别的
      err_log="$err_log".err

    案例“$err_log”
      /* );;
      *)err_log =“$DATADIR/$err_log”;;
    埃萨克
  别的
    err_log=$DATADIR/`主机名`.err

  append_arg_to_args“--log-error = $ err_log”

  如果[$want_syslog-eq 1]
  然后
    # 用户明确要求使用系统日志,因此警告它未被使用
    log_error“无法同时记录到错误日志和系统日志。删除所有--log-error配置选项以使--syslog生效。”

  # 记录到 err_log 文件
  log_notice "记录到‘$err_log’。"
  日志记录=文件

  if [ ! -f "$err_log" ]; then # 如果错误日志已经存在,
    touch "$err_log" # 我们只是附加。否则,
    chmod "$fmode" "$err_log" # 修复此处的权限!

别的
  如果[-n“$syslog_tag”]
  然后
    # 清理 syslog 标签
    syslog_tag =`echo“$ syslog_tag”| sed -e's / [^ a-zA-Z0-9_-] / _ / g'`
    syslog_tag_mysqld_safe="${syslog_tag_mysqld_safe}-$syslog_tag"
    syslog_tag_mysqld="${syslog_tag_mysqld}-$syslog_tag"
  log_notice “记录到系统日志。”
  日志记录=系​​统日志

用户选项=""
如果测试-w / -o“ $ USER” =“ root”
然后
  如果测试“$user”!=“root”-o $SET_USER = 1
  然后
    USER_OPTION="--用户=$用户"
  # 如果正在使用,则将错误日志更改为正确的用户
  如果 [ $want_syslog -eq 0 ]; 那么
    触摸“$err_log”
    chown $user "$err_log"
  如果测试-n“$open_files”
  然后
    ulimit -n $open_files

如果测试-n“$open_files”
然后
  append_arg_to_args“--open-files-limit = $ open_files”

safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-/tmp/mysql.sock}}
# 确保 $safe_mysql_unix_port 目录存在
mysql_unix_port_dir=`目录名称 $safe_mysql_unix_port`
如果 [ !-d $mysql_unix_port_dir ]
然后
  mkdir $mysql_unix_port_dir
  chown $用户$mysql_unix_port_dir
  chmod 755 $mysql_unix_port_dir

# 如果用户没有指定二进制文件,我们假设名称为“mysqld”
如果测试-z“$MYSQLD”
然后
  MYSQLD=mysqld

如果测试!-x“$ledir/$MYSQLD”
然后
  log_error“文件$ledir/$MYSQLD
不存在或不可执行。请 cd 到 mysql 安装
目录并从那里重新启动该脚本,如下所示:
mysqld_safe 安全
有关更多信息,请参阅http://dev.mysql.com/doc/mysql/en/mysqld-safe.html”
  出口 1

如果测试-z“$pid_file”
然后
  pid_file="$DATADIR/`主机名`.pid"
别的
  案例“$pid_file”
    /* );;
    *)pid_file =“$DATADIR/$pid_file”;;
  埃萨克
append_arg_to_args“--pid-file = $ pid_file”

如果测试-n“$mysql_unix_port”
然后
  append_arg_to_args“--socket = $mysql_unix_port”
如果测试-n“$mysql_tcp_port”
然后
  append_arg_to_args“--port = $mysql_tcp_port”

如果测试 $niceness -eq 0
然后
  NOHUP_NICENESS="nohup"
别的
  NOHUP_NICENESS="nohup nice -$niceness"

# 使用不带参数的 nice 来获取优良等级是 GNU 特有的。
# 此检查可以扩展到其他操作系统(例如,
# BSD 可以使用“nohup sh -c 'ps -o nice -p $$' | tail -1”
# 但是,GNU nohup 似乎也是唯一一个搞乱的
# 具有优先级,所以这样没问题。
if nohup nice > /dev/null 2>&1
然后
    normal_niceness=`nice`
    nohup_niceness=`nohup nice 2>/dev/null`

    数字_nice_值=1
    对于 $normal_niceness $nohup_niceness 中的 val
        案例“$val”
            -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | \
             [0-9] | [0-9][0-9] | [0-9][0-9][0-9] )
                ;;
            *)
                数字_nice_值=0;;
        埃萨克
    完毕

    如果测试$numeric_nice_values -eq 1
    然后
        nice_value_diff=`表达式 $nohup_niceness - $normal_niceness`
        如果测试 $? -eq 0 && 测试 $nice_value_diff -gt 0 && \
            nice --$nice_value_diff echo 测试 > /dev/null 2>&1
        然后
            # nohup 提高了优先级(不好),我们被允许
            # 降低与用户价值相关的优先级
            # 可能已经给出
            友善度 =`expr $友善度 - $nice_value_diff`
            NOHUP_NICENESS="nice -$niceness nohup"
别的
    if nohup echo 测试> /dev/null 2>&1
    然后
    别的
        # nohup 在本系统上不起作用
        NOHUP_NICENESS=""

# 尝试设置核心文件大小(即使我们不是 root 用户),因为许多系统
# 不要对核心文件大小指定硬限制。
如果测试-n“$core_file_size”
然后
  ulimit -c $核心文件大小

#
# 如果存在旧的 pid 文件,请检查守护进程是否已在运行
# 注意:切换到“ps”可能取决于您的操作系统
如果测试-f“$pid_file”
然后
  PID=`cat“$pid_file”`
  如果 kill -0 $PID > /dev/null 2> /dev/null
  然后
    如果 ps -uaxww |使用以下命令运行 mysqld_safe: grep --$MYSQLD | grep $PID > /dev/null
    然后 # pid 包含一个 mysqld 进程
      log_error“mysqld 进程已存在”
      出口 1
  rm -f "$pid_file"
  如果测试-f“$pid_file”
  然后
    log_error“致命错误:无法删除pid文件:
$pid_文件
请手动删除它并重新启动$0;
mysqld 守护进程未启动”
    出口 1

#
# 如果希望所有表自动
# 在启动过程中检查并修复。您应该添加合理的 key_buffer
# 并将 sort_buffer 值添加到 my.cnf 中以提高检查性能或要求
# 更少的磁盘空间。
# 或者,您可以使用“myisam-recover”选项启动mysqld。参见
# 请参阅手册了解详情。
#
# echo "检查 $DATADIR 中的表"
#$MY_BASEDIR_VERSION/bin/myisamchk --silent --force --fast --medium-check $DATADIR/*/*.MYI
#$MY_BASEDIR_VERSION/bin/isamchk --silent --force $DATADIR/*/*.ISM

# 这在所有系统上都有效吗?
#if 类型 ulimit | grep "shell 内置" > /dev/null
#然后
# ulimit -n 256 > /dev/null 2>&1 # 修复 BSD 和 FreeBSD 系统
#fi

cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"

对于我在“$ledir/$MYSQLD” “$defaults” “--basedir=$MY_BASEDIR_VERSION” \
  “--datadir=$DATADIR” “--plugin-dir=$plugin_dir” “$USER_OPTION”
  cmd="$cmd "`shell_quote_string"$i"`
完毕
cmd="$cmd $args"
# 避免‘nohup:忽略输入’警告
test -n "$NOHUP_NICENESS" && cmd="$cmd redhat 5 使用 ps -x 时给出警告。
    # 使用 kill -9 否则进程将不会对 kill 做出反应。
    numofproces =`ps xaww | grep -v“grep”| grep“$ledir/$MYSQLD \>”| grep -c“pid-file=$pid_file”`

    log_notice“当前正在运行的进程数:$numofproces”
    我=1
    测试“$I”-le“$numofproces”
      PROC =`ps xaww | grep“$ledir/$MYSQLD \>”| grep -v“grep”| grep“pid-file=$pid_file”| sed -n'$p'`

      对于 $PROC 中的 T
        休息
      完毕
      # 回显“测试 $I-$T**”
      如果杀死-9 $T
      然后
        log_error“$MYSQLD 进程挂起,pid $T - 被杀死”
      别的
        休息
      我=`表达式$我+ 1`
    完毕
  log_notice“mysqld 已重新启动”
完毕

log_notice“mysqld 从 pid 文件 $pid_file 结束”

我找到了实际的mysqld二进制文件/usr/local/libexec/mysqld,但我会看看是否能找出 shell 脚本的问题。

更新

我发现,如果我datadir在配置文件中指定而不是在命令行开关中指定,时间戳警告就会消失。datadir再次在命令行中指定将导致时间戳警告再次出现。(再次,这无疑是mysqld_safe启动脚本的问题,但我想将其包括在内以防万一。)

相关内容