這裡分享一個我寫的MySQL自動安裝腳本mysql_auto_install.sh,它的功能非常簡單,就是自動化安裝MySQL單實例,讓DBA的工作更簡單、輕鬆一些,不用去手工安裝MySQL實例。從簡單重覆的工作中釋放出來。 下麵是關於mysql_auto_install.sh腳本的一些說明: 1: ...
這裡分享一個我寫的MySQL自動安裝腳本mysql_auto_install.sh,它的功能非常簡單,就是自動化安裝MySQL單實例,讓DBA的工作更簡單、輕鬆一些,不用去手工安裝MySQL實例。從簡單重覆的工作中釋放出來。
下麵是關於mysql_auto_install.sh腳本的一些說明:
1:這個腳本運行在mysql用戶下(註意,root用戶下運行會報錯,需要修改部分地方),主要原因是因為DBA沒有root賬號許可權,只有mysql用戶的許可權。另外,我也寫了一個mysql_auto_install_root.sh腳本,這個腳本是在root用戶下麵運行,功能更多一些。暫時還在測試當中。
2:此腳本運行在mysql用戶下,因為許可權問題,不會禁用透明大頁,卸載RPM包,調整內核參數、配置systemctl服務等操作,這些工作交給系統管理員處理。而且我們也假設這些都已經是設定好了的。
3:此腳本只適用於Linux,不適用HP-UX等操作系統。
4:my.cnf的模板中的參數要跟腳本中的參數一致。否則可能有問題。另外模板中參數設置請自己保證正確性與合理性。
5:腳本經過多次測試驗證,但是並不保證各種場景都沒有bug。發現問題,歡迎反饋,我自己也在不斷完善、改進這個腳本。
6: 安裝前,要準備好MySQL安裝介質、mysql_auto_install.sh、alter_root_passwd.sql,my.cnf的模板(這裡命名為mysql8_template.cnf)
其中alter_root_passwd.sql是修改root密碼的腳本,如下所示,根據實際情況輸入密碼,安裝完成後,刪除此腳本。
ALTER USER 'root'@'localhost' IDENTIFIED BY '********';
flush privileges;
mysql_auto_install.sh腳本的詳情如下(格式可能因為代碼插件展示問題,有所混亂,請自行調整。原始腳本格式不會有下麵亂七八糟的縮進或不對齊問題)
#!/bin/bash
#########################################################################################
# #
# This script is used for auto install mysql 8.0.xx #
# #
#########################################################################################
# #
# ScriptName : mysql_auto_install.sh #
# Author : 瀟湘隱者 #
# CreateDate : 2019-09-06 #
# Blogs : www.cnblogs.com/kerrycode #
# Email : [email protected] #
#***************************************************************************************#
# 參數配置 #
#---------------------------------------------------------------------------------------#
# MYSQL_BASE_DIR /opt/mysql #
# MYSQL_DATA_DIR /data/mysql #
# MYSQL_PORT 3306 #
# LOG_OUT_TYPE log #
#---------------------------------------------------------------------------------------#
# 註意事項: #
# 1:如果維護的MySQL資料庫都規範化安裝、配置的化,下麵很多參數都不需要修改 #
# 2:my.cnf模板很重要,如果配置有問題,可能導致安裝失敗。腳本裡面有些參數設定都是依賴 #
# my.cnf模板中的設置,請確保你的my.cnf模板中設定跟腳本參數一致 #
# 3:此腳本在mysql用戶下安裝,很多操作受限,例如禁用透明大頁、卸載rpm包,調整內核參數 #
# 如需處理這些 建議使用另外一個版本的腳本處理。此處設定系統管理員已經處理好這些事情#
# **註意**:此腳本只能在mysql用戶下運行,root用戶下需要修改部分地方纔能成功 #
#---------------------------------------------------------------------------------------#
#***************************************************************************************#
# Version Modified Date Description #
#***************************************************************************************#
# V.1.0 2019-09-06 創建此腳本 #
# V.1.1 2019-10-26 按SHELL編程規範,重新命名規範各類對象 #
# V.2.0 2023-06-16 重新改寫該腳本,增加驗證/優化步驟 #
#########################################################################################
# MySQL的安裝路徑:basedir的上層目錄
MYSQL_BASE_DIR=/opt/mysql
# MySQL數據目錄:datadir的上層目錄
MYSQL_DATA_DIR=/data/mysql
# MySQL安裝日誌信息
MYSQL_INSTALL_LOG=/tmp/soft/mysql_install.log
# MySQL壓縮包路徑
MYSQL_INSTALLER_DIR=/tmp/soft
# MySQL安裝介質
# 註意事項,如果安裝介質不是tar.xz ,請修改代碼中tar.xz
MYSQL_INSTALLER=$MYSQL_INSTALLER_DIR/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
# MySQL的my.cnf模板
MYSQL_CONFIG_FILE=$MYSQL_INSTALLER_DIR/mysql8_template.cnf
# alter_root_passwd文件
SQL_ALTER_USER_PWD=$MYSQL_INSTALLER_DIR/alter_root_passwd.sql
# Log輸出方式:log 或out或all
LOG_OUT_TYPE=all
# MySQL的埠號
MYSQL_PORT=3306
# 記錄安裝過程的日誌信息
function log_info()
{
#判斷參數個數
if [ $# -eq 1 ];then
local log_msg=$1
else
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
fi
:<<EOF
if [ $LOG_OUT_TYPE = "print" ];then
echo "[info ]: `date`> $log_msg"
else
echo "[info ]: `date`> $log_msg" >> $MYSQL_INSTALL_LOG
fi
EOF
case $LOG_OUT_TYPE in
out)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
;;
log)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
;;
all)
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
;;
*)
esac
}
# 記錄安裝過程的錯誤信息
function log_error()
{
#判斷參數個數
if [ $# -eq 1 ];then
local log_msg=$1
else
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
fi
:<<EOF
if [ $LOG_OUT_TYPE = "print" ];then
echo "[error]:`date`> $log_msg"
else
echo "[error]:`date`> $log_msg" >> $MYSQL_INSTALL_LOG
fi
EOF
case $LOG_OUT_TYPE in
out)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
;;
log)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
;;
all)
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
echo "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
;;
*)
esac
}
# 卸載系統自帶的MARIADB
#rpm -qa|grep mariadb |xargs yum remove -y > /dev/null
function check_env_setting()
{
# 檢查操作系統是否Linux(此腳本不適用HP-UX/SunOS/AIX)
if [ `uname -s`="Linux" ];then
log_info "The os is linux,mysql auto install continue..."
else
log_error "the os is not linux, please check it."
exit 1
fi
# 檢查存放安裝包目錄是否存在
if [ ! -d "$MYSQL_INSTALLER_DIR" ];then
log_error "the mysql installer directory $MYSQL_INSTALLER_DIR didn't exists, please check it"
exit 1
else
log_info "the mysql installer directory $MYSQL_INSTALLER_DIR exist, mysql auto install continue...";
fi
# 檢查MySQL安裝文件是否存在
if [ ! -f "$MYSQL_INSTALLER" ];then
log_error "the mysql installer file $MYSQL_INSTALLER didn't exist, please check it"
exit 1
else
log_info "the mysql installer file $MYSQL_INSTALLER exist, mysql auto install continue..."
fi
# 檢查MySQL的my.cnf的模板文件是否存在
if [ ! -f $MYSQL_CONFIG_FILE ];then
log_error "the mysql configuration template file $MYSQL_CONFIG_FILE did'nt exist, please check it"
exit 1
else
log_info "the mysql configuration template file $MYSQL_CONFIG_FILE exists,mysql auto install continue..."
fi
# 檢查修改mysql資料庫用戶root密碼的SQL文件是否存在。
if [ ! -f $SQL_ALTER_USER_PWD ];then
log_error "the sql file $SQL_ALTER_USER_PWD did'nt exist, please check it"
exit 1
else
log_info "the sql file $SQL_ALTER_USER_PWD exists,mysql auto install continue..."
fi
# 檢查MySQL安裝目錄的上層目錄是否存在
if [ ! -d "$MYSQL_BASE_DIR" ];then
log_error "the $MYSQL_BASE_DIR didn't exists, please check it"
exit 1
else
log_info "the $MYSQL_BASE_DIR exists, mysql auto install continue..."
fi
# 檢查MYSQL_DATA_DIR對應的目錄是否存在,此目錄為datadir的上一層目錄
if [ ! -d "$MYSQL_DATA_DIR" ];then
log_error "the $MYSQL_DATA_DIR didn't exists, please check it"
exit 1
else
log_info "the $MYSQL_DATA_DIR exists, mysql auto install continue..."
fi
# 檢查MYSQL_DATA_DIR目錄下是否存在其目錄,如果有其它目錄,則退出安裝(擔心已經安裝了MySQL實例)
if [ -d ${MYSQL_DATA_DIR} -a "`ls -A ${MYSQL_DATA_DIR}`" != "" ];then
log_error "the $MYSQL_DATA_DIR directory have exists files,plese check it"
exit 1
else
log_info "the $MYSQL_DATA_DIR check is ok ,mysql auto install continue..."
fi
# 驗證MySQL安裝介質的MD5
# 檢查是否存在MySQL實例
mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`
echo $mysql_status
if [ "$mysql_status" = "Yes" ];then
log_error "MySQL instance exists. please check it"
exit 1
else
#只能作為一個依據,並不能完全保證。
log_info "MySQL instance didn't exists,mysql auto install continue..."
fi
echo "check_env_setting run successful."
#read ANS
read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
log_info "mysql auto install continue...";;
N | n)
log_info "mysql auto install exit.";;
*)
log_error "your choice is wrong!";;
esac
}
# 創建MySQL用戶和用戶組(此處註釋,用戶由系統管理員創建)
#echo '[info]: create the mysql user...'
#groupadd mysql
#/usr/sbin/groupadd mysql
#useradd -g mysql mysql
#/usr/sbin/useradd -g mysql mysql
# 創建MySQL的相關目錄
function create_mysql_dir()
{
cd $MYSQL_DATA_DIR
mkdir conf data logs slow_logs bin_logs mysql_temp
chmod 750 $MYSQL_DATA_DIR
#對目錄進行授權
chmod -R 760 $MYSQL_DATA_DIR/bin_logs
chmod -R 700 $MYSQL_DATA_DIR/logs
chmod -R 760 $MYSQL_DATA_DIR/slow_logs
}
function mysql_cnf_setting()
{
# 拷貝my.cnf的模板配置文件,這裡不打算直接寫入生成my.cnf文件
cp $MYSQL_CONFIG_FILE $MYSQL_DATA_DIR/conf/my.cnf
if [ $? -ne 0 ];then
log_error 'failed to cp the my.cnf,please check it'
exit 1
else
log_info "cp the $MYSQL_CONFIG_FILE to my.cnf success!"
fi
}
function mysql_env_setting()
{
# 設置環境變數
local env_exist=`cat ~/.bash_profile |grep -E "MYSQL_HISTFILE|$MYSQL_BASE_DIR/mysql8.0/bin" | wc -l`
if [ $env_exist -eq 0 ];then
echo "export PATH=\$PATH:$MYSQL_BASE_DIR/mysql8.0/bin" >> ~/.bash_profile
echo "export MYSQL_HISTFILE=/dev/null" >> ~/.bash_profile
source ~/.bash_profile
else
log_info "the environment variable exists, please check it!"
fi
}
# 解壓MySQL的二進位安裝包
function mysql_install()
{
echo '[info]:unzip the mysql installation media....'
tar -xvf $MYSQL_INSTALLER -C $MYSQL_BASE_DIR
if [ $? -ne 0 ];then
log_error "mysql media unzip failed,please check the detail."
exit
else
log_info "mysql media unzip success,mysql auto install continue..."
fi