在 CentOS 7 上安装 MySQL 5.7 并使用 systemd 管理服务的自动化脚本

在 CentOS 7 上安装 MySQL 5.7 并使用 systemd 管理服务的自动化脚本

本文将介绍如何在 CentOS 7 系统上通过脚本自动化安装 MySQL 5.7,并使用 systemd 管理 MySQL 服务。

步骤一:准备工作

首先,我们需要准备好以下内容:

  • MySQL 安装包 :MySQL 5.7 的安装包(如 mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz)放在指定目录下。
  • MySQL 配置文件:配置 MySQL 的基础参数,如端口、字符集等。
  • SQL 文件:如果有 SQL 文件需要在安装完成后执行,可以准备好 SQL 文件。

脚本会执行以下操作:

  1. 安装所需的依赖包。
  2. 创建 MySQL 所需的目录。
  3. 解压 MySQL 安装包到指定目录。
  4. 创建 MySQL 用户和用户组。
  5. 配置 MySQL 的 my.cnf 文件。
  6. 初始化 MySQL 数据库。
  7. 创建并启用 systemd 服务文件来管理 MySQL 服务。
  8. 启动 MySQL 服务并进行必要的权限配置。

步骤二:自动化安装 MySQL 的脚本

以下是完整的 MySQL 安装脚本(将 MySQL 注册为 systemd 服务):

bash 复制代码
#!/bin/bash

# MySQL 安装配置参数
LOG_DIR="/home/environment/mysql/logs"              # 日志目录
MYSQL_DATA_DIR="/home/environment/mysql/mysql-data" # MySQL 数据目录
MYSQL_GROUP="mysql"                                  # MySQL 用户组
MYSQL_USER="mysql"                                   # MySQL 用户
MYSQL_ROOT_PASSWORD="rootpassward"            # MySQL root 密码
MYSQL_BASE_DIR="/home/environment/mysql"            # MySQL 安装目录
MYSQL_PACKAGE_DIR="/home/environment/mysql"         # MySQL 压缩包所在目录
MYSQL_PACKAGE_NAME="mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz" # MySQL 压缩包文件名
MYSQL_CONFIG="/home/environment/mysql/my.cnf"       # MySQL 配置文件路径
MYSQL_SERVICE="mysql"                                # MySQL 服务名
MYSQL_PORT="4461"                                    # MySQL 端口
SQL_FILE="/home/bash/download/deploy.sql"           # SQL 文件路径

# 安装依赖包
install_dependencies() {
    echo '===================================='
    echo '正在安装依赖包...'
    yum install -y libaio libaio-devel numactl-libs
    if [ $? -eq 0 ]; then
        echo '依赖包安装成功!'
    else
        echo '依赖包安装失败!'
        exit 1
    fi
}

# 检测并创建文件夹
check_and_create_folder() {
    local folder_path=$1
    local perms=$2
    if [ ! -d "$folder_path" ]; then
        echo "文件夹 '$folder_path' 不存在,正在创建..."
        mkdir -p "$folder_path"
        if [ $? -eq 0 ]; then
            echo "文件夹 '$folder_path' 已成功创建。"
        else
            echo "创建文件夹 '$folder_path' 失败,请检查权限或路径。"
            exit 1
        fi
    else
        echo "文件夹 '$folder_path' 已存在。"
    fi
    chown ${MYSQL_USER}:${MYSQL_GROUP} "$folder_path"
    chmod "$perms" "$folder_path"
}

# 主流程开始:

# 1. 安装依赖
install_dependencies

# 2. 创建所需目录
check_and_create_folder "$LOG_DIR" 755
check_and_create_folder "$MYSQL_DATA_DIR" 700
check_and_create_folder "$MYSQL_BASE_DIR" 755
check_and_create_folder "$(dirname "$MYSQL_CONFIG")" 755

# 3. 检查 MySQL 安装包是否存在
if [ ! -f "${MYSQL_PACKAGE_DIR}/${MYSQL_PACKAGE_NAME}" ]; then
    echo "MySQL安装包不存在: ${MYSQL_PACKAGE_DIR}/${MYSQL_PACKAGE_NAME}"
    exit 1
fi

# 4. 卸载系统自带的 MariaDB
echo '===================================='
echo '正在移除 MariaDB...'
rpm -qa | grep mariadb | xargs -r yum remove -y > /dev/null 2>&1

# 5. 解压 MySQL 安装包
echo '===================================='
echo '正在解压 MySQL...'
tar -zxvf "${MYSQL_PACKAGE_DIR}/${MYSQL_PACKAGE_NAME}" --strip-components=1 -C "${MYSQL_BASE_DIR}"
if [ $? -ne 0 ]; then
    echo 'MySQL 解压失败!!!'
    exit 1
else
    echo 'MySQL 解压成功!'
fi

# 6. 创建 MySQL 用户和用户组
echo '===================================='
echo '正在创建 MySQL 用户和组...'
if ! getent group ${MYSQL_GROUP} > /dev/null; then
    groupadd ${MYSQL_GROUP}
    echo "组 ${MYSQL_GROUP} 已创建。"
