是因为你做的功课不够,深度解析MySQL启动时报

致DBA:为啥您平日犯错,是因为你做的学业非常不够,致dba犯错功课

专职做DBA已经六年多的轩然大波了,看同行、同事犯了太多的荒谬,本人也犯了相当多的一无所能。一路走来,感触特别深。不过绝大大多的错误其实皆以非常的低档的失实。有的是因为不领悟有个别引擎的脾气导致;有的是因为对线上蒙受不打听产生;有的是因为经验不足导致;一路上,跌跌撞撞,从小企DBA,到腾讯高端DBA,再到方今的财政和经济数据库DBA。 不由得想起5年前的自个儿,刚进去DBA行当,紧缺经验,平日犯错误,不是本人远远不够努力,越多的是初来咋到的自家有史以来不知情应该在哪方面下武功。本文正是基于这上面的记挂,依照自身在DBA那么些事情上度过的弯路,计算一些办法给DBA的同行。希望本文能给同行DBA或然运转的朋友们带来一些改观,让大家清楚作为三个DBA需求在哪些方面下武功。下边主要从遇到、数据安全、常规操作、预案、架构、心态等范围,同一时候也会介绍部分实用的经验。

一道CTF题引发的思辨-MySQL的多少个个性(续),ctf-mysql

0x00 背景

  那两日处于转牛角尖的情状,乌烟瘴气。然则上一篇的中涉嫌的难题总算是计算了些东西。

传送门:疑问点0x02(4)

 

0x01 测试进度

(一)测试环情:创设了如下测试表test,

mysql> select * from test;
--------- ------- -----------------------------------------
| user_id   | user  | password                  |
--------- ------- -----------------------------------------
| 1    | admin  | 5f4dcc3b5aa765d61d8327deb882cf99   |
| 2    | ADMIN | 5f4dcc3b5aa765d61d8327deb882cf99   |
--------- ------- -----------------------------------------
2 rows in set

(二)测试进度要点:首要测试MySQL的大小写是还是不是是强相称,在什么样情状下是强相配,以及哪些使MySQL对大小写进行强相配

  • 在并未有选用表的事态下测试,开采不开始展览编码(这里说的编码是采纳char或16进制进行编码) 时高低写不是强相称的。

mysql> select 'AbC' like 'a%';
-----------------
| 'AbC' like 'a%'    |
-----------------
| 1          |
-----------------
1 row in set

mysql> select 'AbC' like 'A%';
-----------------
| 'AbC' like 'A%'  |
-----------------
| 1          |
-----------------
1 row in set

 

  • 在一贯不选拔表的动静下,使用char也许16进制举行编码后 大小写是强相称的

mysql> select 'AbC' like char(97,37); #小a
------------------------
| 'AbC' like char(97,37)    |
------------------------
| 0             |
------------------------
1 row in set

mysql> select 'AbC' like char(65,37); #大A
------------------------
| 'AbC' like char(65,37)|
------------------------
| 1           |
------------------------
1 row in set

mysql> select 'AbC' like 0x6125; #小a
-------------------
| 'AbC' like 0x6125   |
-------------------
| 0          |
-------------------
1 row in set

mysql> select 'AbC' like 0x4125;  #大A
-------------------
| 'AbC' like 0x4125  |
-------------------
| 1           |
-------------------
1 row in set

 

  • 在平昔不选取表的情状下,可以动用binary对大小写进行强相称,当然也得以采纳hex,这么些在

mysql> select 'AbC' like binary 'a%';
------------------------
| 'AbC' like binary 'a%' |
------------------------
| 0 |
------------------------
1 row in set

mysql> select 'AbC' like binary 'A%';
------------------------
| 'AbC' like binary 'A%' |
------------------------
| 1 |
------------------------
1 row in set

 


以下是选用正则regexp的法子,与like相似这里就不啰嗦了。

  • 在尚未选用表的场合下测试,开采不实行编码,大小写不是强相称

mysql> select 'AbC' regexp '^a';
-------------------
| 'AbC' regexp '^a'  |
-------------------
| 1             |
-------------------
1 row in set
mysql> select 'AbC' regexp '^A';
-------------------
| 'AbC' regexp '^A'  |
-------------------
| 1             |
-------------------
1 row in set

 

  • 在未曾采用表的景况下测试,开掘进行编码后,大小写是强匹配

mysql> select 'AbC' regexp char(94,97);#小a
--------------------------
| 'AbC' regexp char(94,97) |
--------------------------
| 0             |
--------------------------
1 row in set

mysql> select 'AbC' regexp char(94,65);#大A
--------------------------
| 'AbC' regexp char(94,65) |
--------------------------
| 1             |
--------------------------
1 row in set

mysql> select 'AbC' regexp 0x5E61;#小a
---------------------
| 'AbC' regexp 0x5E61 |
---------------------
| 0           |
---------------------
1 row in set
mysql> select 'AbC' regexp 0x5E41;#大A
---------------------
| 'AbC' regexp 0x5E41 |
---------------------
| 1           |
---------------------
1 row in set

 

  • 在没有选用表的事态下,能够动用binary对大小写实行强相称

mysql> select 'AbC' regexp binary '^a';
--------------------------
| 'AbC' regexp binary '^a'  |
--------------------------
| 0             |
--------------------------
1 row in set

mysql> select 'AbC' regexp binary '^A';
--------------------------
| 'AbC' regexp binary '^A'   |
--------------------------
| 1              |
--------------------------


在增选表大概是透过数据库函数如user(),database()等获取数据的测试情况:

  • 在查询表中字段数据时,无论是还是不是实行编码 ,大小写都以不强相称

