30.2. MySQL服务器多实例及测试实验

多实例

由于生产中随着数据库的版本更新或者其他要求,有可能需要在一台主机上装不同版本(或者相同版本)的多个数据库,(这里的数据库指的就是以数据库端口号分离开的一整个数据库,而并非指的是一个数据库里面的database,注意区分)。
这里就需要用到多个实例来实现,它的实现逻辑如下:

同一个版本的Mysql数据库的多个示例:

分析

首先,如果是同一个版本的数据库,我们只需要一个数据库服务的应用程序和服务的主体(也就是上一篇中/usr/local/mysql下的各种文件)即可,多个示例其实就是多个数据库的存储位置(相当于多个不同的文件夹),以及它们分别各自的配置文件(比如说指定端口号,指定数据库存储位置,socket文件等等)
也就相当于一个mysql应用服务程序在内存中开启多个进程,每一个进程互不干扰都是一个数据库服务,都有自己的数据库存储目录以及自己的配置文件。只不过在这里因为是相同版本的数据库,这些多个实例只需要共用一套服务主体文件即可。
这些maysql服务载入内存后就独立开了,因为载入内存时会根据配置文件开启进程,载入之后服务主体中的各种文件都不会再影响这个进程了,这个数据库的进程只会修改数据库目录中的内容。(相当于windows中多开记事本,相互不干扰,相互独立修改和保存数据;开一个就开启一个新的进程和独立的内存以及数据空间,只不过mysql这里数据空间就是数据库的存储目录,也就是一个实例)

相同版本多实例实现的测试过程:

实现3各不同实例(3个数据库,3个监听端口,3个数据库服务同时启动),以二进制已经安装过的mysql为例,其他的类似。
注意下面多示例之前需安装好一个mysql服务,前面的安装过程按照上一章的过程一步一步进行,这里不赘述。

  1. 创建3个实例的文件夹目录:
    mkdir /data/mysql/{3306,3307,3308}/{data,etc,socket,bin,log,pid} -pv
  2. 修改这个总的文件夹的属主属组(前面的博客说过只需要改数据库属性,也就是相当于/data/mysql/data这个目录,不过现在直接修改整个属主属组/data/mysql更加方便于mysql用户来使用)
    chown -R mysql.mysql /data/mysql
  3. 然后生成数据库的文件(利用生成数据库脚本)
    • 如果是yum安装,因为都在/usr/bin下面,所以直接执行mysql_install_db --datadir=/data/mysql/3306/data --user=mysql命令即可(另外两个实例的data目录同理再执行两遍即可)
    • 如果是二进制和编译安装的话,注意要在脚本文件夹scripts的上级目录进行这个脚本才能找到bin这个目录,才能生成数据库到data下
  4. 参考/etc/my.cof这个系统本身自带的配置文件进行修改并放入各个实例的etc目录下(这里只写了3306的,另外两个修改即可),注意添加一项端口号port=
    • 其中二进制安装或者是源码编译的也可以参考support-file中的my-huge.cnf这个文件来写,不过这里为了方便就按照/etc/my.cof修改即可
    • 不过有一点要注意的就是,mysqld启动的时候按照配置文件的顺序来启动,因为自己定义的/data/mysql/330X/etc文件夹并不在mysqld服务启动的默认搜索路径下,因此它还会以/etc/my.cof生效来使用配置(除非后面还有比他优先级更高的cof文件)。因此需要注意。
    • 其中的目标数据库目录,socket文件目录,日志文件目录,pid目录都需要修改为各自的对应的示例中(如果按照自带的my.cof写的话)
    • 这里面的配置其实可以写很多,包括二进制安装中的配置文件也是一样,my-huge.cnf文件中就没有指定[mysqld_safe]中的log文件存放位置,默认的自带文件指定了,因此最好把它俩结合起来使用,弄一个不论是yum,二进制还是源码都通用的配置文件。
    • 更多的看后面的分析
=======================================================默认的项目:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock                           
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

=======================================================修改之后的项目:
[mysqld]      
port=3306
datadir=/data/mysql/3306/data
socket=/data/mysql/3306/socket/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/data/mysql/3306/log/mariadb.log
pid-file=/data/mysql/3306/pid/mariadb.pid

[client]
#password       = your_password
port            = 3306
#socket         = /data/mysql/mysql.sock
socket=/data/mysql/3306/socket/mysql.sock

