#!/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 ]; thenecho "Usage: bash $0 <MYSQL_PORT> <MYSQL_VERSION> <MYSQL_DATA_BASE>."exit 1
fi# 自行设置安装包位置
SOFTWARE="/opt/software"
if [ ! -d ${SOFTWARE} ];thenecho "====================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_BASETAR_DIR=${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gz
if [ ! -e ${TAR_DIR} ]
thenecho "error: ${TAR_DIR} is not exist!"exit 1
fiif [ ! -d ${SOFTWARE}/mysql-${MYSQL_VERSION} ]
thentar -zxvf ${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gzecho "The file ${SOFTWARE}/mysql-${MYSQL_VERSION}.tar.gz extraction is complete."
elseecho "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 ]; thenecho "====================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=1echo "====================Cmake End===================="
fiecho "====================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.cnfecho -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/nullif [ $? -eq 0 ]; thenuseradd -g $UGROUP $USERecho "Create ${UGROUP}"
fichown -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}_logsecho "====================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 --consolepassword=$(awk '/password/ {print $NF}' ${MYSQL_DATA_DIR}_logs/error.log)if [ $? -eq 0 ]; thenecho "================= 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}
fiecho "================= 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" ]; thenecho -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" ]; thenecho -e "$BASEDIR/bin/mysql -uroot -P ${MYSQL_PORT} -h 127.0.0.1\n"
fiexit 0
半自动化安装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
结果
安装成功!