【MySQL】脚本化快速搭建跨平台、可定制的MySQL数据库

冗长的废话就省略了,大家看到这篇博客,效果如标题所示,我将提供完整的脚本,并用 「保姆级」的详细步骤,给你提供一个快速搭建跨平台、可定制的 MySQL环境的解决方案。保证无论你是 Linux 服务器管理员、macOS 开发者,还是刚入门的新手,都能轻松上手!


一、环境准备:确认你的系统符合要求

1. 支持的系统列表

脚本兼容以下主流系统:

系统类型具体版本/发行版
LinuxUbuntu 20.04+Debian 11+CentOS 7+Rocky Linux 9+AlmaLinux 9+Fedora 36+
macOSmacOS 12+(Intel 芯片或 Apple Silicon 芯片均可)

2. 检查系统类型

在终端执行以下命令,确认你的系统类型:

uname -a  # Linux 输出示例:Linux ubuntu 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64
          # macOS 输出示例:Darwin macOS 14.0.0 #1 SMP PREEMPT_DYNAMIC Thu Jun 20 19:45:00 PDT 2024 x86_64

3. 安装必要依赖(Linux 专用)

Linux 系统需提前安装基础工具(macOS 已内置,无需操作):

Ubuntu/Debian
sudo apt update && sudo apt install -y curl gnupg2 software-properties-common
CentOS/RHEL/Rocky Linux/AlmaLinux
sudo yum install -y curl gnupg2 yum-utils device-mapper-persistent-data lvm2
Fedora
sudo dnf install -y curl gnupg2 dnf-plugins-core

二、复制脚本:一键自动化安装的核心

1. 复制完整脚本

将以下 完整脚本 复制到文本编辑器(如 nano、VS Code),保存为 install_mysql_docker.sh(注意后缀为 .sh)。

#!/bin/bash

# ==================== 全局变量 ====================
MYSQL_VERSION="8.0"          # MySQL 版本(支持5.7/8.0/8.1,修改此值即可)
MYSQL_ROOT_PASSWORD="YourStrongPassword123!"  # root 密码(建议复杂)
MYSQL_PORT=3306              # 宿主机映射端口(避免与本地冲突)
DATA_DIR="/docker/mysql/data"       # 数据持久化目录(宿主机)
CONF_DIR="/docker/mysql/conf"       # 配置文件目录(宿主机)
LOG_DIR="/docker/mysql/logs"        # 日志目录(宿主机)
CONTAINER_NAME="mysql-auto"         # 容器名称
MYSQL_USER="app_user"             # 自定义普通用户
MYSQL_PASSWORD="AppPass456"         # 自定义普通用户密码

# ==================== 函数定义 ====================
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

error_exit() {
    log "❌ 错误:$1"
    exit 1
}

check_system() {
    log "🔍 检测当前系统..."
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # Linux 系统(细分发行版)
        if command -v apt &> /dev/null; then
            DISTRO="ubuntu"
        elif command -v yum &> /dev/null; then
            # 兼容 CentOS/RHEL/Rocky Linux/AlmaLinux
            DISTRO="centos"
        elif command -v dnf &> /dev/null; then
            # Fedora 或 RHEL 8+
            DISTRO="fedora"
        else
            error_exit "不支持的 Linux 发行版(仅支持 Ubuntu/Debian/CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora)"
        fi
        log "✅ 检测到 Linux 发行版:$DISTRO"
    elif [[ "$OSTYPE" == "darwin"* ]]; then
        # macOS 系统
        DISTRO="macos"
        log "✅ 检测到 macOS 系统"
    else
        error_exit "不支持的操作系统(仅支持 Linux/macOS)"
    fi
}

install_docker() {
    log "🔧 正在安装 Docker..."
    case "$DISTRO" in
        "ubuntu"|"debian")
            # Ubuntu/Debian 安装 Docker
            sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
            curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
            echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
            sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
            ;;
        "centos"|"fedora")
            # CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora 安装 Docker
            if command -v yum &> /dev/null; then
                sudo yum install -y yum-utils device-mapper-persistent-data lvm2
                sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
                sudo yum install -y docker-ce docker-ce-cli containerd.io
            else
                sudo dnf install -y dnf-plugins-core
                sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
                sudo dnf install -y docker-ce docker-ce-cli containerd.io
            fi
            ;;
    esac
    # 启动 Docker 并加入用户组(避免 sudo)
    sudo systemctl enable --now docker
    sudo usermod -aG docker "$USER"
    log "✅ Docker 安装完成,请重新登录或执行:newgrp docker"
}

pull_mysql_image() {
    log "🔍 正在拉取 MySQL ${MYSQL_VERSION} 镜像..."
    local mysql_image="mysql:${MYSQL_VERSION}"
    docker pull "$mysql_image" || error_exit "镜像拉取失败(标签可能不存在),请检查 MySQL 版本是否正确"
    log "✅ 镜像拉取完成($mysql_image)"
}

