1. 程式人生 > 其它 >MySQL service啟動指令碼淺析(r12筆記第59天)

MySQL service啟動指令碼淺析(r12筆記第59天)

我們在搭建MySQL環境的時候,一般都會按照建議的標準規範來做,比如拷貝mysql.server到自啟動目錄下。

cp -rf $basedir/support-files/mysql.server /etc/init.d/mysql

然後設定MySQL自啟動的服務,配置完成之後就可以執行命令service mysql.server start 來啟動MySQL了。

/sbin/chkconfig --add mysql /sbin/chkconfig --level 2345 mysql on

當然這個是自動擋的操作,我們也可以手動檔完成。我們來看看這個神奇的指令碼在做些什麼。指令碼的內容較長,我就列出一部分內容來。

首先這個檔案的名字沒有直接的影響了,我們可以用mysql mysql.server等等,在這個目錄下注冊都可以正常識別。

# service mysql status SUCCESS! MySQL (Percona Server) running (15924)

在/etc/inid.d這個目錄下,這個mysql命名的指令碼檔案其實也不大,大概10K的內容,不到400行的指令碼量。 # ll mysql -rwxr-xr-x 1 root root 11056 Aug 28 2013 mysql我們取出重點的部分來解析。

首先這個指令碼支援start,stop,restart,reload(或者是force-reload),status這個幾個選項。

start的部分核心部分即為:

# 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=$?

其實這個選項很容易理解了,就是mysqld_safe來啟動,需要制定幾個啟動引數,有些引數雖然為空,但是會從/etc/my.cnf中獲取,也可以支援額外的擴充套件引數。

我們修改下指令碼,把這幾個引數值手工打印出來。

分別是$bindir $datadir $mysqld_pid_file_path $other_args

# service mysql start Starting MySQL (Percona Server) /usr//bin /U01/mysql /U01/mysql/mysql.pid ...... SUCCESS!

datadir會有一系列校驗,但是也會以/etc/my.cnf的優先

# cat /etc/my.cnf|grep datadir datadir = /U01/mysql

另外basedir也是類似,你看my.cnf裡設定的如果不夠規範,也在應用的時候就是/usr//bin了。

# cat /etc/my.cnf|grep basedir basedir = /usr/

接下來mysqld_safe的指令碼下面會有較多的校驗。

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

啟動的過程中,會在/var/lock/subsys下生成一個鎖定檔案,就是一個程序號的標記。 # ll /var/lock/subsys/mysql -rw-r--r-- 1 root root 0 May 9 23:03 /var/lock/subsys/mysql

wait_for_pid這個函式會呼叫created(start模式),removed(stop模式)來處理pid檔案。

而stop模式的實現相對更直接一些,它是使用kill -0的方式來檢測程序是否存在,如果存在則使用kill的命令來殺掉mysqld程序。

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 (Percona Server)" 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 (Percona Server) server process #$mysqld_pid is not running!" rm "$mysqld_pid_file_path" fi

這個過程中,後臺日誌會逐步輸出,然後釋放鎖定檔案。

reload的過程使用的相對和緩,使用了kill -HUP的選項,如果想要更改配置而不需停止並重新啟動服務,可以使用這個選項。

'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 (Percona Server)" touch "$mysqld_pid_file_path" else log_failure_msg "MySQL (Percona Server) PID file could not be found!" exit 1 fi

restart的部分就是間接呼叫stop和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 fistatus的部分更簡單,就是讀取pid檔案中的程序號資訊。

不要小看這個指令碼,裡面涉及不少邏輯校驗,也可以在這個基礎上根據自己的需求來做一些改變。至少在這一點上,這個指令碼是可以根據我們的需求來定製的。