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       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章