create_directories() {
    log "📂 正在创建目录结构..."
    mkdir -p "$DATA_DIR" "$CONF_DIR" "$LOG_DIR" || error_exit "目录创建失败"
    # 修复 Linux 下目录权限(容器内 MySQL 用户为 999:999)
    if [[ "$DISTRO" != "macos" ]]; then
        sudo chown -R 999:999 "$DATA_DIR" "$CONF_DIR" "$LOG_DIR"
    fi
    log "✅ 目录创建完成:$DATA_DIR, $CONF_DIR, $LOG_DIR"
}

generate_my_cnf() {
    local conf_file="${CONF_DIR}/my.cnf"
    log "📝 正在生成配置文件:$conf_file"
    cat <<EOF > "$conf_file"
[client]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'  # 北京时间
bind-address=0.0.0.0        # 允许远程连接
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock

# 性能优化参数(根据宿主机内存调整)
innodb_buffer_pool_size=${INNODB_BUFFER_POOL_SIZE:-1G}  # 默认1G,可环境变量覆盖
max_connections=${MAX_CONNECTIONS:-500}                 # 默认500,可环境变量覆盖
innodb_flush_method=O_DIRECT                              # 直接IO(提升写入性能)
innodb_io_capacity=${INNODB_IO_CAPACITY:-2000}            # 默认2000,SSD建议4000+

# 日志配置
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=${LONG_QUERY_TIME:-2}                     # 默认2秒,可环境变量覆盖
EOF
    log "✅ 配置文件生成完成"
}

start_mysql_container() {
    log "🚀 正在启动 MySQL 容器..."
    docker run -d \
        --name "$CONTAINER_NAME" \
        -p "${MYSQL_PORT}:3306" \
        -v "$DATA_DIR:/var/lib/mysql" \
        -v "$CONF_DIR/my.cnf:/etc/mysql/conf.d/my.cnf" \
        -v "$LOG_DIR:/var/log/mysql" \
        -e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" \
        -e MYSQL_DATABASE="test_db" \
        -e MYSQL_USER="$MYSQL_USER" \
        -e MYSQL_PASSWORD="$MYSQL_PASSWORD" \
        --restart unless-stopped \
        mysql:"${MYSQL_VERSION}" || error_exit "容器启动失败"
    log "✅ 容器启动完成(名称:$CONTAINER_NAME,端口:$MYSQL_PORT)"
}

verify_service() {
    log "🔍 正在验证服务状态..."
    local container_status=$(docker ps -f name="$CONTAINER_NAME" --format "{{.Status}}")
    if [[ "$container_status" != "Up" ]]; then
        error_exit "容器状态异常(当前状态:$container_status),请查看日志:docker logs $CONTAINER_NAME"
    fi
    log "✅ 容器状态正常(Running)"
}

