在 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 文件。
脚本会执行以下操作:
- 安装所需的依赖包。
- 创建 MySQL 所需的目录。
- 解压 MySQL 安装包到指定目录。
- 创建 MySQL 用户和用户组。
- 配置 MySQL 的
my.cnf
文件。 - 初始化 MySQL 数据库。
- 创建并启用
systemd
服务文件来管理 MySQL 服务。 - 启动 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
和日志文件等路径可以根据需求修改。