!includedir /etc/my.cnf.d
  1. 针对不同的端口号,创建服务脚本文件:
    • 可以复制3个下面的服务脚本文件分别起不同的名字(比如mysql330X),修改里面的配置后(加上注释)到/etc/init.d下面来创建服务的方式启动它们(此时systemclt status命令显示会错误,但是实际上服务已经启动了)
    • 或者分别复制它们到各个/data/mysql/330X/bin下面,启动的时候直接指定绝对路径启动即可,不添加到service服务中。
      下面只写出了3306端口的,另外俩个类似:
      附加知识点:修改密码可用mysqladmin 同时-S指定socket来修改,连接这些数据库的时候也可以用mysql -S指定socket来连接,或者指定host(ip)以及端口号连接(此时就是通过网络连接了,需要在user中设置允许)
改为服务启动要添加的项目:(启动顺序64,36可以都写成一样的,只要服务脚本文件名字改为不一致即可,它会自动排序的),添加之后便可以用service mysql330X start 方式启动了:

#!/bin/bash : 这里改为bash
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36                                                                                                                                                                        
# description: A very fast and reliable SQL database engine.
启动脚本:
#!/bin/bash

port=3306
# mysql_user="root" :此项包括下一项是为了mysqladmin关闭服务使用的,最好不要这种方式,因为写上了明文的用户名和密码
# mysql_pwd=""
cmd_path="/usr/local/mysql/bin" #:写上自己安装mysqld的bin的位置,yum的话就直接是/usr/bin:它用于多个实例共同利用mysql的主体程序脚本等,而无需多次安装相同版本的mysql
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
pid_file="${mysql_basedir}/${port}/pid/mariadb.pid"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

#function_stop_mysql()
#{
#    if [ ! -e "$mysql_sock" ];then
#       printf "MySQL is stopped...\n"
#       exit
#    else
#       printf "Stoping MySQL...\n"
#       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
#   fi
#}

#:类似参考原装脚本关闭服务,不需要密码等
function_stop_mysql() 
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit;
    elif [ -e "$pid_file" ];then
       read mysqld_pid < "$pid_file"
       printf "Stoping MySQL...\n"
       kill $mysqld_pid;
       exit;
    else 
       cd "${mysql_basedir}/${port}/data/"  
       read mysqld_pid < "${mysql_basedir}/${port}/data/`ls *.pid`"
       printf "Stoping MySQL...\n"
       kill $mysqld_pid;
       exit;
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
  1. 此时可用客户端命令mysql连接即可。注意了,客户端命令mysql的配置文件服务器端mysqld的配置文件虽然可以写在一起,但是用起来的时候还是不同的。可用mysql --help查看客户端命令mysql配置文件的顺序关系和位置(前面几行写的有)
    • 可以用mysql -uroot@HOST -pPWD -S/data/mysql/3307/socket/mysql.sock 连接
    • 也可以用 mysql -uroot@host -pPWD --defaults-extra-file=/data/mysql/3308/etc/my.cnf (前提是这个文件里写上了客户端连接用的端口号和socket文件位置,参见4中所写的[mysql]栏中)
  2. 目前默认设置的实例还有安全问题,但是当前已经不能用安全加固脚本了,所以:
    • 其中如果需要修改密码则用mysqladmin命令,注意要按照6中类似的方式,指定-S的socket文件来修改相应的用户名口令(前提是要先把服务器动起来,服务不启动这个命令是无法用的)。
    • 而至于那些匿名用户登陆和远程直接连接的用户的删除,则直接用delete的命令方式删除mysql这个数据库中user表中对应的行即可


这里接着上面步骤4中继续分析

  • 这里面需要说明的是,二进制安装时因为参考的my.huge.cfg文件是官网已经编译好的,这里面它把socket文件(unix socket)放在了/tmp/mysql.sock下。最终生成并使用的sock文件也在这个目录下。
  • 而yum安装和源码编译安装分别在/var/lib/mysql/mysql.sock 和 /data/mysql/mysql.sock(此为自己当时源码指定的家目录文件夹下)
  • 不过经过测试得知,这个sock文件,是由配置文件指定之后(注意客户端和服务器端的栏目下都要指定socket),++通过重启服务(service命令)生成的,而不是通过mysql_install_db这个脚本生成的,它仅仅是一个临时文件,服务器动的时候存在,关闭了就会删除++,
  • 经过更多测试得知,那些日志的文件(包括默认数据库文件) ,也是通过重启mysqld服务(service命令)就会根据my.cnf文件中的[mysqld]栏目下的配置文件自动生成。
  • 其中就是因为上面的配置中写的[mysqld_safe]这个脚本指定的两个log文件位置,这两个文件会被mysqld_safe脚本自动生成(因为二进制安装或者编译安装的时候启动service服务的时候就是启动的这个脚本)
  • 通过mysql_install_db的帮助信息的选项也可以看出一些端倪,说明配置文件有好多个,选项也被分散到了这些不同的文件中。
  • 下面就是部分的测试结果:

