遇到一个奇怪的问题。前段时间,我在创建表时 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
启动脚本的问题,但我想将其包括在内以防万一。)