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 "$@"
相关推荐
weixin_4481199418 分钟前
Datawhale Hello-Agents入门篇202512第1次作业
数据库·sql·mysql
皮皮林55119 分钟前
有了开源的 MySQL,为什么还要选择 PostgreSQL?
mysql
廋到被风吹走1 小时前
【数据库】【MySQL】分库分表策略 分类、优势与短板
数据库·mysql·分类
五阿哥永琪3 小时前
MySQL 慢查询定位与 SQL 性能优化实战指南
sql·mysql·性能优化
知识分享小能手4 小时前
CentOS Stream 9入门学习教程,从入门到精通,Linux日志分析工具及应用 —语法详解与实战案例(17)
linux·学习·centos
xiaok6 小时前
GROUP BY进阶用法
mysql
李慕婉学姐6 小时前
【开题答辩过程】以《基于Android的健康助手APP的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
android·java·mysql
qq_12498707537 小时前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计
亚林瓜子7 小时前
mysql命令行手动导入csv数据到指定表
数据库·mysql·gui·csv·cli·db·import
云动课堂8 小时前
一键升级 OpenSSH 10到最新版:告别手工编译、兼容国产系统、批量部署无忧!
linux·服务器·centos