在yum的安装环境下,按照配置文件什么都不写的前提下(yum安装导致配置文件里面为空),则删除掉yum安装的数据库文件夹/var/lib/mysql下的所有文件之后,再次用mysql_install_db 命令生成的文件内容为:

==============================================================删除之前默认的:
23:24[root@centos7 /var/lib/mysql]# ls
aria_log.00000001  centos7.pid     ibdata1      ib_logfile1  multi-master.info  mysql.sock          tc.log
aria_log_control   ib_buffer_pool  ib_logfile0  ibtmp1       mysql              performance_schema  test
==============================================================删除之后重新生成的:
23:34[root@centos7 /var/lib/mysql]# ls
aria_log.00000001  aria_log_control  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test

不过重启服务后systemctl restart mysql ,就恢复了之前的所有数据,包括sock文件:
结合下面部分的分析应该得知,利用yum和systemctl的mysql应该把这些配置文件写在了其他地方(可能在unit.service中)

00:05[root@centos7 /var/lib/mysql]# ls
aria_log.00000001  centos7.pid     ibdata1      ib_logfile1  multi-master.info  mysql.sock          tc.log
aria_log_control   ib_buffer_pool  ib_logfile0  ibtmp1       mysql              performance_schema  test

通过查看yum安装的rpm -ql mariadb-server 中的/usr/lib/systemd/system/mysqld.service,可看到注释中也写了变量的定义位置(在下面)

# Start main service
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
# Use the [Service] section and Environment="MYSQLD_OPTS=...".
# This isn't a replacement for my.cnf.
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
  • 注意了,centos7中yum安装的mysqld服务默认是用systemctl启动的,它和二进制安装(或源码安装)利用service启动的不同,直接用yum安装的有unit.service文件,而二级制和源码的没有这个。
    下面分别是yum安装和二进制安装服务状态区别:
    注明:不过在官网上还有个安装包注明了利用systemd的版本,如果是用它来进行二进制安装(或者源码安装)可能就可以利用systemd来启动了,这里没有做更深入的测试,之后有空再研究。
==============================================================================YUM的(systemd):
23:50[root@centos7 /var/lib/mysql]# systemctl status mysql
● mariadb.service - MariaDB 10.3.14 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since Tue 2019-04-16 23:15:16 CST; 36min ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 23719 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 23675 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 23672 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 23687 (mysqld)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mariadb.service
           └─23687 /usr/sbin/mysqld

Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: 10.3.14 started; log sequence number 1630815; transaction id 21
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: Buffer pool(s) load completed at 190416 23:15:16
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Plugin 'FEEDBACK' is disabled.
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Server socket created on IP: '::'.
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Reading of all Master_info entries succeded
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Added new Master_info '' to hash table
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] /usr/sbin/mysqld: ready for connections.
Apr 16 23:15:16 centos7.6test mysqld[23687]: Version: '10.3.14-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server
Apr 16 23:15:16 centos7.6test systemd[1]: Started MariaDB 10.3.14 database server.

========================================================================================二进制的(init.d下服务脚本的)
20:27[root@centos7 /usr/local/mariadb-10.2.23-linux-x86_64/support-files]# systemctl status mysqld.service 
● mysqld.service - LSB: start and stop MariaDB
   Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
   Active: active (running) since Mon 2019-04-29 17:58:44 CST; 1 day 2h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 8290 ExecStop=/etc/rc.d/init.d/mysqld stop (code=exited, status=0/SUCCESS)
  Process: 8356 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mysqld.service
           ├─8420 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/centos7.6test.pid
           └─8556 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysq...

