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 "$@"
相关推荐
不穿铠甲的穿山甲10 分钟前
mysql-分析并解决可重复读隔离级别发生的删除幻读问题
数据库·mysql
冷眼Σ(-᷅_-᷄๑)38 分钟前
如何将Asp.net Core站点部署到CentOS
后端·centos·asp.net
白萝卜弟弟43 分钟前
【MySQL】MySQL中的函数之JSON_ARRAY_INSERT
数据库·mysql·json
QQ_1154320312 小时前
基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现四
java·spring boot·mysql·毕业设计·毕业源码·竞拍系统·竞拍平台
blammmp2 小时前
MySQL:事务
数据库·mysql
白萝卜弟弟2 小时前
【MySQL】MySQL中的函数之JSON_ARRAY_APPEND
数据库·mysql·json
桃园码工2 小时前
2-测试bigcache做进程内缓存 --开源项目obtain_data测试
vscode·mysql·go·postman
codeMaster__hyd3 小时前
使用IDEA构建springboot项目+整合Mybatis
java·linux·centos·intellij-idea·intellij idea·1024程序员节
土豆炒马铃薯。3 小时前
【深度学习】Pytorch 1.x 安装命令
linux·人工智能·pytorch·深度学习·ubuntu·centos
白云如幻3 小时前
MySQL子查询介绍和where后的标量子查询
数据库·mysql