else
    echo "组 ${MYSQL_GROUP} 已存在。"
fi
if ! getent passwd ${MYSQL_USER} > /dev/null; then
    useradd -g ${MYSQL_GROUP} -s /bin/false ${MYSQL_USER}
    echo "用户 ${MYSQL_USER} 已创建。"
else
    echo "用户 ${MYSQL_USER} 已存在。"
fi
chown -R ${MYSQL_USER}:${MYSQL_GROUP} "${MYSQL_BASE_DIR}"
chmod -R 755 "${MYSQL_BASE_DIR}"

# 7. 创建 /var/lib/mysql 目录并设置权限
check_and_create_folder /var/lib/mysql 755

# 8. 创建 MySQL 配置文件
echo '===================================='
echo "正在创建 MySQL 配置文件: ${MYSQL_CONFIG}"
cat > "${MYSQL_CONFIG}" << EOF
[mysql]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock

[mysqld]
skip-name-resolve
port = ${MYSQL_PORT}
socket=/var/lib/mysql/mysql.sock
basedir=${MYSQL_BASE_DIR}
datadir=${MYSQL_DATA_DIR}
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
pid-file=/var/lib/mysql/mysqld.pid
log-error=${LOG_DIR}/mysqld.log
EOF
if [ $? -ne 0 ]; then
    echo '写入 my.cnf 配置文件失败!!!'
    exit 1
else
    echo 'MySQL 配置文件创建成功。'
    chown ${MYSQL_USER}:${MYSQL_GROUP} "${MYSQL_CONFIG}"
    chmod 644 "${MYSQL_CONFIG}"
fi

# 9. 创建符号链接到 /etc/my.cnf
echo '===================================='
echo '正在创建 /etc/my.cnf 符号链接...'
ln -sf "${MYSQL_CONFIG}" /etc/my.cnf
if [ $? -eq 0 ]; then
    echo '/etc/my.cnf 符号链接创建成功。'
    if command -v restorecon >/dev/null 2>&1; then
        restorecon -v /etc/my.cnf
    fi
else
    echo '创建 /etc/my.cnf 符号链接失败!'
    exit 1
fi

