centos 7 MySQL 离线一键自动安装脚本

MySQL 一键自动安装脚本

目录

  • [MySQL 一键自动安装脚本](#MySQL 一键自动安装脚本)
    • [1. 简介](#1. 简介)
    • [2. 脚本功能](#2. 脚本功能)
      • [2.1. 下载地址](#2.1. 下载地址)
    • [3. 使用说明](#3. 使用说明)
    • [4. 注意事项](#4. 注意事项)
    • [5. 代码解释](#5. 代码解释)

1. 简介

该脚本是用于在离线环境下一键自动安装 MySQL 的 Bash 脚本。它包含了安装 MySQL 的所有步骤,包括安装依赖、创建用户和组、创建目录、安装 MySQL、配置 MySQL、创建服务以及初始化 MySQL。

2. 脚本功能

  • 安装所需的依赖包。
  • 创建 MySQL 用户和组。
  • 创建目录并设置权限。
  • 解压并安装 MySQL。
  • 设置 MySQL 的配置文件。
  • 创建 MySQL 服务并设置为开机自启。
  • 初始化 MySQL,并获取初始 Root 密码。
  • 等待 MySQL 服务启动,重置 Root 密码。
  • 创建新的 MySQL 用户并授予所有权限。
  • 在防火墙中添加 MySQL 端口。

2.1. 下载地址

见资源绑定

3. 使用说明

准备工作

  • 确保脚本运行在具有 root 权限的用户下。
  • 下载并准备好 MySQL 的安装包,并将其放置在指定的路径下。

执行脚本

  • 执行脚本:./mysql_install.sh

4. 注意事项

  • 在执行脚本之前,请确保已经准备好了 MySQL 的安装包,并放置在正确的路径下。
  • 确保脚本运行时具有足够的权限来执行系统级的操作。
  • 在脚本运行期间,请留意是否有任何错误信息输出,确保每个步骤都成功执行。

5. 代码解释

shell 复制代码
#!/bin/bash

set -e

MYSQL_PACKAGE="/usr/local/autoinstall/lib/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz"
MYSQL_INSTALL_DIR="/usr/local/mysql"
MYSQL_DATA_DIR="/dhxdata/mysql"
MYSQL_SOCKET_DIR="/usr/local/mysql/socket"
MYSQL_SOCKET_FILE="$MYSQL_SOCKET_DIR/mysql13306.sock"
MYSQL_PASSWORD="tech@2023#YN"
MYSQL_NEW_USER="mysql_fu"
MYSQL_NEW_USER_PASSWORD="Fu@2023"
MySQL_PORT="13306"
DEPENDENCY_DIR="/usr/local/autoinstall/third-lib/"

install_dependencies() {
    echo "安装依赖..."
    yum localinstall -y "$DEPENDENCY_DIR/ncurses-devel"/*.rpm
    yum localinstall -y "$DEPENDENCY_DIR/libaio-devel"/*.rpm
}

setup_mysql_account() {
    echo "创建MySQL用户和组..."
    groupadd mysql
    useradd -r -g mysql -s /bin/false mysql
}

setup_directories() {
    echo "创建目录并设置权限..."
    mkdir -p "$MYSQL_INSTALL_DIR"
    mkdir -p "$MYSQL_DATA_DIR"
    mkdir -p "$MYSQL_SOCKET_DIR"
    chown -R mysql:mysql "$MYSQL_INSTALL_DIR"
    chown -R mysql:mysql "$MYSQL_DATA_DIR"
    chown -R mysql:mysql "$MYSQL_SOCKET_DIR"
}

install_mysql() {
    echo "解压并安装MySQL..."
    tar -xf "$MYSQL_PACKAGE" --strip-components=1 -C "$MYSQL_INSTALL_DIR"
}

configure_mysql() {
echo "将MySQL可执行文件添加到系统路径..."
echo "export PATH=\$PATH:$MYSQL_INSTALL_DIR/bin" >> /etc/profile
source /etc/profile

echo "设置MySQL配置文件"
cat << EOF > /etc/my.cnf
[mysqld]
user=mysql
basedir=$MYSQL_INSTALL_DIR
datadir=$MYSQL_DATA_DIR
socket=$MYSQL_SOCKET_FILE
port=$MySQL_PORT
sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
EOF
}

setup_service() {
echo "创建MySQL服务并设置为开机自启..."
cat << EOF > /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=$MYSQL_INSTALL_DIR/bin/mysqld --defaults-file=/etc/my.cnf
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
}

initialize_mysql() {
    echo "初始化MySQL,并获取初始Root密码..."
    $MYSQL_INSTALL_DIR/bin/mysqld --initialize --user=mysql --basedir=$MYSQL_INSTALL_DIR --datadir=$MYSQL_DATA_DIR > mysql_init.log 2>&1
}

main() {
if [[ $EUID -ne 0 ]]; then
   echo "该脚本必须以root身份运行" 
   exit 1
fi

if [ ! -f "$MYSQL_PACKAGE" ]; then
   echo "MySQL安装包不存在."
   exit 1
fi

install_dependencies
setup_mysql_account
setup_directories
install_mysql
configure_mysql
setup_service
initialize_mysql

TEMP_PASSWORD=$(awk '/temporary password/{print $NF}' mysql_init.log)

echo "MySQL临时Root密码: $TEMP_PASSWORD"

echo "等待MySQL服务启动..."
until mysqladmin ping --socket=$MYSQL_SOCKET_FILE --silent; do
	sleep 1
	echo "等待MySQL启动..."
done

echo "重置MySQL Root密码..."
mysql --user=root --password="$TEMP_PASSWORD" --connect-expired-password --socket=$MYSQL_SOCKET_FILE <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD';
EOF

echo "创建新的MySQL用户并授予所有权限..."
mysql --user=root --password="$MYSQL_PASSWORD" --socket=$MYSQL_SOCKET_FILE <<EOF
CREATE USER '$MYSQL_NEW_USER'@'%' IDENTIFIED BY '$MYSQL_NEW_USER_PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_NEW_USER'@'%';
EOF
echo "MySQL已经安装并启动,端口为$MySQL_PORT!"

# 在防火墙中添加MySQL端口

firewall-cmd --zone=public --add-port=$MySQL_PORT/tcp --permanent
firewall-cmd --reload
}

main "$@"
相关推荐
这个DBA有点耶4 小时前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵7 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking12 小时前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客2 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
Jim6004 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL4 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
云技纵横7 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二7 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
小猿姐8 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops