多实例

由于生产中随着数据库的版本更新或者其他要求,有可能需要在一台主机上装不同版本(或者相同版本)的多个数据库,(这里的数据库指的就是以数据库端口号分离开的一整个数据库,而并非指的是一个数据库里面的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
#}

#:类似参考原装脚本关闭服务,不需要密码等
# 注意了这里面的三个exit命令都不能要,不然下面的restart参数中的start函数就无法执行了,直接从stop函数中退出脚本了(更标准的做法是用return一个值,用这个值判断下一步的行动)
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服务的时候就是启动的这个脚本)
  • 附加备份恢复1之最终测试1:,如果直接rm -rf /data/mysql/*,删除掉数据库的所有文件,在老版本的mysql数据库上就算不用mysql_install_db命令安装数据库文件,只需要重启mysql服务(systemctl restart mysql)即可,它会自动安装被删除掉的数据库文件,socket文件也是。可见,mysql数据库的启动脚本safe(也可能是mysqld二进制程序)还是写的很完善的,能判断数据库的状态。
  • 附加备份恢复1之最终测试2:不过在新版本的数据库上,比如10以后的版本,因为它们不会自动生成mysql这些数据库的文件夹,因此必须得先手动mysql_install_db命令安装数据库文件才可以再次启动数据库。
  • 附加备份恢复2:同时这里需要注意,如果启用了二进制的log文件功能,上面的操作会直接生成3个新的二进制log文件,第三个用于接下来的数据库的操作的二进制备份,而前两个个人猜想就是这个恢复复数据库的过程进行的二进制操作的得到的log文件,它自动恢复数据库之后然后自动重启,导致多生成了这两个二进制log文件。如果进行数据库的备份恢复的时候,要注意这一点,这3个二进制log不需要恢复到数据库中。(其实就是要注意备份恢复时别恢复多余的二进制log文件即可,虽然多恢复了也应该问题不大,但是绝不能少恢复;恢复之前应记录下应该要恢复的二进制文件有哪些,之后的重装数据库等操作导致的再生成的二进制log就不用导入恢复了)
  • 通过mysql_install_db --help的帮助信息的选项也可以看出一些端倪,说明配置文件有好多个,选项也被分散到了这些不同的文件中。
  • 下面就是部分的测试结果:

在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二进制文件中。经过查看safe脚本发现这些参数应该就是写在了这里面,同时每个参数都根据配置文件的存在与否,以及配置文件中是否写入这些参数等判断逻辑的结果来定义,如果都没有的话safe中最后会给定一个默认的值
  • 经过测试和查看得知,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