# 10. 初始化 MySQL
echo '===================================='
echo '正在初始化 MySQL...'
cd "${MYSQL_BASE_DIR}" || { echo "无法进入目录 ${MYSQL_BASE_DIR}"; exit 1; }
rm -rf "${MYSQL_DATA_DIR:?}"/*
rm -f "${LOG_DIR}/mysqld.log"

if [ "${MYSQL_CONFIG}" != "/etc/my.cnf" ]; then
    ./bin/mysqld --defaults-file="${MYSQL_CONFIG}" --initialize --user=${MYSQL_USER} --basedir=${MYSQL_BASE_DIR} --datadir=${MYSQL_DATA_DIR} > /dev/null 2>&1
else
    ./bin/mysqld --initialize --user=${MYSQL_USER} --basedir=${MYSQL_BASE_DIR} --datadir=${MYSQL_DATA_DIR} > /dev/null 2>&1
fi
if [ $? -ne 0 ]; then
    echo 'MySQL 初始化失败!!!'
    exit 1
fi

# 从日志文件提取初始密码
sleep 2
InitialPassword=$(grep "temporary password" "${LOG_DIR}/mysqld.log" | awk -F': ' '{print $2}')
if [ -z "$InitialPassword" ]; then
    echo "未能从日志文件提取初始密码。"
    cat "${LOG_DIR}/mysqld.log"
    exit 1
fi
echo "初始密码: $InitialPassword"

# 11. 修复 SELinux 上下文(如果 SELinux 启用)
if command -v restorecon >/dev/null 2>&1; then
    echo '正在恢复 MySQL 目录的 SELinux 上下文...'
    restorecon -R "${MYSQL_BASE_DIR}" /var/lib/mysql "${LOG_DIR}" "${MYSQL_DATA_DIR}"
fi

# 12. 创建 systemd 服务文件
echo '===================================='
echo '正在创建 MySQL systemd 服务文件...'
cat > /etc/systemd/system/mysql.service << EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/5.7/en/
After=network.target

[Service]
Type=simple
User=${MYSQL_USER}
Group=${MYSQL_GROUP}
ExecStart=${MYSQL_BASE_DIR}/bin/mysqld --defaults-file=${MYSQL_CONFIG}
ExecStop=${MYSQL_BASE_DIR}/bin/mysqladmin --defaults-file=${MYSQL_CONFIG} shutdown
LimitNOFILE=4096
TimeoutStartSec=120
TimeoutStopSec=120
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF
if [ $? -ne 0 ]; then
    echo '创建 systemd 服务文件失败!'
    exit 1
else
    echo 'MySQL systemd 服务文件创建成功!'
fi

# 13. 重新加载 systemd 配置
echo '===================================='
echo '正在重新加载 systemd 管理器配置...'
systemctl daemon-reload

# 14. 启动 MySQL 服务并设置开机启动
echo '===================================='
echo '正在启动 MySQL 服务...'
systemctl start mysql
if [ $? -ne 0 ]; then
    echo '启动 MySQL 服务失败!'
    echo '检查 mysqld 错误日志:'
    tail -30 "${LOG_DIR}/mysqld.log"
    echo '检查 systemd 日志:'
    journalctl -u mysql.service -n 30
    exit 1
fi
echo '正在设置 MySQL 服务开机启动...'
systemctl enable mysql

# 15. 配置防火墙
echo '===================================='
echo '正在配置防火墙...'
if systemctl is-active firewalld > /dev/null 2>&1; then
    firewall-cmd --permanent --add-port=${MYSQL_PORT}/tcp
    firewall-cmd --reload
    echo "防火墙已开放端口 ${MYSQL_PORT}。"
else
    echo "Firewalld 未运行,跳过防火墙配置。"
fi

# 16. 临时禁用 SELinux
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" = "Enforcing" ]; then
    echo '正在临时禁用 SELinux...'
    setenforce 0
fi

# 17. 设置全局 PATH(明确标记)
### 17. 设置全局 PATH
echo '===================================='
echo '正在设置 MySQL 全局 PATH...'
echo "export PATH=\$PATH:${MYSQL_BASE_DIR}/bin" > /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
if [ $? -eq 0 ]; then
    echo 'MySQL 全局 PATH 设置成功!'
else
    echo 'MySQL 全局 PATH 设置失败!'
    exit 1
fi

# 18. 检查服务状态
sleep 5
if systemctl is-active mysql >/dev/null 2>&1; then
    echo 'MySQL 服务启动成功!'
else
    echo 'MySQL 服务启动失败!'
    echo '检查 mysqld 错误日志:'
    tail -30 "${LOG_DIR}/mysqld.log"
    echo '检查 systemd 日志:'
    journalctl -u mysql.service -n 30
    exit 1
fi

# 19. 修改 root 密码并允许远程连接
echo '===================================='
echo '正在设置 root 密码并启用远程访问...'
"${MYSQL_BASE_DIR}/bin/mysql" --defaults-file="${MYSQL_CONFIG}" -uroot -p"${InitialPassword}" --connect-expired-password << EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
USE mysql;
UPDATE user SET Host='%' WHERE User='root';
FLUSH PRIVILEGES;
EOF
if [ $? -ne 0 ]; then
    echo '更新 root 密码和权限失败!'
    exit 1
else
    echo 'root 密码和权限更新成功。'
fi

# 20. 执行 SQL 文件(如果存在)
if [ -f "${SQL_FILE}" ]; then
    echo '===================================='
    echo '正在执行 SQL 文件...'
    "${MYSQL_BASE_DIR}/bin/mysql" --defaults-file="${MYSQL_CONFIG}" -uroot -p"${MYSQL_ROOT_PASSWORD}" < "${SQL_FILE}"
    if [ $? -eq 0 ]; then
        echo 'SQL 文件执行成功。'
    else
        echo 'SQL 文件执行失败,但继续。'
    fi
fi

# 21. 最终服务检查
echo '===================================='
echo '最终服务状态检查...'
if systemctl is-active mysql >/dev/null 2>&1; then
    echo 'MySQL 服务正在运行。'
    echo '===================================='
    echo 'MySQL 安装成功完成!'
    echo '连接信息:'
    echo "主机: localhost (或您的服务器 IP)"
    echo "端口: ${MYSQL_PORT}"
    echo "用户名: root"
    echo "密码: ${MYSQL_ROOT_PASSWORD}"
    echo "配置文件: ${MYSQL_CONFIG}"
    echo '===================================='
    echo '您现在可以使用 Navicat 或其他 MySQL 客户端连接 MySQL。'
    echo 'MySQL 服务将在系统启动时自动启动。'
    echo '本地命令行登录: mysql -uroot -p${MYSQL_ROOT_PASSWORD}'
else
    echo '安装后 MySQL 服务未运行!'
    exit 1
fi

exit 0

说明

  • 这个脚本可以自动化安装 MySQL 5.7。
  • 脚本中的 MySQL 服务会被注册为 systemd 服务,并会自动启动并启用自启动。
  • MySQL 配置文件 my.cnf 和日志文件等路径可以根据需求修改。
相关推荐
GzlAndy7 小时前
MySQL高可用集群
数据库·mysql
菜菜小蒙7 小时前
【MySQL】事务及隔离性
数据库·mysql
不穿铠甲的穿山甲7 小时前
mysql-mysql源码本地调试
数据库·mysql
☆凡尘清心☆9 小时前
LNMP环境中php7.2升级到php7.4
linux·nginx·centos·lnmp
82782093710 小时前
CentOS-stream-9 Zabbix的安装与配置
linux·centos·zabbix
厚衣服_313 小时前
第十三篇:MySQL 运维自动化与可观测性建设实践指南
运维·mysql·自动化
fengye20716114 小时前
板凳-------Mysql cookbook学习 (九)
android·学习·mysql
小鸡脚来咯14 小时前
MySQL事务及其原理
数据库·mysql
快去睡觉~14 小时前
MySQL之约束和表的增删查改
android·数据库·mysql
☆凡尘清心☆16 小时前
CentOS 7 环境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)
linux·nginx·centos·lnmp