mysql> select * from test where user like 'A%';
--------- ------- ---------------------------------------
| user_id   | user   | password                |
--------- ------- ---------------------------------------
| 1     | admin | 5f4dcc3b5aa765d61d8327deb882cf99|
| 2     | ADMIN| 5f4dcc3b5aa765d61d8327deb882cf99|
--------- ------- ---------------------------------------
2 rows in set

mysql> select * from test where user like char(65,37) ;
--------- ------- ---------------------------------------
| user_id   | user   | password                |
--------- ------- ---------------------------------------
| 1     | admin | 5f4dcc3b5aa765d61d8327deb882cf99|
| 2     | ADMIN| 5f4dcc3b5aa765d61d8327deb882cf99|
--------- ------- ---------------------------------------
2 rows in set

mysql> select * from test where user regexp '^A';
--------- ------- ---------------------------------------
| user_id   | user   | password                |
--------- ------- ---------------------------------------
| 1     | admin | 5f4dcc3b5aa765d61d8327deb882cf99|
| 2     | ADMIN| 5f4dcc3b5aa765d61d8327deb882cf99|
--------- ------- ---------------------------------------
2 rows in set

mysql> select * from test where user regexp 0x5E61;
--------- ------- ---------------------------------------
| user_id   | user   | password                |
--------- ------- ---------------------------------------
| 1     | admin | 5f4dcc3b5aa765d61d8327deb882cf99|
| 2     | ADMIN| 5f4dcc3b5aa765d61d8327deb882cf99|
--------- ------- ---------------------------------------
2 rows in set

mysql> select * from test where user regexp binary 0x5E41;
--------- ------- ----------------------------------------------
| user_id   | user    | password                   |
--------- ------- ----------------------------------------------
| 2      | ADMIN | 5f4dcc3b5aa765d61d8327deb882cf99    |
--------- ------- ----------------------------------------------
1 row in set

0x02 测试结论

  MYSQL大小写不开始展览强相配的。要想相称大小写能够运用binary,或然使用

0x0三 此外的1种形式

应用拾进制和1陆进制混合也能够完结分别轻重缓急写的效应,因为大小写的16进制是不等同的。

mysql> select conv(hex(substr((user()),1,8)),16,10);
---------------------------------------
| conv(hex(substr((user()),1,8)),16,10) |
---------------------------------------
| 8245931987826405219        |
---------------------------------------
1 row in set

mysql> select unhex(conv((8245931987826405219),10,16));
----------------------------------------------------
| unhex(conv((8245931987826405219),10,16))       |
----------------------------------------------------
| [email protected]                       |
----------------------------------------------------
1 row in set

0x00 背景 那两日处于转牛角尖的情况,非常倒霉。然则上1篇的中关系的标题毕竟是总计...

纵深解析MySQL运维时报“The server quit without updating PID file”错误的案由,mysqlupdating

繁多童鞋在起步mysql的时候,遭遇过这些指鹿为马,

第2,澄清一点,出现那个张冠李戴的前提是:通过劳务脚本来运转mysql。通过mysqld_safe或mysqld运转mysql实例并不会报那几个错误。

那正是说,出现这么些错误的原故具体是何等吧?

哈哈哈,对深入分析进度不care的童鞋可直接跳到文末的总计部分~

总结

下边,来深入分析下mysql的服务运行脚本

剧本完整内容如下:

#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
# MySQL daemon start/stop script.
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
# Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
# [mysqld]
# basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
# and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
# below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.
basedir=
datadir=
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
# The following variables are only set for letting mysql.server find things.
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
 basedir=/usr/local/mysql
 bindir=/usr/local/mysql/bin
 if test -z "$datadir"
 then
 datadir=/usr/local/mysql/data
 fi
 sbindir=/usr/local/mysql/bin
 libexecdir=/usr/local/mysql/bin
else
 bindir="$basedir/bin"
 if test -z "$datadir"
 then
 datadir="$basedir/data"
 fi
 sbindir="$basedir/sbin"
 libexecdir="$basedir/libexec"
fi
# datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set=
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
 . $lsb_functions
else
 log_success_msg()
 {
 echo " SUCCESS! [email protected]"
 }
 log_failure_msg()
 {
 echo " ERROR! [email protected]"
 }
fi
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
mode=$1 # start or stop
[ $# -ge 1 ] && shift
other_args="$*" # uncommon, but needed when called from an RPM upgrade action
   # Expected: "--skip-networking --skip-grant-tables"
   # They are not checked here, intentionally, as it is the resposibility
   # of the "spec" file author to give correct arguments only.
case `echo "testingc"`,`echo -n testing` in
 *c*,-n*) echo_n= echo_c=  ;;
 *c*,*) echo_n=-n echo_c=  ;;
 *)  echo_n= echo_c='c' ;;
