半自动化安装MySQL数据库脚本,适配5.6/5.7/8.0版本的编译安装。
使用方法:
mysql_install.sh <MYSQL_PORT> <MYSQL_VERSION> <MYSQL_DATA_BASE>
例如:
/opt/shell/mysql_install.sh 4406 5.6.51 /data/app/test
#!/bin/bash
set -o pipefail
# 参数
# mysql_install.sh <MYSQL_PORT> <MYSQL_VERSION> <MYSQL_DATA_BASE>
# sh db_install.sh 3308 5.6 /home/data
# <MYSQL_DATA_BASE> :因为测试环境数据目录一般在 /home/data 下,线上在 /data 下。
# 所以将这个路径作为参数传入,区别线上和测试环境
# 判断参数个数
if [ $# -ne 3 ]; then
echo "Usage: bash $0 <MYSQL_PORT> <MYSQL_VERSION> <MYSQL_DATA_BASE>."
exit 1
fi
# 自行设置安装包位置
SOFTWARE="/opt/software"
if [ ! -d ${SOFTWARE} ];then
echo "====================Create the directory ${SOFTWARE}===================="
mkdir ${SOFTWARE}
echo "====================Finish creating the directory ${SOFTWARE}===================="
fi
# 获取赋值
MYSQL_PORT=$1
MYSQL_VERSION=$2
MYSQL_DATA_BASE=$3
# 安装依赖包
yum install -y ncurses-devel cmake libaio-devel openssl-devel
yum install -y cmake gcc gcc-c++ openssl* bison zlib autoconf libarchive
yum install doxygen
yum install -y libtirpc libtirpc-devel
# ============================ install =================================
# MYSQL_PORT $2: MYSQL_VERSION $3: MYSQL_DATA_BASE
TAR_DIR=${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gz
if [ ! -e ${TAR_DIR} ]
then
echo "error: ${TAR_DIR} is not exist!"
exit 1
fi
if [ ! -d ${SOFTWARE}/mysql-${MYSQL_VERSION} ]
then
tar -zxvf ${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gz
echo "The file ${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gz extraction is complete."
else
echo "The directory is already ${SOFTWARE}/mysql-${MYSQL_VERSION} exist."
fi
cd ${SOFTWARE}/mysql-${MYSQL_VERSION}
BASEDIR=/data/app/mysql_${MYSQL_VERSION}
MYSQL_DATA_DIR=${MYSQL_DATA_BASE}/mysql_${MYSQL_PORT}
if [ ! -e ${SOFTWARE}/mysql-${MYSQL_VERSION}/CMakeCache.txt ]; then
echo "====================Cmake Start===================="
cmake . -DCMAKE_INSTALL_PREFIX=$BASEDIR -DSYSCONFDIR=$BASEDIR/etc -DSYSTEMD_PID_DIR=$BASEDIR -DDEFAULT_charset=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_SSL=system -DWITH_READLINE=on -DMYSQL_DATADIR=${MYSQL_DATA_DIR} -DWITH_BOOST=./boost -DFORCE_INSOURCE_BUILD=1 -DDOWNLOAD_BOOST=1
echo "====================Cmake End===================="
fi
echo "====================Make Install Start===================="
make -j `grep processor /proc/cpuinfo | wc -l` && make install
echo "====================Make Install End===================="
# 创建相关文件夹
echo -e "Create directories $BASEDIR/tmp, $BASEDIR/etc, ${MYSQL_DATA_DIR}_logs, ${MYSQL_DATA_DIR}\n"
mkdir -p $BASEDIR/tmp
mkdir -p $BASEDIR/etc
mkdir -p ${MYSQL_DATA_DIR}_logs
mkdir -p ${MYSQL_DATA_DIR}
echo -e "Finish creating directories $BASEDIR/tmp, $BASEDIR/etc, ${MYSQL_DATA_DIR}_logs, ${MYSQL_DATA_DIR}\n"
# 配置 my.cnf
#[mysqld]
#port=${MYSQL_PORT}
#basedir=${BASEDIR}
#datadir=${MYSQL_DATA_DIR}
#tmpdir=$BASEDIR/tmp
#socket=${MYSQL_DATA_DIR}/mysql.sock
#pid-file=${MYSQL_DATA_DIR}/mysql.pid
#log-error=${MYSQL_DATA_DIR}_logs/error.log
#lower_case_table_names=1
#lc_messages_dir=${BASEDIR}/share
#lc_messages=en_US
#innodb_buffer_pool_size=24G
#server-id=1
#
#[mysql]
#no-auto-rehash
echo -e "$BASEDIR/etc/my.cnf"
cp /etc/my.cnf $BASEDIR/etc/my.cnf
echo -e "====================Start editing my.cnf====================\n"
sed -i "s:port=.*:port=${MYSQL_PORT}:g" $BASEDIR/etc/my.cnf
sed -i "s:basedir=.*:basedir=${BASEDIR}:g" $BASEDIR/etc/my.cnf
sed -i "s:datadir=.*:datadir=${MYSQL_DATA_DIR}:g" $BASEDIR/etc/my.cnf
sed -i "s:tmpdir=.*:tmpdir=$BASEDIR/tmp:g" $BASEDIR/etc/my.cnf
sed -i "s:socket=.*:socket=${MYSQL_DATA_DIR}/mysql.sock:g" $BASEDIR/etc/my.cnf
sed -i "s:pid-file=.*:pid-file=${MYSQL_DATA_DIR}/mysql.pid:g" $BASEDIR/etc/my.cnf
sed -i "s:log-error=.*:log-error=${MYSQL_DATA_DIR}_logs/error.log:g" $BASEDIR/etc/my.cnf
sed -i "s:lc_messages_dir=.*:lc_messages_dir=${BASEDIR}/share:g" $BASEDIR/etc/my.cnf
echo "====================End of edit my.cnf===================="
# 创建mysql用户/组
USER=mysql
UGROUP=mysql
# 查找用户组 并不显示输出
egrep "^${UGROUP}" /etc/group >& /dev/null
if [ $? -eq 0 ]; then
useradd -g $UGROUP $USER
echo "Create ${UGROUP}"
fi
chown -R $USER:$UGROUP ${BASEDIR}
chmod -R 755 ${BASEDIR}
chown -R $USER:$UGROUP ${MYSQL_DATA_DIR}
chmod -R 755 ${MYSQL_DATA_DIR}
chown -R $USER:$UGROUP ${MYSQL_DATA_DIR}_logs
echo "====================MYSQL ${MYSQL_VERSION}:${MYSQL_PORT} is successfully installed to install in ${BASEDIR}===================="
# ============================ install =================================
# ============================ initialize ==============================
if [ "$(echo ${MYSQL_VERSION} | cut -d "." -f -2)" != "5.6" ]; then
$BASEDIR/bin/mysqld --defaults-file=$BASEDIR/etc/my.cnf --user=mysql --basedir=$BASEDIR --datadir=${MYSQL_DATA_DIR} --initialize --console
password=$(awk '/password/ {print $NF}' ${MYSQL_DATA_DIR}_logs/error.log)
if [ $? -eq 0 ]; then
echo "================= A temporary password is generated for root@localhost: $password ==============="
fi
elif [ "$(echo ${MYSQL_VERSION} | cut -d "." -f -2)" == "5.6" ]; then
$BASEDIR/scripts/mysql_install_db --defaults-file=$BASEDIR/etc/my.cnf --user=mysql --basedir=$BASEDIR --datadir=${MYSQL_DATA_DIR}
fi
echo "================= MYSQL $MYSQL_VERSION is installed successfully ==============="
echo -e "Please start the MYSQL service first: \n"
echo -e "$BASEDIR/bin/mysqld_safe --defaults-file=$BASEDIR/etc/my.cnf --user=mysql &\n"
echo -e "Then you can run MYSQL ${MYSQL_VERSION}: \n"
if [ "$(echo ${MYSQL_VERSION} | cut -d "." -f -2)" != "5.6" ]; then
echo -e "$BASEDIR/bin/mysql -uroot -P ${MYSQL_PORT} -h 127.0.0.1 -p$password\n"
elif [ "$(echo ${MYSQL_VERSION} | cut -d "." -f -2)" == "5.6" ]; then
echo -e "$BASEDIR/bin/mysql -uroot -P ${MYSQL_PORT} -h 127.0.0.1\n"
fi
exit 0
注意:不要忘记给脚本设执行权限哦!