一 簡介
作為mysql dba ,在維護資料庫的過程中,偶爾會遇到伺服器異常crash/重新開機情況,dba需要在機器重新開機之後将mysql資料庫重新開機(當然也有可能其他的資料庫本文重點介紹mysql)。如果是一台機器重新開機或者少數幾個執行個體還好友善維護,當執行個體個數成百上千時,遇到硬體更換,需要批量重新開機伺服器時,一個個人肉重新開機資料庫執行個體未免太過麻煩。我們需要一種随伺服器開機自動重新開機的機制。
二 linux 伺服器啟動 知識點
redhat的啟動方式和執行次序是:
1 加載核心
2 執行init程式
3 /etc/rc.d/rc.sysinit # 由init執行的第一個腳本
4 /etc/rc.d/rc $runlevel # $runlevel為預設的運作模式,linux 共有7種運作模式,後續會介紹。
5 /etc/rc.d/rc.local # 相應級别服務啟動之後、在執行該檔案(其實也可以把需要執行的指令寫到該檔案中)
6 /sbin/mingetty # 等待使用者登入
這裡我們重點介紹/etc/rc.d/下的rcn.d目錄(n是0~6的數字,其他請參考 文檔資料) ,
rc.sysinit根據inittab中的配置順序來執行rcn.d目錄下的腳本,(注意rcn.d中放置的是init.d中腳本的軟連結)其命名格式是:
s{number}{name}
k{number}{name}
s開始的檔案向腳本傳遞start參數
k開始的檔案向腳本傳遞stop參數
以k開頭的腳本運作在以s開頭的腳本之前,number決定相同字母開頭的腳本執行的順序,s18mysqlatuo 執行順序在s19mysqlatuo之前。
假設預設的運作模式是3,系統就會按上述方式調用/etc/rc.d/rc3.d/下的腳本。是以使用者可以在這個檔案中添加一些需要在系統完成初始化工作之後,使用者登入之前執行的指令或者啟動的服務 比如 mysql。
三 實踐
根據上述介紹的規則,在rc3.d下面配置mysql自動啟動的腳本。本文一開始強調處理單機多執行個體的開啟自動重新開機,在編寫腳本時注意針對多個執行個體的處理,考慮到生産環節下 ,資料庫執行個體可能發生遷移/下線等操作,在腳本中将端口寫死 的方式是不推薦的。
mysqlauto 腳本的内容如下:
#!/bin/bash
#擷取 資料目錄下的所有端口 mysql_ports
#author :yangyi
#date : 2016-02-15
mysql_admin=`which mysqladmin`
mysqld_safe=`which mysqld_safe`
mysql_ports=`ls /srv/ | grep -e "my[0-9][0-9]*" | sed 's#my# #g' | tr -d '\n' | sed 's#^ ##g'`
mysql_start()
{
ports_list=$1
for port in $ports_list;
do
socket_file=/srv/my${port}/run/mysql.sock
if [[ ! -f "$socket_file" ]]; then
$mysqld_safe --defaults-file=/srv/my${port}/my.cnf --read_only=1 &
sleep 2;
fi
done
}
mysql_stop()
socket_file=/srv/my${port}/run/mysql.sock
if [[ -e $socket_file ]]; then
$mysql_admin -uroot -s $socket_file shutdown
sleep 2;
fi
case "$1" in
start)
mysql_start $mysql_ports
;;
stop)
mysql_stop $mysql_ports
*) echo "usage: $0 {start|stop|help} "
esac