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 # 执行权限