Apr 29 17:58:43 centos7.6test systemd[1]: Starting LSB: start and stop MariaDB...
Apr 29 17:58:43 centos7.6test mysqld[8356]: Starting MariaDB.190429 17:58:43 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
Apr 29 17:58:43 centos7.6test mysqld[8356]: 190429 17:58:43 mysqld_safe Starting mysqld daemon with databases from /data/mysql
Apr 29 17:58:44 centos7.6test mysqld[8356]: SUCCESS!
Apr 29 17:58:44 centos7.6test systemd[1]: Started LSB: start and stop MariaDB.

通过ps aux |grep mysql 可以看到这些变量的具体是什么,以及mysqld 服务的参数是啥
同样的yum安装的利用systemd服务的和自定义安装没有利用systemd服务而是service服务的是有区别的:

  1. 下面是二进制的,可以看到主服务mysqld的参数,是通过mysqld_safe脚本启动
root       8420  0.0  0.0 115436  1748 ?        S    17:58   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/centos7.6test.pid
mysql      8556  0.0  7.5 2008736 140732 ?      Sl   17:58   0:10 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/data/mysql/centos7.6test.pid --socket=/tmp/mysql.sock --port=3306
root      14724  0.0  0.0 112708   976 pts/0    S+   22:08   0:00 grep --color=auto mysql

同时查看init.d下的启动脚本可知:
mysqld服务启动的时候是先启动的bin目录下的$bindir/mysqld_safe(个人猜想要加密码)脚本,然后此脚本再启动mysqld主服务程序。

ase "$mode" in                                                                                                                                                                                
  'start')
    # Start daemon

    # Safeguard (relative paths, core dumps..)
    cd $basedir

    echo $echo_n "Starting MariaDB"
    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" "$@" &
      wait_for_ready; 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 MariaDB server ($bindir/mysqld_safe)"
    fi
    ;;
  1. 下面是yum安装的,直接就是由mysqld启动的,也没有加什么参数(这些参数应该写在了/usr/lib/systemd/system/mariadb.service文件中)
23:51[root@centos7 /var/lib/mysql]# ps aux | grep mysql
mysql     23687  0.0  4.7 1764724 88244 ?       Ssl  Apr16   0:02 /usr/sbin/mysqld
root      25024  0.0  0.0 112708   980 pts/0    S+   00:00   0:00 grep --color=auto mysql
  • 目前暂未清楚是不是因为centos7中yum安装的这个/usr/sbin/mysqld文件本身中就写好了配置(按照yum定义的配置来写的,比如mysqld服务主体目录,数据库目录等等,参考service启动的mysqld后面的参数),所以用systemclt启动的mysqld服务就不需要再写参数了
  • 而yum安装的用service命令同样能启动(下面写的有怎么启动),只不过参数已经是多余的了(这些参数应该是safe脚本把mysqld启动的时候添加上去的,不过不清楚这些参数写在哪啦,可能就在safe中判断并定义了这些参数,因为yum安装的my.cnf是空的所以参数别的地方写的也有。
  • 猜想应该就是如果所有的配置文件为空,则就按照safe中写的默认的参数来开启服务,这些默认的就参数直接就写在safe中了;而如果配置文件存在且里面也有内容,不为空,则就按照配置文件中写的来添加参数,这样也刚好符合逻辑和实际测试结果:也就是配置文件中可以添加更多的参数来修改默认定义的参数,这些默认定义的参数肯定写入了某些地方,只不过不知道写在哪啦,猜测在safe脚本中或者直接mysqld二进制文件中)
  • 经过测试和查看得知,yum安装的包也是含有含有service脚本文件的,直接进入init.d文件夹中然后利用./mysql start的方式(不能用service mysql start ,因为这里这个命令会直接转到systemctl命令上,并不是service命令),也能以类似二进制的方式启动
  • 并且此时用ps aux | grep mysql 和二进制安装启动时的一样了,并不仅仅是上面2中所写的那样了。不过启动后,此时利用systemctl status mysql 可见它只是reload状态,但实际上已经启动了。
  • 此时如果再用systemctl命令启动一次,会再次开启一个2中的进程(mysqld服务但是没有参数)导致卡住(两个冲突了),因此必须kill掉这些服务进程之后再重新启动服务
  • 由此可见service和systemctl都可以启动,不过会有冲突。
  • 同时在centos7上,用yum安装的默认的service启动直接就指向了systemctl命令,但是用二进制(或者源码)安装的就算是在centos7上service命令和6中的也相同并没有指向systemctl命令。这一点也需要注意。
