shell脚本部署MySQL单实例和多实例

shell脚本部署mysql单实例和多实例

mysql官网:https://www.mysql.com/

创建跟部署相应的目录
[root@localhost ~]# cd /usr/src/
[root@localhost src]# mkdir mysql
[root@localhost src]# cd mysql/

创建files目录存放软件或文件
[root@localhost mysql]# mkdir files

提前下载好软件包
[root@localhost mysql]# cd files
[root@localhost files]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
[root@localhost files]# ls
mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

编写脚本

#!/bin/bash

# 在执行此脚本前需手动部署一遍
# 需关闭防火墙跟SElinux

function single(){    // 单实例的函数
    if [ ! -d $data_dir ];then
        mkdir -p $data_dir   // 如果目录不存在则创建,否则退出
    fi
    chown -R mysql.mysql $data_dir
    echo -e "\033[1;32m initialize mysql... \033[0m"
    $install_dir/bin/mysqld --initialize-insecure --user=mysql --datadir=$data_dir  // 初始化
    cat > /etc/my.cnf <<EOF  // 生成配置文件
[mysqld]
basedir = $install_dir
datadir = $data_dir
socket = /tmp/mysql.sock
port = 3306
pid-file = $data_dir/mysql.pid
user = mysql
skip-name-resolve
EOF
    if [ ! -f /etc/init.d/mysqld ];then  // 匹配启动服务脚本
    cp $install_dir/support-files/mysql.server /etc/init.d/mysqld
	sed -i "/^basedir=/c basedir=${install_dir}" /etc/init.d/mysqld
	sed -i "/^datadir=/c datadir=$data_dir" /etc/init.d/mysqld
	chmod +x /etc/init.d/mysqld
    fi
    chkconfig --add mysqld  // 设置开机自启
    chkconfig mysqld on
    service mysqld start
    sleep 3
    $install_dir/bin/mysql -uroot -e "set password = password('$passwd');" // 登录并修改密码
    echo -e "\033[1;32m 安装成功 密码设置为:$passwd \033[0m"
}

function multi(){
    if [ ! -d ${data_dir}/$port ];then
        mkdir -p ${data_dir}/$port            
    fi 
    chown -R mysql.mysql ${data_dir}/$port
    $install_dir/bin/mysqld --initialize-insecure --user=mysql --datadir=${data_dir}/$port
    cat >> /etc/my.cnf <<EOF
[mysqld$port]
datadir = ${data_dir}/$port
port = $port
socket = /tmp/mysql${port}.sock
pid-file = ${data_dir}/$port/mysql_${port}.pid
log-error= /var/log/${port}.log
EOF
    if [ ! -h /usr/bin/my_print_defaults ];then  
        ln -s $install_dir/bin/my_print_defaults /usr/bin/
    fi

    cat > /usr/lib/systemd/system/my$port.service <<EOF
[Unit]
Description=$port server daemon
After=network.target sshd-keygen.target

[Service]
Type=forking
ExecStart=$install_dir/bin/mysqld_multi start $port
ExecStop=ps -ef|grep $port|grep -v grep|awk '{print \$2}' | xargs kill -9
ExecReload=/bin/kill -HUP \$MAINPID

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now my$port
    sleep 3
    $install_dir/bin/mysql -uroot -e "set password = password('$passwd');" -S /tmp/mysql${port}.sock
    echo -e "\033[1;32m 安装成功 密码设置为:$passwd \033[0m"
    let port++
}

if [ $UID -ne 0 ];then
    echo "Please execute this script uses root user."
    exit 250
fi

read -p "请输入要创建的实例个数:" number
read -p "请输入数据存放的绝对路径(default: /opt/data):" data_dir
read -p "请输入数据库安装目录的绝对路径(default: /usr/local/mysql):" install_dir
read -p "请输入数据库的密码:" passwd

if [ $number -eq 0 ];then
    exit 250
fi

if [ -z $install_dir ];then
    install_dir=/usr/local/mysql
fi

if [ -z $data_dir ];then
    data_dir=/opt/data
fi

if [ -z $passwd ];then
    passwd=123456
fi
port=3306

echo -e "\033[1;32m 正在下载依赖包... \033[0m"
if [ $number -eq 1 ];then
    dnf -yq install ncurses-compat-libs &> /dev/null
fi
if [ $number -gt 1 ];then
    dnf -yq install perl &> /dev/null
fi

id mysql &> /dev/null
if [ $? -ne 0 ];then
    useradd -r -M -s /sbin/nologin mysql
fi

if [ ! -d /usr/local/mysql ];then
    echo -e "\033[1;32m unzip mysql... \033[0m" 
    tar xf files/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
    mv mysql-5.7.37-linux-glibc2.12-x86_64 $install_dir
    chown -R mysql.mysql $install_dir
else
    exit 250
fi

echo "export PATH=$install_dir/bin:\$PATH" > /etc/profile.d/mysql.sh
echo "$install_dir/lib" > /etc/ld.so.conf.d/mysql.conf
ln -s $install_dir/include /usr/include/mysql &> /dev/null

grep "$install_dir/man" /etc/man_db.conf &> /dev/null
if [ $? -ne 0 ];then
    sed -i "/MANDATORY_MANPATH.*local\/share\/man/a MANDATORY_MANPATH\t\t\t${install_dir}/man" /etc/man_db.conf
fi

cat > /etc/my.cnf <<EOF
[mysqld_multi]
mysqld = $install_dir/bin/mysqld_safe
mysqladmin = $install_dir/bin/mysqladmin
EOF


for i in $(seq $number);do
    if [ $number -eq 1 ];then
	single
    fi
    if [ $number -gt 1 ];then
        multi	
    fi
done

[root@localhost mysql]# chmod +x mysql.sh # 执行权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值