【MySQL】MySQL多例項開機自動重啟

楊奇龍發表於2016-02-15
一 簡介
   作為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的數字,其他請參考 文件資料) ,
  1. root@rac3:/etc/rc.d# >ls
  2. init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
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自動啟動的指令碼。本文一開始強調處理單機多例項的開啟自動重啟,在編寫指令碼時注意針對多個例項的處理,考慮到生產環節下 ,資料庫例項可能發生遷移/下線等操作,在指令碼中將埠寫死 的方式是不推薦的。

  1. chmod +x mysqldauto
  2. mv mysqldauto /etc/rc.d/init.d/
  3. 處理啟動命令
  4. ln -s /etc/rc.d/init.d/mysqldauto /etc/rc.d/rc3.d/S99mysqld
  5. 處理關閉命令
  6. ln -s /etc/rc.d/init.d/mysqldauto /etc/rc.d/rc0.d/K20mysqld
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()
{
ports_list=$1
for port in $ports_list; 
do
SOCKET_FILE=/srv/my${port}/run/mysql.sock
if [[ -e $SOCKET_FILE ]]; then      
$MYSQL_ADMIN  -uroot -S $SOCKET_FILE  shutdown 
sleep 2;
fi
done
}
case "$1" in 
start) 
mysql_start $MYSQL_PORTS
;; 
stop) 
mysql_stop  $MYSQL_PORTS
;; 
*) echo "Usage: $0 {start|stop|help} " 
esac
四 參考文章
1 Linux中設定服務自啟動的三種方式 
2   --蘇普的文章
3    

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-1989261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章