00:48[root@centos7 ~]# cd -
/etc/init.d
00:48[root@centos7 /etc/init.d]# ./mysql start
Starting MariaDB.190417 00:48:17 mysqld_safe Logging to '/var/lib/mysql/centos7.6test.err'.
190417 00:48:17 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
 SUCCESS! 
00:48[root@centos7 /etc/init.d]# ps aux | grep mysql
root      28345  0.1  0.0 113312  1656 pts/1    S    00:48   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/centos7.6test.pid
mysql     28414  2.4  4.3 1766812 81884 pts/1   Sl   00:48   0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/centos7.6test.err --pid-file=/var/lib/mysql/centos7.6test.pid
root      28449  0.0  0.0 112708   980 pts/1    S+   00:48   0:00 grep --color=auto mysql
00:48[root@centos7 /etc/init.d]# 

rm -rf /data/mysql/*

此命令可删除数据库所有信息,然后就可以清除掉root密码(暴力方式),不过只有测试的时候会这样做
然后再用mysql_instal_db命令重新安装数据库,此时查看它的帮助可以看到更多的选项,可以对数据库进行部分设置
然后重启数据库服务,此时会生成mysql.sock文件(根据配置文件所写)



排错:

为了实现多实例的脚本,同时不在启动脚本中中输入passwd(利用mysqladmin关闭mysql服务这种方式不合理)
想要参考service自带的写法

错误出现:当修改了init.d/mysqld服务脚本之后,(此时mysqld服务仍然在启动中,就是因为它才导致后面的问题) 。centos7中 systemctl命令提示我mysqld.service on disk changed ,需要 daemon-reload到内存中。因此deamon-reload之后,无论如何都无法启动mysqld服务了。

附加知识点1:systemctl 在centos7中同样的用来控制了service命令,可以用systemctl show mysqld.service 查看它的启动参数,从这里可以查看到,systemctl命令最终生成了一个/run/systemd/generator.late/mysqld.service服务脚本用于命令的启动

错误信息提示的是在wait_for_ready函数中kill -0 查找不到后台运行的最后一个命令的pid(这里用的是$!这个参数,它代表当前shell后台运行的最后一个进程PID)。
而在/init.d/mysqld脚本的start项目中可以看到mysqld_safe命令这一行是为了后台运行的,下一步才是wait_for_ready函数。
为了检测错误原因,自己手动启动mysqld_safe命令时(不加&后台启动)发现它总是无法启动(它不会卡住,而不卡主就代表没有启动成功,因为没有加&)
此时因为配置文件中写的有log-error的文件位置,(注意了,log文件位置的父目录如果不存在,则它是无法创建的),创建了一个log-errot文件,从这里面查看得到它没有创建一个另外的pid文件位置(两种情况,一个是文件位置不对,父目录不存在无法创建;一个是服务没有启动,当然不会有pid)
进而通过查看这个文件得知了无法启动的原因是因为sock文件不干净导致的,因为上面改服务的时候这个sock还在启动中。此时只要在配置文件中修改socket的位置或者说把原来的sock删除掉。然后再重启服务就行了(前面说过sock是重启服务生成的)

附加知识2: 可以参看/init.d/mysqld中服务脚本wait_for_ready的逻辑,它就是为了等待这个mysqld_safe命令完全启动并且启动mysqld之后,等到允许连接状态(有一个时间的阈值,一直在这个里面循环),利用了$!参数而已。

附加知识3:加入配置文件不写log-error位置,则默认位置就在数据库目录下。如果写了则不是。(如果写了之后再次注释掉或者删掉,重启服务,又变成了默认的。看来的确如上一个博客前面分析的逻辑,所有的变量和参数都有默认的配置不知道写在哪了,只有自己在配置文件中写了才会改变它)

23:11[root@centos7 /data/mysql]# mysqladmin variable |grep error 
| log_error                                              | /data/mysql/centos7.6test.err         

23:11[root@centos7 /data/mysql]# vim /etc/my.cnf  :修改log文件位置,取消注释
23:12[root@centos7 /data/mysql]# service mysqld restart
Restarting mysqld (via systemctl):                         [  OK  ]
23:12[root@centos7 /data/mysql]# mysqladmin variable |grep error 
| log_error                                              | /data/mariadb.log       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章