esac
parse_server_arguments() {
 for arg do
 case "$arg" in
  --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
     bindir="$basedir/bin"
   if test -z "$datadir_set"; then
    datadir="$basedir/data"
   fi
   sbindir="$basedir/sbin"
   libexecdir="$basedir/libexec"
  ;;
  --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
   datadir_set=1
 ;;
  --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
  --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
 esac
 done
}
wait_for_pid () {
 verb="$1"   # created | removed
 pid="$2"   # process ID of the program operating on the pid-file
 pid_file_path="$3" # path to the PID file.
 i=0
 avoid_race_condition="by checking again"
 while test $i -ne $service_startup_timeout ; do
 case "$verb" in
  'created')
  # wait for a PID-file to pop into existence.
  test -s "$pid_file_path" && i='' && break
  ;;
  'removed')
  # wait for this PID-file to disappear
  test ! -s "$pid_file_path" && i='' && break
  ;;
  *)
  echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
  exit 1
  ;;
 esac
 # if server isn't running, then pid-file will never be updated
 if test -n "$pid"; then
  if kill -0 "$pid" 2>/dev/null; then
  : # the server still runs
  else
  # The server may have exited between the last pid-file check and now. 
  if test -n "$avoid_race_condition"; then
   avoid_race_condition=""
   continue # Check again.
  fi
  # there's nothing that will affect the file.
  log_failure_msg "The server quit without updating PID file ($pid_file_path)."
  return 1 # not waiting any more.
  fi
 fi
 echo $echo_n ".$echo_c"
 i=`expr $i   1`
 sleep 1
 done
 if test -z "$i" ; then
 log_success_msg
 return 0
 else
 log_failure_msg
 return 1
 fi
}
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
then
 print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
 print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
 print_defaults="$bindir/mysql_print_defaults"
else
 # Try to find basedir in /etc/my.cnf
 conf=/etc/my.cnf
 print_defaults=
 if test -r $conf
 then
 subpat='^[^=]*basedir[^=]*=(.*)$'
 dirs=`sed -e "/$subpat/!d" -e 's//1/' $conf`
 for d in $dirs
 do
  d=`echo $d | sed -e 's/[  ]//g'`
  if test -x "$d/bin/my_print_defaults"
  then
  print_defaults="$d/bin/my_print_defaults"
  break
  fi
  if test -x "$d/bin/mysql_print_defaults"
  then
  print_defaults="$d/bin/mysql_print_defaults"
  break
  fi
 done
 fi
 # Hope it's in the PATH ... but I doubt it
 test -z "$print_defaults" && print_defaults="my_print_defaults"
fi
#
# Read defaults file from 'basedir'. If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
extra_args=""
if test -r "$basedir/my.cnf"
then
 extra_args="-e $basedir/my.cnf"
else
 if test -r "$datadir/my.cnf"
 then
 extra_args="-e $datadir/my.cnf"
 fi
fi
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
#
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
 mysqld_pid_file_path=$datadir/`hostname`.pid
