30.2. MySQL服務器多實例及測試實驗
由於生產中隨著數據庫的版本更新或者其他要求,有可能需要在一臺主機上裝不同版本(或者相同版本)的多個數據庫,(這裏的數據庫指的就是以數據庫端口號分離開的一整個數據庫,而並非指的是一個數據庫裏面的database,註意區分)。
這裏就需要用到多個實例來實現,它的實現邏輯如下:
同一個版本的Mysql數據庫的多個示例:
分析
首先,如果是同一個版本的數據庫,我們只需要一個數據庫服務的應用程序和服務的主體(也就是上一篇中/usr/local/mysql下的各種文件)即可,多個示例其實就是多個數據庫的存儲位置(相當於多個不同的文件夾),以及它們分別各自的配置文件(比如說指定端口號,指定數據庫存儲位置,socket文件等等)
這些maysql服務載入內存後就獨立開了,因為載入內存時會根據配置文件開啟進程,載入之後服務主體中的各種文件都不會再影響這個進程了,這個數據庫的進程只會修改數據庫目錄中的內容。(相當於windows中多開記事本,相互不幹擾,相互獨立修改和保存數據;開一個就開啟一個新的進程和獨立的內存以及數據空間,只不過mysql這裏數據空間就是數據庫的存儲目錄,也就是一個實例)
相同版本多實例實現的測試過程:
實現3各不同實例(3個數據庫,3個監聽端口,3個數據庫服務同時啟動),以二進制已經安裝過的mysql為例,其他的類似。
註意下面多示例之前需安裝好一個mysql服務,前面的安裝過程按照上一章的過程一步一步進行,這裏不贅述。
- 創建3個實例的文件夾目錄:
mkdir /data/mysql/{3306,3307,3308}/{data,etc,socket,bin,log,pid} -pv - 修改這個總的文件夾的屬主屬組(前面的博客說過只需要改數據庫屬性,也就是相當於/data/mysql/data這個目錄,不過現在直接修改整個屬主屬組/data/mysql更加方便於mysql用戶來使用)
chown -R mysql.mysql /data/mysql - 然後生成數據庫的文件(利用生成數據庫腳本)
- 如果是yum安裝,因為都在/usr/bin下面,所以直接執行mysql_install_db --datadir=/data/mysql/3306/data --user=mysql命令即可(另外兩個實例的data目錄同理再執行兩遍即可)
- 如果是二進制和編譯安裝的話,註意要在腳本文件夾scripts的上級目錄進行這個腳本才能找到bin這個目錄,才能生成數據庫到data下
- 參考/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
- 針對不同的端口號,創建服務腳本文件:
- 可以復制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
- 此時可用客戶端命令mysql連接即可。註意了,客戶端命令mysql的配置文件和服務器端mysqld的配置文件雖然可以寫在一起,但是用起來的時候還是不同的。可用mysql --help查看客戶端命令mysql配置文件的順序關系和位置(前面幾行寫的有)
- 可以用mysql [email protected] -pPWD -S/data/mysql/3307/socket/mysql.sock 連接
- 也可以用 mysql [email protected] -pPWD --defaults-extra-file=/data/mysql/3308/etc/my.cnf (前提是這個文件裏寫上了客戶端連接用的端口號和socket文件位置,參見4中所寫的[mysql]欄中)
- 目前默認設置的實例還有安全問題,但是當前已經不能用安全加固腳本了,所以:
- 其中如果需要修改密碼則用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[[email protected] /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[[email protected] /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[[email protected] /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[[email protected] /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[[email protected] /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服務的是有區別的:
- 下面是二進制的,可以看到主服務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" "[email protected]" &
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
;;
- 下面是yum安裝的,直接就是由mysqld啟動的,也沒有加什麽參數(這些參數應該寫在了/usr/lib/systemd/system/mariadb.service文件中)
23:51[[email protected] /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[[email protected] ~]# cd -
/etc/init.d
00:48[[email protected] /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[[email protected] /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[[email protected] /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[[email protected] /data/mysql]# mysqladmin variable |grep error
| log_error | /data/mysql/centos7.6test.err
23:11[[email protected] /data/mysql]# vim /etc/my.cnf :修改log文件位置,取消註釋
23:12[[email protected] /data/mysql]# service mysqld restart
Restarting mysqld (via systemctl): [ OK ]
23:12[[email protected] /data/mysql]# mysqladmin variable |grep error
| log_error | /data/mariadb.log
30.2. MySQL服務器多實例及測試實驗