数据库安装主要有以下安装方式:
- rpm和yum安装方式特点:安装速度快,但很多东西不能修改,如路径,功能不能定制
- 编译安装:安装慢,但可以修改很多东西,如路径,功能定制
- 二进制安装:安装快且可以定制某些东西
本文提供一个安装脚本,以二进制安装方式安装MySQL 8.0.20
#!/bin/bash
#
# 安装MySQL
# 版权2024 JackC
# 定义 MySQL 版本和安装目录
while true; do
read -p "Please Input MySQL Port: " -r MYSQL_PORT
if [ -n "$MYSQL_PORT" ]; then
break
fi
done
while true; do
read -p "Please Input MySQLX Port: " -r MYSQLX_PORT
if [ -n "$MYSQLX_PORT" ]; then
break
fi
done
# 是否设置环境变量
read -p "Are You Want Set MySQL Bin Log to System Environment?(0/1): " -r SET_ENVIRONMENT
if [ -z "$SET_ENVIRONMENT" ]; then
SET_ENVIRONMENT=0
elif [ "$SET_ENVIRONMENT" -eq 1 ]; then
SET_ENVIRONMENT=1
fi
MYSQL_VERSION="8.0.20"
MYSQL_INSTALL_DIR="/usr/local/mysql-${MYSQL_PORT}"
MYSQL_DATA_DIR="/data/mysql-${MYSQL_PORT}"
MYSQL_CONFIG_FILE="${MYSQL_INSTALL_DIR}/my.cnf"
MYSQL_LOG_DIR="/var/log/mysql-${MYSQL_PORT}"
MYSQL_SERVICE_FILE="/etc/systemd/system/mysql-${MYSQL_PORT}.service"
# 新的MySQL下载路径
MYSQL_DOWNLOAD_PATH="https://downloads.mysql.com/archives/get/p/23/file"
closeFirewall() {
# 关闭firewalld防火墙服务,并且设置开机不要启动
systemctl stop iptables
systemctl disable iptables
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭selinux
setenforce 0
# 永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
}
echoMySQLInfo() {
echo -e "\n\n"
echo "====================================================================================="
echo "MySQL version is ${MYSQL_VERSION}"
echo "MySQL port is ${MYSQL_PORT}"
echo "MySQLx port is ${MYSQLX_PORT}"
echo "MySQL basedir is ${MYSQL_INSTALL_DIR}"
echo "MySQL datadir is ${MYSQL_DATA_DIR}"
echo "MySQL logdir is ${MYSQL_LOG_DIR}"
echo "MySQL config file is ${MYSQL_CONFIG_FILE}"
echo "MySQL systemd service is ${MYSQL_SERVICE_FILE}"
echo "====================================================================================="
echo -e "\n\n"
}
buildEnvironment() {
# 检查用户和用户组是否存在,如果不存在则创建
if id "mysql" >/dev/null 2>&1; then
echo "User exists"
else
echo "User does not exist, creating now."
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
fi
# 检查目录是否存在,如果不存在则创建
local dir
for dir in ${MYSQL_INSTALL_DIR} ${MYSQL_DATA_DIR} ${MYSQL_LOG_DIR}; do
if [ -d "$dir" ]; then
echo "$dir exists. remove it first!"
exit 1 # 这里直接报错,不然会影响到其他软件
# rm -rf "$dir"
else
echo "$dir does not exist, creating now."
mkdir -p "$dir"
chown -R mysql.mysql "$dir"
fi
done
}
downloadMySQLFile() {
# 下载 MySQL 二进制包
if [ -f mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz ]; then
echo "mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz file exists"
else
wget ${MYSQL_DOWNLOAD_PATH}/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz
fi
# 解压缩二进制包
echo "tar Jxf mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz -C ${MYSQL_INSTALL_DIR} --strip-components=1"
if ! tar Jxf mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz -C "${MYSQL_INSTALL_DIR}" --strip-components=1; then
echo "The tar command failed."
exit
fi
}
setProfile() {
if [ ! "$SET_ENVIRONMENT" -eq 0 ]; then
export PATH=${MYSQL_INSTALL_DIR}/bin/:$PATH
# 重新启动linux系统后也生效,永久修改
echo "echo 'export PATH=\"'${MYSQL_INSTALL_DIR}'/bin:\$PATH\"' >> /etc/profile"
echo "export PATH=${MYSQL_INSTALL_DIR}/bin:\$PATH" >>/etc/profile
fi
}
createMySQLConf() {
# 创建 my.cnf 文件
cat <<EOF >"${MYSQL_CONFIG_FILE}"
[mysqld]
log-bin=${MYSQL_LOG_DIR}/mysql_bin.log
bind-address=0.0.0.0
port=${MYSQL_PORT}
mysqlx_port=${MYSQLX_PORT}
log_error=${MYSQL_LOG_DIR}/error.log
character-set-server=utf8mb4
max_connections=1000
server-id=${MYSQL_PORT}
basedir=${MYSQL_INSTALL_DIR}
datadir=${MYSQL_DATA_DIR}
pid-file=${MYSQL_INSTALL_DIR}/mysql.pid
socket=${MYSQL_INSTALL_DIR}/mysql.sock
slow_query_log=1
slow_query_log_file=/${MYSQL_LOG_DIR}/mysql_slow.log
[client]
port=${MYSQL_PORT}
socket=${MYSQL_INSTALL_DIR}/mysql.sock
EOF
}
initMySQL() {
# 初始化数据目录
echo -e "\n\n${MYSQL_INSTALL_DIR}/bin/mysqld --defaults-file=${MYSQL_CONFIG_FILE} --initialize-insecure --user=mysql --basedir=${MYSQL_INSTALL_DIR} --datadir=${MYSQL_DATA_DIR}\n\n"
"${MYSQL_INSTALL_DIR}/bin/mysqld" --defaults-file="${MYSQL_CONFIG_FILE}" --initialize-insecure --basedir="${MYSQL_INSTALL_DIR}" --datadir="${MYSQL_DATA_DIR}" --user=mysql
}
createMySQLService() {
# 创建 MySQL 服务单位文件
cat <<EOF >"${MYSQL_SERVICE_FILE}"
[Unit]
Description=MySQL Server
After=network.target
[Service]
ExecStart=${MYSQL_INSTALL_DIR}/bin/mysqld --defaults-file=${MYSQL_CONFIG_FILE} --user=mysql --basedir=${MYSQL_INSTALL_DIR} --datadir=${MYSQL_DATA_DIR} --socket=${MYSQL_INSTALL_DIR}/mysql.sock
ExecStop=${MYSQL_INSTALL_DIR}/bin/mysqladmin -S ${MYSQL_INSTALL_DIR}/mysql.sock shutdown
Restart=always
[Install]
WantedBy=multi-user.target
EOF
}
startMySQL() {
# 重新加载 systemd 配置
systemctl daemon-reload
# 启动 MySQL 服务
systemctl start "mysql-${MYSQL_PORT}"
# 检查 MySQL 服务状态
systemctl status "mysql-${MYSQL_PORT}"
}
createUser() {
# 创建用户
echo "${MYSQL_INSTALL_DIR}/bin/mysql -uroot -h127.0.0.1 -P${MYSQL_PORT} -e \"CREATE USER root@'%' IDENTIFIED BY '123456';GRANT ALL PRIVILEGES ON *.* TO root@'%';FLUSH PRIVILEGES;\""
"${MYSQL_INSTALL_DIR}/bin/mysql" -uroot -h127.0.0.1 -P"${MYSQL_PORT}" -e "CREATE USER root@'%' IDENTIFIED BY '123456';GRANT ALL PRIVILEGES ON *.* TO root@'%';FLUSH PRIVILEGES;"
echo -e "\n\n"
echo "====================================================================================="
echo "create user root@'%' with password 123456"
echo "IF you want delete install, you can execute follow command"
echo -e "\n"
echo "systemctl stop mysql-${MYSQL_PORT}"
echo "rm -rf ${MYSQL_INSTALL_DIR} ${MYSQL_DATA_DIR} ${MYSQL_LOG_DIR} ${MYSQL_SERVICE_FILE} "
echo -e "\n"
echo "Or you can run follow script file: ${MYSQL_INSTALL_DIR}/uninstall.sh"
cat <<EOF >"${MYSQL_INSTALL_DIR}/uninstall.sh"
#!/bin/bash
systemctl stop mysql-${MYSQL_PORT}
rm -rf ${MYSQL_INSTALL_DIR} ${MYSQL_DATA_DIR} ${MYSQL_LOG_DIR} ${MYSQL_SERVICE_FILE}
EOF
chmod +x "${MYSQL_INSTALL_DIR}/uninstall.sh"
echo "====================================================================================="
echo -e "\n\n"
}
function main() {
closeFirewall
echoMySQLInfo
buildEnvironment
downloadMySQLFile
setProfile
createMySQLConf
initMySQL
createMySQLService
startMySQL
createUser
}
main "$@"