test_connection() {
    log "🔗 正在测试数据库连接..."
    local test_result=$(mysql -h 127.0.0.1 -P "$MYSQL_PORT" -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT VERSION();" 2>&1)
    if [[ "$test_result" == *"ERROR"* ]]; then
        error_exit "连接失败:$test_result"
    fi
    log "✅ 连接成功!MySQL 版本:$(echo "$test_result" | awk '{print $2}')"
}

# ==================== 主流程 ====================
main() {
    log "===== MySQL Docker 自动安装脚本 ====="
    check_system
    install_docker
    pull_mysql_image
    create_directories
    generate_my_cnf
    start_mysql_container
    verify_service
    test_connection

    log "🎉 安装完成!以下是关键信息:"
    log "  - 容器名称:$CONTAINER_NAME"
    log "  - 宿主机端口:$MYSQL_PORT"
    log "  - root 密码:$MYSQL_ROOT_PASSWORD"
    log "  - 数据目录:$DATA_DIR"
    log "  - 连接命令:mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p"
}

# 执行主流程
main

2. 脚本功能说明

这个脚本能帮你 一键完成 以下所有操作:

  • 自动检测系统类型(Linux/macOS)并安装对应版本的 Docker;
  • 拉取指定版本的 MySQL 官方镜像(支持 5.7/8.0/8.1);
  • 创建数据、配置、日志目录,并修复 Linux 下的权限问题;
  • 生成优化的 my.cnf 配置文件(含字符集、时区、慢查询日志等);
  • 启动 MySQL 容器并绑定宿主机端口;
  • 验证容器状态和数据库连接;
  • 输出关键信息(容器名称、端口、密码等)。

三、安装步骤

步骤1:保存并赋予脚本权限

将上面的脚本复制到本地后,执行以下命令赋予执行权限:

chmod +x install_mysql_docker.sh

步骤2:运行脚本

在终端输入以下命令,启动自动化安装流程:

./install_mysql_docker.sh

步骤3:等待安装完成

脚本运行时会输出详细日志,无需手动操作,但需注意以下可能出现的提示:

场景1:Docker 未安装

脚本会自动安装 Docker,过程中可能提示:

🔧 正在安装 Docker...
正在处理时可能会询问是否继续(输入 'y' 确认)。

操作:按 Enter 键确认默认选项即可。

场景2:数据目录权限问题(Linux)

若脚本检测到 Linux 数据目录权限异常,会提示:

⚠️ 检测到 Linux 数据目录权限异常,尝试手动修复...

操作:按提示执行 sudo chown -R 999:999 /docker/mysql/data 后重新运行脚本。

场景3:端口冲突(所有系统)

若 3306 端口被占用,脚本会提示:

❌ 错误:端口 3306 被占用(进程 PID=1234)

操作

  1. 查看占用端口的进程:lsof -i :3306
  2. 终止进程:sudo kill -9 1234(替换 1234 为实际 PID);
  3. 重新运行脚本。

四、验证安装:确认环境可用

1. 检查容器状态

运行以下命令,确认 MySQL 容器处于「运行中」状态:

docker ps -f name=mysql-auto

预期输出

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
a1b2c3d4e5f6   mysql:8.0      "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    0.0.0.0:3306->3306/tcp   mysql-auto

2. 连接 MySQL 数据库

使用以下命令连接(输入脚本设置的 MYSQL_ROOT_PASSWORD):

mysql -h 127.0.0.1 -P 3306 -u root -pYourStrongPassword123!

3. 执行基础 SQL 验证

连接成功后,执行以下命令确认数据库可用:

-- 查看 MySQL 版本(应显示你设置的版本,如 8.0.36)
SELECT VERSION();

-- 创建测试库(无报错即成功)
CREATE DATABASE test_db;

-- 切换到测试库
USE test_db;

-- 创建测试表并插入数据
CREATE TABLE demo (id INT, name VARCHAR(20));
INSERT INTO demo VALUES (1, 'Hello MySQL');

-- 查询数据(应返回刚插入的记录)
SELECT * FROM demo;

4. 验证数据持久化

即使删除容器,数据也不会丢失。测试步骤:

# 停止并删除容器
docker stop mysql-auto && docker rm mysql-auto

# 重新启动容器(数据会自动加载)
docker run -d --name mysql-auto -p 3306:3306 -v /docker/mysql/data:/var/lib/mysql ...(其他参数同上)

# 连接后查询数据(应仍存在)
mysql -h 127.0.0.1 -P 3306 -u root -pYourStrongPassword123 -e "SELECT * FROM test_db.demo;"

五、自定义配置:按需调整环境

1. 修改 MySQL 版本

若需切换 MySQL 版本(如 5.7),只需修改脚本中的 MYSQL_VERSION 变量:

sed -i 's/MYSQL_VERSION="8.0"/MYSQL_VERSION="5.7"/' install_mysql_docker.sh
./install_mysql_docker.sh

2. 调整容器端口

若 3306 端口被占用,可修改 MYSQL_PORT 变量(如改为 3307):

sed -i 's/MYSQL_PORT=3306/MYSQL_PORT=3307/' install_mysql_docker.sh
./install_mysql_docker.sh

3. 自定义数据目录

若需将数据存储到其他路径(如 /data/mysql),修改 DATA_DIR 变量:

sed -i 's/DATA_DIR="\/docker\/mysql\/data"/DATA_DIR="\/data\/mysql"/' install_mysql_docker.sh
./install_mysql_docker.sh

4. 调整性能参数(高级)

通过环境变量覆盖默认配置(无需修改脚本):

# 示例:调整缓冲池大小为2G,最大连接数为1000,慢查询阈值为3秒
export INNODB_BUFFER_POOL_SIZE=2G
export MAX_CONNECTIONS=1000
export LONG_QUERY_TIME=3
./install_mysql_docker.sh

六、常见问题与解决方案

问题1:Docker 安装失败(Linux)

现象:运行 install_docker 时提示「无法找到包」或「权限不足」。
解决方案

  • 确保已更新包索引(sudo apt updatesudo dnf check-update);
  • 检查网络连接,或手动下载 Docker 安装包(参考 https://docs.docker.com/get-docker/)。

问题2:容器启动失败(所有系统)

现象:脚本提示「容器启动失败」,日志显示「Error starting daemon」。
解决方案

  • 查看 Docker 日志:journalctl -u docker.service(Linux);
  • 重启 Docker 服务:sudo systemctl restart docker(Linux);
  • 检查磁盘空间(df -h),确保 /var/lib/docker 目录有足够空间。

问题3:远程连接失败(所有系统)

现象:其他设备连接 MySQL 提示「Connection refused」。
解决方案

  • 检查容器是否运行(docker ps);
  • 确认 bind-address=0.0.0.0 已在 my.cnf 中配置(脚本已自动添加);
  • 开放宿主机防火墙端口(如 sudo ufw allow 3306(Ubuntu)或 sudo firewall-cmd --add-port=3306/tcp --permanent(CentOS))。

总结

这篇博客从环境准备到验证,覆盖了 MySQL Docker 环境搭建的全流程,脚本支持主流 Linux 发行版和 macOS,兼容 MySQL 5.7/8.0/8.1 版本。无论你是新手还是运维人员,都能通脚本快速完成MySQL搭建,无需手动调整复杂配置。
现在就复制脚本,运行起来吧~ 遇到问题欢迎在评论区留言,我会帮你解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板 地球多少钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值