写在前面:
本人shell小白,本脚本基于他人写的脚本进行的二次编写,主要用于今后部署mysql时方便查询。由于某些原因不好找到源码出处,就无法列出源码链接了,特此声明,还望原作者谅解。
本脚本仍有许多地方有待优化,但用于一个简单的自动化部署绰绰有余。
自动化安装脚本
#!/bin/bash
# Mysql安装包所在路径,需要带上包名,示例:PACKAGE_FULL_WAY=/root/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
readonly PACKAGE_FULL_WAY=/root/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
# Mysql安装主目录,示例:INSTALL_HOME=/usr/local/mysql
readonly INSTALL_HOME=/usr/local/mysql
# Mysql数据库root用户密码,示例:USER_PASSWD=root
readonly USER_PASSWD=root
#校验用户
if [[ "$UID" -ne 0 ]]; then
echo "ERROR: the script must run as root"
exit 3
fi
function log_info() {
echo "[$(date -d today +"%Y-%m-%d %H:%M:%S %:::z")] $1"
}
function log_error() {
echo -e "[$(date +"%Y-%m-%d %H:%M:%S %Z%:z")] [ERROR] $* \n"
exit 1
}
function check_result() {
local ret_code=$1
shift
local error_msg=$*
if [[ ${ret_code} -ne 0 ]]; then
log_error ${error_msg}
fi
}
# 校验参数
function check_param() {
if [[ ! -n ${PACKAGE_FULL_WAY} ]] || [[ ! -n ${INSTALL_HOME} ]] || [[ ! -n ${USER_PASSWD} ]]; then
log_error "参数:PACKAGE_FULL_WAY INSTALL_HOME USER_PASSWD 不能为null"
fi
if [[ ! -f ${PACKAGE_FULL_WAY} ]]; then
log_error "请校验mysql安装包的路径"
fi
}
# 查看mysql进程信息
function check_mysql_process() {
local mysql_process_count=`ps -ef |grep ${INSTALL_HOME}|grep -vwE "grep|vi|vim|tail|cat"|wc -l`
if [[ ${mysql_process_count} -gt 0 ]]; then
log_error "请先停止或者卸载mysql"
fi
}
# 清除影响安装mysql的不良因素
function clear_mysql_environment() {
#删除linux中原本的数据库
local rpmfile=$(rpm -qa | grep mariadb)
if [[ -n ${rpmfile} ]]; then
rpm -e --nodeps $rpmfile
fi
#删除旧的mysql
local rpmmysql=$(rpm -qa | grep mysql)
if [[ -n ${rpmmysql} ]]; then
rpm -e --nodeps $rpmmysql
fi
#删除含有mysql的文件
local file=$(find / -name mysql)
if [[ -n ${file} ]]; then
rm -rf $file
fi
#删除原本的mysql配置文件
local configfile=$(find /etc -name my.cnf)
if [[ -n ${configfile} ]]; then
rm -rf $configfile
fi
}
# 初始化my.cnf,按需配置
function init_my_conf() {
local host_ip=$(/sbin/ip route get 1| sed 's/^.*src \(\S*\).*$/\1/;q')
local total_mem=`free -m |grep "Mem"|awk '{print $2}'`
mkdir -p ${INSTALL_HOME}/log
mkdir -p ${INSTALL_HOME}/mysqld
touch ${INSTALL_HOME}/mysqld/mysqld.pid
chown mysql.mysql ${INSTALL_HOME}/mysqld/mysqld.pid
touch ${INSTALL_HOME}/log/mysql-error.log
touch ${INSTALL_HOME}/log/mysql-slow.log
touch ${INSTALL_HOME}/log/mysqld.log
chown mysql.mysql -R ${INSTALL_HOME}/log
echo "[client]
port = 3306
default-character-set=UTF8
[mysql]
default-character-set=UTF8
[mysqld]
port = 3306
character-set-server = utf8
basedir = ${INSTALL_HOME}
datadir = ${INSTALL_HOME}/data/mysql
pid-file = ${INSTALL_HOME}/mysql.pid
user = mysql
lower_case_table_names = 1
[mysqld_safe]
log-error=${INSTALL_HOME}/log/mysqld.log" >/etc/my.cnf
chown mysql.mysql /etc/my.cnf
}
# 新建mysql用户
function add_user() {
#如果mysql组不存在则创建mysql组
grep "^mysql" /etc/group &> /dev/null
if [[ $? -ne 0 ]]; then
groupadd mysql
fi
#如果mysql用户不存在则创建mysql用户
id mysql &> /dev/null
if [[ $? -ne 0 ]]; then
useradd -g mysql mysql
chage -M 99999 mysql
fi
}
#安装Mysql
function install_mysql() {
# 创建安装主目录
mkdir -p ${INSTALL_HOME}
# 解压mysql到安装主目录
tar -zxvf ${PACKAGE_FULL_WAY} -C ${INSTALL_HOME} > /dev/null 2>&1
if [[ $? -eq 0 ]]; then
local package_name=`ls ${INSTALL_HOME} |grep mysql`
mv ${INSTALL_HOME}/${package_name}/* ${INSTALL_HOME}
cd ${INSTALL_HOME}
# 新建数据库目录
mkdir -p ${INSTALL_HOME}/data/mysql
chown -R mysql:mysql ${INSTALL_HOME}
# 安装并指定用户和data文件夹位置
# 初始化my.cnf,按需配置
init_my_conf
./bin/mysqld --initialize-insecure --user=mysql --basedir=${INSTALL_HOME} --datadir=${INSTALL_HOME}/data/mysql
# 复制mysql到服务自动启动里面
cp -pf ${INSTALL_HOME}/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
# 修改basedir和datadir
sed -i "s#^basedir=.*#basedir=${INSTALL_HOME}#" /etc/init.d/mysqld
sed -i "s#^datadir=.*#datadir=${INSTALL_HOME}\/data\/mysql#" /etc/init.d/mysqld
# 加入环境变量,方便使用mysql命令,但是需要source /etc/profile
echo "###MYSQL_PATH_ENV_S" >>/etc/profile
echo "export PATH=${INSTALL_HOME}/bin:\$PATH" >> /etc/profile
echo "###MYSQL_PATH_ENV_E" >> /etc/profile
# 启动Mysql
start
# 修改Mysql用户root密码
./bin/mysqladmin -u root password ${USER_PASSWD}
cd ${INSTALL_HOME}
# 开启远程登录权限
./bin/mysql -hlocalhost -uroot -p${USER_PASSWD} << EOF
grant all privileges on *.* to root@'%' identified by 'root'; flush privileges;
EOF
chown -R mysql:mysql ${INSTALL_HOME}
else
echo "解压mysql失败"
fi
}
# 启动Mysql
function start() {
su - mysql -c "service mysqld start"
}
# 安装Mysql
function install() {
log_info "+++++++++++ step 1 ++++++++++++++++"
check_param
log_info "check_param finish"
log_info "+++++++++++ step 2 ++++++++++++++++"
clear_mysql_environment
log_info "clear_mysql_environment finish"
log_info "+++++++++++ step 3 ++++++++++++++++"
check_mysql_process
log_info "check_mysql_process finish"
log_info "+++++++++++ step 4 ++++++++++++++++"
add_user
log_info "add_user finish"
log_info "+++++++++++ step 5 ++++++++++++++++"
install_mysql
log_info "install_mysql finish"
source /etc/profile
}
# 停止Mysql
function stop() {
su - mysql -c "service mysqld stop"
}
# Mysql状态检查
function check_status() {
su - mysql -c "service mysqld status"
}
function usage() {
echo "Usage: $PROG_NAME {start|stop|install|uninstall|check_status}"
exit 2
}
PROG_NAME=$0
ACTION=$1
case "$ACTION" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
install)
install
;;
uninstall)
uninstall
;;
check_status)
check_status
;;
*)
usage
;;
esac
使用
# 设置脚本权限
chmod +x 脚本名称
# 使用脚本安装mysql
. 脚本名称 install
# 使用脚本启动mysql服务
. 脚本名称 start
# 使用脚本停止mysql服务
. 脚本名称 stop