else
 case "$mysqld_pid_file_path" in
 /* ) ;;
 * ) mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
 esac
fi
case "$mode" in
 'start')
 # Start daemon
 # Safeguard (relative paths, core dumps..)
 cd $basedir
 echo $echo_n "Starting MySQL"
 if test -x $bindir/mysqld_safe
 then
  # Give extra arguments to mysqld with the my.cnf file. This script
  # may be overwritten at next upgrade.
  $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
  # Make lock for RedHat / SuSE
  if test -w "$lockdir"
  then
  touch "$lock_file_path"
  fi
  exit $return_value
 else
  log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
 fi
 ;;
 'stop')
 # Stop daemon. We use a signal here to avoid having to know the
 # root password.
 if test -s "$mysqld_pid_file_path"
 then
  mysqld_pid=`cat "$mysqld_pid_file_path"`
  if (kill -0 $mysqld_pid 2>/dev/null)
  then
  echo $echo_n "Shutting down MySQL"
  kill $mysqld_pid
  # mysqld should remove the pid file when it exits, so wait for it.
  wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
  else
  log_failure_msg "MySQL server process #$mysqld_pid is not running!"
  rm "$mysqld_pid_file_path"
  fi
  # Delete lock for RedHat / SuSE
  if test -f "$lock_file_path"
  then
  rm -f "$lock_file_path"
  fi
  exit $return_value
 else
  log_failure_msg "MySQL server PID file could not be found!"
 fi
 ;;
 'restart')
 # Stop the service and regardless of whether it was
 # running or not, start it again.
 if $0 stop $other_args; then
  $0 start $other_args
 else
  log_failure_msg "Failed to stop running server, so refusing to try to start."
  exit 1
 fi
 ;;
 'reload'|'force-reload')
 if test -s "$mysqld_pid_file_path" ; then
  read mysqld_pid < "$mysqld_pid_file_path"
  kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
  touch "$mysqld_pid_file_path"
 else
  log_failure_msg "MySQL PID file could not be found!"
  exit 1
 fi
 ;;
 'status')
 # First, check to see if pid file exists
 if test -s "$mysqld_pid_file_path" ; then 
  read mysqld_pid < "$mysqld_pid_file_path"
  if kill -0 $mysqld_pid 2>/dev/null ; then 
  log_success_msg "MySQL running ($mysqld_pid)"
  exit 0
  else
  log_failure_msg "MySQL is not running, but PID file exists"
  exit 1
  fi
 else
  # Try to find appropriate mysqld process
  mysqld_pid=`pidof $libexecdir/mysqld`
  # test if multiple pids exist
  pid_count=`echo $mysqld_pid | wc -w`
  if test $pid_count -gt 1 ; then
  log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
  exit 5
  elif test -z $mysqld_pid ; then 
  if test -f "$lock_file_path" ; then 
   log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
   exit 2
  fi 
  log_failure_msg "MySQL is not running"
  exit 3
  else
  log_failure_msg "MySQL is running but PID file could not be found"
  exit 4
  fi
 fi
 ;;
 *)
  # usage
  basename=`basename "$0"`
  echo "Usage: $basename {start|stop|restart|reload|force-reload|status} [ MySQL server options ]"
  exit 1
 ;;
esac
exit 0

首先,定义相关参数

basedir=
datadir=
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"

其中,

basedir 指的2进制压缩包解压后所在的目录,比方/usr/local/mysql。

datadir 指的是数码目录

service_startup_timeout=900 定义mysql服务运行的小时限定,即便在900s中尚无运营成功,则该脚本会退出。

lockdir='/var/lock/subsys'

有关/var/lock/subsys,英特网的表达如下,后续会用到。

总的看,系统关闭的历程(发出关闭数字信号,调用服务本人的长河)中会检查/var/lock/subsys下的文件,逐1关闭每一种服务,假使某一运维的服务在/var/lock/subsys下并未有对应的选项。在系统关闭的时候,会像杀死普通进程同样杀死这一个服务。

因而察看/etc/rc.d/init.d下的本子,能够窥见各种服务要好调节时都会去查看/var/lock/subsys下相应的劳动。

过多程序必要剖断是不是当前早已有贰个实例在运作,这一个目录正是让程序判定是还是不是有实例运营的注明,比方说xinetd,倘诺存在那些文件,表示已经有xinetd在运转了,不然尽管未有,当然程序里面还要有对应的论断方法来实在分明是还是不是有实例在运转。平时与该目录配套的还应该有/var/run目录,用来存放对应实例的PID,即使您写剧本的话,会发觉那三个目录结合起来能够很便宜的判别出成千上万劳务是或不是在运作,运营的连锁消息等等。 

判断basedir和datadir

# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
 basedir=/usr/local/mysql
 bindir=/usr/local/mysql/bin
 if test -z "$datadir"
 then
 datadir=/usr/local/mysql/data
 fi
 sbindir=/usr/local/mysql/bin
 libexecdir=/usr/local/mysql/bin
else
 bindir="$basedir/bin"
 if test -z "$datadir"
 then
 datadir="$basedir/data"
 fi
 sbindir="$basedir/sbin"
 libexecdir="$basedir/libexec"
fi

其中,

mysqld_pid_file_path 钦命pid文件的门径

-z string 推断字符串是或不是为空

即便basedir未有出示设置,则默以为/usr/local/mysql,那也是为啥多数mysql安装教程都推荐将mysql相关文书放到/usr/local/mysql下。

一旦datadir未有呈现设置,则默以为$basedir/data。

定义log_success_msg()和log_failure_msg()函数

先是,判断/lib/lsb/init-functions文件是或不是存在,倘诺存在,则使定义在init-functions文件中的全数shell函数在日前剧本中生效。

假诺没有,则定义八个函数,三个用于打字与印刷成功日志,三个是打字与印刷错误日志。

在奥迪Q5HCS 6.7中,该公文并不设有,已被/etc/init.d/functions所代替。

#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
 . $lsb_functions
else
 log_success_msg()
 {
 echo " SUCCESS! [email protected]"
 }
 log_failure_msg()
 {
 echo " ERROR! [email protected]"
 }
fi

传递参数

将第陆个参数字传送递给mode,剩下的参数字传送递给other_args

PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
mode=$1 # start or stop
[ $# -ge 1 ] && shift
other_args="$*" # uncommon, but needed when called from an RPM upgrade action
   # Expected: "--skip-networking --skip-grant-tables"
   # They are not checked here, intentionally, as it is the resposibility
   # of the "spec" file author to give correct arguments only.
case `echo "testingc"`,`echo -n testing` in
 *c*,-n*) echo_n= echo_c=  ;;
 *c*,*) echo_n=-n echo_c=  ;;
 *)  echo_n= echo_c='c' ;;
esac

深入分析配置文件中的参数

以此函数在本子后面会提到到。

根本涉嫌如下参数:--basedir,--datadir,--pid-file,--service-startup-timeout。

parse_server_arguments() {
 for arg do
 case "$arg" in
  --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
     bindir="$basedir/bin"
   if test -z "$datadir_set"; then
    datadir="$basedir/data"
   fi
   sbindir="$basedir/sbin"
   libexecdir="$basedir/libexec"
  ;;
  --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
   datadir_set=1
 ;;
  --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
  --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
 esac
 done
}

判断my_print_defaults的位置

率先,它推断当前路径下的bin目录中是不是存在该可施行文件,假如不设有,则再决断$bindir(平日指的是$basedir/bin)目录下是还是不是存在。

一经如故尚未,则会剖断/etc/my.cnf是不是存在并且可读,假设是,则判别该配置文件中是还是不是钦定了basedir参数,

要是钦赐了,则抽出该参数的值,并认清该值对应的目录中是还是不是存在bin/my_print_defaults可试行文件

末尾一步,假设在上述目录中实际没察觉my_print_defaults文件,

大约就将print_defaults设置为"my_print_defaults",寄希望于该命令在现阶段的PATH情形中。

# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
then
 print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
 print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
 print_defaults="$bindir/mysql_print_defaults"
else
 # Try to find basedir in /etc/my.cnf
 conf=/etc/my.cnf
 print_defaults=
 if test -r $conf
 then
 subpat='^[^=]*basedir[^=]*=(.*)$'
 dirs=`sed -e "/$subpat/!d" -e 's//1/' $conf`
 for d in $dirs
 do
  d=`echo $d | sed -e 's/[  ]//g'`
  if test -x "$d/bin/my_print_defaults"
  then
  print_defaults="$d/bin/my_print_defaults"
  break
  fi
  if test -x "$d/bin/mysql_print_defaults"
  then
  print_defaults="$d/bin/mysql_print_defaults"
  break
  fi
 done
 fi
 # Hope it's in the PATH ... but I doubt it
 test -z "$print_defaults" && print_defaults="my_print_defaults"
fi

招来暗中同意的布局文件

-r file 倘诺文件可读,则为真

#
# Read defaults file from 'basedir'. If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
extra_args=""
if test -r "$basedir/my.cnf"
then
 extra_args="-e $basedir/my.cnf"
else
 if test -r "$datadir/my.cnf"
 then
 extra_args="-e $datadir/my.cnf"
 fi
fi

分析配置文件中的参数

my_print_defaults的用法如下:

my_print_defaults --defaults-file=example.cnf client mysql

即读取配置文件中,client和mysql部分的参数配置,

具体在本脚本中,是读取mysqld,server,mysql_server,mysql.server五个部分的配置参数。

parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`

设置pid file的路径

-z string 决断字符串是还是不是为空

如果--pid-file未有在读取到的布署文件中安装可能脚本刚开头的mysqld_pid_file_path参数未有设置,

则pid file暗中同意设置在datadir下,以主机名.pid命名。

假若该参数设置了,还索要更为推断

比如该参数中涵盖斜杠,则象征给定的值带有路线,可从来选择。

若果该参数中没带路线,则象征给定的值只是pid的文件名,可将其设在datadir下。

#
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
 mysqld_pid_file_path=$datadir/`hostname`.pid
else
 case "$mysqld_pid_file_path" in
 /* ) ;;
 * ) mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
 esac
fi

劳动脚本start选项

首先,切换到$basedir中

其次,判断$basedir/bin中的mysqld_safe是不是是可试行文件,就算是,则运营mysqld实例,借使不是,则报错退出。

那么,运维流程又是何等兑现的呢?

首先,执行$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &命令,启动mysqld实例。

只顾到没有,mysqld_safe其实是在basedir中施行的,包含mysql开首化脚本mysql_install_db,也建议在basedir中实施,具体可参谋:

深入分析玛丽亚DB开始化脚本mysql_install_db

下一场经过wait_for_pid函数实行推断,具体可知下文对于wait_for_pid函数的辨析

认清完毕后,

查看$lockdir目录是不是可写,可写的话,则在目录上创制1个文件。

case "$mode" in
 'start')
 # Start daemon
 # Safeguard (relative paths, core dumps..)
 cd $basedir
 echo $echo_n "Starting MySQL"
 if test -x $bindir/mysqld_safe
 then
  # Give extra arguments to mysqld with the my.cnf file. This script
  # may be overwritten at next upgrade.
  $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
  # Make lock for RedHat / SuSE
  if test -w "$lockdir"
  then
  touch "$lock_file_path"
  fi
  exit $return_value
 else
  log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
 fi
 ;;

wait_for_pid函数

在利用mysqld_safe运维mysql实例后,会调用该参数

wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

其中$!在shell中用来获取最终运维的后台Process的PID,具体在本例中,是mysqld_safe进程的pid。

因为第一个参数是created,所以会实施test -s "$pid_file_path" && i='' && break命令。

-s file 倘诺文件的长短不为零,则为真

该命令的乐趣是假若pid文件存在,则将变量i设置为空,并脱离while循环。

然后试行如下推断,

if test -z "$i" ; then
 log_success_msg
 return 0
 else
 log_failure_msg
 return 1
 fi

只要$i为空,则打印成功日志,并脱离脚本,很显眼,在pid文件存在的气象下,会将变量i设置为空。

再来看看pid文件不存在的景况

第二,会判断$pid是不是不为空(即if test -n "$pid")

若是不为空,则代表在施行完mysqld_safe后,已经捕捉到了该进度的pid。

在这种气象下,进一步通过kill -0 "$pid"确认该进程是或不是留存。

kill -0就是不发送任何复信号,可是系统会实行不当检查,所以平日用来检查3个进程是否留存,当进度不存在时, kill -0 pid会再次回到错误

借使该进度存在,则不实践其它操作,直接跳到如下操作

echo $echo_n ".$echo_c"
i=`expr $i   1`
sleep 1

将变量i加1,并sleep 1s。

下一场,继续while循环,之所以那样做,是考虑到mysqld_safe已经进行,但是mysqld实例还在起步进程中,还没创建好pid文件。

一直到$1达到$service_startup_timeout定义的时间长度。

借使在while循环的经过中,通过kill -0 "$pid"推断到进度早已不设有了,

则会再判别贰遍,假如此番判定的结果照旧依然是pid file不设有,且经过不存在,则会进行

log_failure_msg "The server quit without updating PID file ($pid_file_path)."

那正是有目共睹的“The server quit without updating PID file”的由来。

wait_for_pid () {
 verb="$1"   # created | removed
 pid="$2"   # process ID of the program operating on the pid-file
 pid_file_path="$3" # path to the PID file.
 i=0
 avoid_race_condition="by checking again"
 while test $i -ne $service_startup_timeout ; do
 case "$verb" in
  'created')
  # wait for a PID-file to pop into existence.
  test -s "$pid_file_path" && i='' && break
  ;;
  'removed')
  # wait for this PID-file to disappear
  test ! -s "$pid_file_path" && i='' && break
  ;;
  *)
  echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
  exit 1
  ;;
 esac
 # if server isn't running, then pid-file will never be updated
 if test -n "$pid"; then
  if kill -0 "$pid" 2>/dev/null; then
  : # the server still runs
  else
  # The server may have exited between the last pid-file check and now. 
  if test -n "$avoid_race_condition"; then
   avoid_race_condition=""
   continue # Check again.
  fi
  # there's nothing that will affect the file.
  log_failure_msg "The server quit without updating PID file ($pid_file_path)."
  return 1 # not waiting any more.
  fi
 fi
 echo $echo_n ".$echo_c"
 i=`expr $i   1`
 sleep 1
 done
 if test -z "$i" ; then
 log_success_msg
 return 0
 else
 log_failure_msg
 return 1
 fi
}

劳务脚本stop选项

先是,判定pid文件的长短是不是不为零。

-s file 借使文件的尺寸不为零,则为真

那时,会经过pid文件获取mysqld进度的pid,注意,不是mysqld_safe进程的pid

接下来,判定mysqld进程是还是不是在例行运作,

如果是,则通过kill $mysqld_pid的点子来关闭mysqld进度

杀死进度最安全的措施是单独施用kill命令,不加修饰符,不带标记。

标准的kill命令经常会截止有题指标进度,并把进程的财富自由给系统。不过,即使经过运维了子进度,只杀死父进度,子进程仍在运维,因而仍消耗财富。为了防范这几个所谓的“僵尸进程”,应保险在杀死父进程在此以前,先杀死其有着的子进度。

然后,调用wait_for_pid函数举办判定,其实,wait_for_pid函数中设置avoid_race_condition变量的目标是为了stop选项,确实有希望出现,mysqld是在检讨pid file之后,检查进度是或不是存活在此以前退出的。

如果mysqld进度未有正规运转,在会打印“MySQL server process #$mysqld_pid is not running!”信息,并删除pid文件。

借使在实施stop的时候,决断pid文件的长短为0,则会打印"MySQL server PID file could not be found!"信息。

从而,在pid文件不存在的动静下,通过服务脚本实践stop选项并不会关闭mysqld进度,那个时候,就可通过kill $mysqld_pid的方式来关闭mysqld进度。

'stop')
 # Stop daemon. We use a signal here to avoid having to know the
 # root password.
 if test -s "$mysqld_pid_file_path"
 then
  mysqld_pid=`cat "$mysqld_pid_file_path"`
  if (kill -0 $mysqld_pid 2>/dev/null)
  then
  echo $echo_n "Shutting down MySQL"
  kill $mysqld_pid
  # mysqld should remove the pid file when it exits, so wait for it.
  wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
  else
  log_failure_msg "MySQL server process #$mysqld_pid is not running!"
  rm "$mysqld_pid_file_path"
  fi
  # Delete lock for RedHat / SuSE
  if test -f "$lock_file_path"
  then
  rm -f "$lock_file_path"
  fi
  exit $return_value
 else
  log_failure_msg "MySQL server PID file could not be found!"
 fi
 ;;

劳动脚本restart选项

先是,先施行stop操作,借使stop操作成功的话,则继续推行start操作。

借使stop操作战败以来,则会输出"Failed to stop running server, so refusing to try to start."新闻,并脱离脚本。

 'restart')
 # Stop the service and regardless of whether it was
 # running or not, start it again.
 if $0 stop $other_args; then
  $0 start $other_args
 else
  log_failure_msg "Failed to stop running server, so refusing to try to start."
  exit 1
 fi
 ;;

服务脚本reload选项

首先,判定pid文件的尺寸是还是不是为0,借使不为0,则将该文件中的值设置为mysqld_pid变量的值。

下一场对该进度实行kill -HUP操作。

kill -HUP pid

pid 是进程标志。即使想要改变配置而不需终止同样器重复启航服务,请使用该命令。在对计划文件作须求的更换后,发出该命令以动态更新服务配置。

依附预订,当您发送三个挂起频域信号(复信号 一 或 HUP)时,大许多服务器进度(全数常用的长河)都会议及展览开复位操作并再一次加载它们的布署文件。

设若pid文件的长短为0,则输出"MySQL PID file could not be found!"。

 'reload'|'force-reload')
 if test -s "$mysqld_pid_file_path" ; then
  read mysqld_pid < "$mysqld_pid_file_path"
  kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
  touch "$mysqld_pid_file_path"
 else
  log_failure_msg "MySQL PID file could not be found!"
  exit 1
 fi
 ;;

服务脚本status选项

首先,决断pid文件长度是还是不是为0,若是或不是,则读取该文件中的值,并剖断pid对应的进度是不是运转如常,

壹旦运维符合规律,则输出"MySQL running"

只要不平常,则输出"MySQL is not running, but PID file exists"

假如pid文件的长度为0,则希图通过mysqld的开发银行命令来收获其pid,

本条时候,恐怕存在三个mysqld程序运转了八个实例,这会招致pid_count=`echo $mysqld_pid | wc -w`大于1。

本条时候,会输出"Multiple MySQL running but PID file could not be found"消息,并脱离脚本。

如果mysqld_pid为空,则会一连推断"$lock_file_path"是还是不是存在,假诺存在,

则会输出"MySQL is not running, but lock file ($lock_file_path) exists"信息。

如果"$lock_file_path"不设有,则会输出"MySQL is not running"音讯。

如果mysqld_pid等于壹,则会输出"MySQL is running but PID file could not be found"音讯。

 'status')
 # First, check to see if pid file exists
 if test -s "$mysqld_pid_file_path" ; then 
  read mysqld_pid < "$mysqld_pid_file_path"
  if kill -0 $mysqld_pid 2>/dev/null ; then 
  log_success_msg "MySQL running ($mysqld_pid)"
  exit 0
  else
  log_failure_msg "MySQL is not running, but PID file exists"
  exit 1
  fi
 else
  # Try to find appropriate mysqld process
  mysqld_pid=`pidof $libexecdir/mysqld`
  # test if multiple pids exist
  pid_count=`echo $mysqld_pid | wc -w`
  if test $pid_count -gt 1 ; then
  log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
  exit 5
  elif test -z $mysqld_pid ; then 
  if test -f "$lock_file_path" ; then 
   log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
   exit 2
  fi 
  log_failure_msg "MySQL is not running"
  exit 3
  else
  log_failure_msg "MySQL is running but PID file could not be found"
  exit 4
  fi
 fi
 ;;

劳动脚本其余选项

比如脚本的第1个参数不是上述多少个挑选,则会输出Usage音信。

 *)
  # usage
  basename=`basename "$0"`
  echo "Usage: $basename {start|stop|restart|reload|force-reload|status} [ MySQL server options ]"
  exit 1
 ;;

迄今停止,mysql的劳动脚本深入分析完成~

总结

在经过劳动脚本运转mysql的经过中,报“The server quit without updating PID file”错误,有多少个原则

先是,pid文件不设有

帮助,通过kill -0 $pid检查到进程并不存在

那年,只能通过mysql数据库的谬误日志来恒定。

劳动脚本假如不做别的调度的话,暗中同意的basedir是/usr/local/mysql,datadir是/usr/local/mysql/data

只要自个儿的mysql服务均不是私下认可路径,

则必要在该脚本中显式设置

经测试,需安装如下几处:

  1. 设置basedir和添加conf变量

里面,conf指的是mysqld的安插文件,提出配置文件中显式钦点basedir和datadir的值。

在此处,datadir可不设置,因为datadir可因而计划文件来得到。

但是basedir必须要钦点,因为要率先依据basedir来推断my_print_deefauts命令

basedir=/usr/local/mysql-advanced-5.6.23-linux-glibc2.5-x86_64
datadir=
conf=/usr/local/mysql-advanced-5.6.23-linux-glibc2.5-x86_64/my_3308.cnf 
  1. 第256行,添加extra_args=" -c $conf"

    extra_args=" -e $basedir/my.cnf.bak" if test -r "$basedir/my.cnf" then extra_args="-e $basedir/my.cnf" else if test -r "$datadir/my.cnf" then extra_args="-e $datadir/my.cnf" fi fi extra_args=" -c $conf"

  2. 修改285行mysqld_safe的起步参数

 $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

修改为,

  $bindir/mysqld_safe --defaults-file="$conf" --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

一言玖鼎是增多了--defaults-file选项

以上所述是作者给大家介绍的深度分析MySQL运营时报“The server quit without updating PID file”错误的缘由,希望对大家有着帮忙,假若我们有其余疑问请给作者留言,笔者会及时过来大家的。在此也特别谢谢我们对帮客之家网址的帮衬!

server quit without updating PID file”错误的缘故,mysqlupdating 多数童鞋在起步mysql的时候,蒙受过那个荒唐, 首先,澄...

<1>环境篇

必然,DBA是急需综合技巧最多的2个差事,供给你有网络、操作系统、文件系统、数据库、安全、编程等知识。作为DBA,为了少犯错误,你首先得那多少个熟谙你承担的数据库蒙受,大到网络遭逢、系统遇到、数据库碰到(这里关键以mysql为例)。如果不熟悉碰着,很轻便因为自己操作思虑不周而导致线上的故障。想想就通晓,有微微DBA因为alter操作导致的线上故障?有些许DBA忽略了字符集的标题导致了线上的乱码?又有多少DBA由于搬迁的时候没有备份触发器或许event导致的故障?太多的训诫足以让大家全体的DBA认知到熟谙景况的机要。其它DBA对线上景况壹旦丰富理解,在管理故障、切磋管理方案等,都能相当大地拉长大家的自信,越来越好地进级自个儿的影响力。大家能够说素不相识情形的DBA不是好DBA。上面来介绍景况某些我们DBA应该专注的难点:

1、软件条件

1.一 操作系统情状

本着操作系统部分,你可能须要驾驭的是行使的操作系统类型,linux or windows,该系统做了什么样基本的优化,特别是本着数据库,譬喻文件描述符、配置ntp、raid的写cache模式等,此外你还要对系统的运维情况有大致的刺探,CPU使用、内部存款和储蓄器使用、IO使用以及网络带宽和包量的情事。

一.二 数据库处境

数据库景况包含的内容就那贰个多了,这里只介绍假使不打听比较轻易导致误操作的1对:

一.三 布置格局

对于数据库的配备,大家须要通晓数据库是什么布署的,布置在了怎样目录,可实践文件、数据文件、log文件、配置文件等的存放路线,数据库如何运行和终止等

一.四 使用引擎

问询当下数据库暗许使用的引擎,以及现成的表使用的内燃机,提前知道地询问各种引擎的特点和应用,幸免在现身数量迁移、表损坏以及运维难点手忙脚乱导致误操作。(大家的技术如同器具库,都以靠平常闲淡中的储存和创造,在出难点的时候平素从火器库拿来行使,由此要平日丰硕我们的“武器库”)

备注:即使现在着力使用的都是innodb引擎,不过,你也如出1辙能够窥见有个别还用了Myisam,以致还有些使用了memory、merge、spider、tokuDB等。

壹.5 同步方式

如今mysql基本都会配备同步(若是未有一定要抬高,除非是多少丢了也许长日子故障也没提到的库),既然涉及到一同就能有种种区别的办法。比方大规模的分类:

基于binlog和pos的同步

基于GTID的同步

异步

半同步

单线程同步

八线程同步

针对那个共同,都有一对不等的表征,举例出现难点了,须要跳过某些地点,gtid的一道和基于pos的同步操作就不壹致,同步方式也是您不能够不调控的技巧。

1.6 版本

在保卫安全数据库的时候,还索要领悟当前数据库使用的大学本科子。因为数据库的大学本科子的效应会有非常大的差别,有为数十分的多特征是只存在有个别大学本科子的,由此明白使用的本子能让你大致掌握当前数据库协理什么特色。在提到到搬迁、同步、数据库晋级等操作的时候,能从容应对。

1.7 存款和储蓄进度(procedure)、事件(event)

打听当前数据库是还是不是留存存款和储蓄进程和事件,在数据备份、数据迁移的时候,须要将相应的积累进度和事件的参数增多进去,别的纵然存在事件,在搬迁的时候会有特异的操作,在搬迁的靶子机器要现将事件关闭,切换后再展开。幸免事件导致数据不均等。

一.八 关键配置

mysql有几项特别主要的布局,须求领会清楚,制止由于配备没搞理解导致误操作,计算关键配置如下:

innodb_buffer_pool_size

#对innodb生效,对品质影响优秀大,一般能够安装内存的50~80%

key_buffer_size

#对Myisam生效,建议修改成innodb

innodb_flush_log_at_trx_commit

#innodb的redo日志刷新格局,对innodb的影响会相当的大,一般设置为二

log-bin

#是或不是上马binlog,借使未有拉开,一定要展开

sync_binlog

#刷binlog的格局,一般设置为0,假如对数码需求强1致的,能够将sync_binlog设置为大于1的数,兼顾安全和属性

innodb_file_per_table

#动用独立表空间,建议都设置成独立表空间,不然前面磁盘空间满了,删除表空间也无能为力自由,必须做多少迁移

lower_case_table_names

#标识区分轻重缓急写

character_set_server

#字符集在搬迁、数据库退换、数据导入等都是需要求专注的,不然数据乱码了就能很辛劳

max_connections

#最达累斯萨拉姆接数不可能安装太大,要总括一下session内部存款和储蓄器*max_connections 固定内部存款和储蓄器 < 总内存-2G(这贰G用来做系统内部存储器,留给系统的内部存款和储蓄器能够再设大学一年级点)

transaction_isolation

#设置隔开分离品级,默许是Repeatable Read,假诺是binlog是row格局,也每每设置为Read Committed品级

不无方面说的参数,都急需深切明白和熟识,当我们在做多少迁移的时候依旧搭建mysql的时候,一定要比对一下和源实例的配置(比对工具得以参照pt-config-diff工具),以防迁移实现后由于参数不均等,中途要重启实例的境况。在那么些主题材料上,小编见过太多的训诫,希望大家能吸取教训,收缩故障和问题的发出。

1.玖 数据库情况采撷工具介绍

前方大家介绍了数据库的连带的情况,对于那么多的景况变量,我们怎么着越来越好的去采访,这里给我们介绍1个工具

pt-mysql-summary

本条工具的现实性用法能够google通晓,也得以访问如下链接明白,不在本文的演讲范围:

2、硬件

硬件相关的音信也是大家需求关切的,针对每一个硬件咱们都会有大约的QPS、TPS等指标,那个对于新上业务的评估以及评估现在数据库的瓶颈很有帮助,对于硬件你供给了结CPU核数、内部存款和储蓄器的高低、硬盘的介质(SAS? PCIE SSD ?NVME SSD?),最佳对线上的广大机型都有详实的压测数据。领悟每1种机型在mysql中的表现,也是反映DBA专门的学问度的三个目的。

日常有DBA由于不精通各样机型大概能支撑的性能,在方案选型和设施选型探究中,不可能肯定地断定实际供给如何设备,当前的装置配置是或不是能抗住对应的访问量,导致官员和付出对该DBA的专门的学问度大优惠扣。倘若我们在平日专门的职业中有闲暇的机械,无妨采纳sysbench、mysqlslap、fio等工具捣鼓一下。

3、运转状态

用作DBA,我们还亟需了解今后的实例的运作意况,如下多少个目标都以我们要求掌握的:

数据库数据量和表的数据量

#数据量到稍微G,非常是单表的数据量

实例负载情状(CPU负载、IO负载、系统负荷)

慢查询情状

SQL延迟意况

锁情况

脏页情形

访问模型

#做客模型就是那数据库承担的是读多写少依然读少写多,以及是不是是高并发等等

针对上述难题,能够运用pt-mysql-summary工具获得,再加以深入分析,也足以经过如下多少个工具来实时翻看

innotop

orzdba


<二>数据安全篇

针对数据安全,主要涵盖如下多少个部分

1、权限安全

在权力方面,大家常常晤面到有众多的数据库根本就不曾密码,大概给业务的用户选拔完全的权能(all privileges),只怕是给某些帐号能够从别的地点登入的权位,这几个都以不行沉重的。提议在给予权限的时候注意如下几点:

数据库一定设置符合密码复杂度的用户密码

明确命令禁止给用户设置%的登入机器

只给业务最小权限的帐号,并限量登陆的机器

二、数据1致性

眼下相像都以主导架构,主从的数量是还是不是1律?九成上述的主干架构都非常不够数据一致性校验,以前蒙受主从切换后数据差异的情状,导致线上故障。

为了保险数据的1致性,记得周期性地使用pt-table-checksum来检查基本数据是还是不是相同,要是不平等,能够动用pt-table-sync实行修补。

本文由ca88手机版登录发布于亚洲城ca88手机版官网,转载请注明出处:是因为你做的功课不够,深度解析MySQL启动时报

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。