离线安装特定mysql

一、为什么需要离线安装特定版本?

1.1 场景分析:apt 安装的隐患

复制代码
# 传统 apt 安装的问题
sudo apt install mysql-server
# 实际安装的是 Ubuntu 仓库维护的版本,可能:
# - 版本滞后(Ubuntu 22.04 默认 MySQL 8.0.35,而非最新 8.4.3)
# - 补丁级别不可控(自动更新可能引入未测试的变更)
# - 依赖冲突(与现有 Percona/MariaDB 组件不兼容)

1.2 离线安装的核心价值

场景 风险 离线安装优势
生产环境 apt upgrade 自动升级导致不兼容 版本锁定,变更可控
内网/隔离环境 无外网访问,无法 apt 提前下载,本地部署
合规审计 需精确版本追溯 哈希校验,来源明确
多节点集群 版本必须完全一致 统一介质,批量复制
回滚需求 新版本故障需降级 保留历史版本安装包

二、MySQL 版本选择策略

2.1 MySQL 版本生命周期

复制代码
MySQL 8.0 系列(2018-2026)
├── 8.0.35 (Ubuntu 22.04 默认)
├── 8.0.36-8.0.40 (持续更新)
└── 8.0.41+ (仅安全修复)

MySQL 8.4 系列(2024 LTS,推荐新部署)
├── 8.4.0 (首个创新版)
├── 8.4.3 (本文目标版本,稳定可用)
└── 8.4.x (长期支持至 2032)

MySQL 9.0 系列(2024 创新版,非 LTS)
└── 仅建议测试环境使用

2.2 8.4.3 关键特性

特性 说明 影响
认证插件变更 caching_sha2_password 替代 mysql_native_password 旧客户端需升级或显式配置
默认字符集 utf8mb4 全面替代 latin1 中文支持更完善,存储增加
InnoDB 改进 并行 DDL、优化器增强 大表操作性能提升 30%+
JSON 增强 多值索引、聚合函数 文档型应用场景扩展
克隆插件 物理热备份替代 XtraBackup 备份架构简化

三、离线安装完整流程

3.1 环境准备与依赖分析

复制代码
# 确认系统版本(MySQL 8.4.3 官方支持 Ubuntu 24.04/22.04/20.04)
lsb_release -a
# No LSB modules are available.
# Distributor ID: Ubuntu
# Description:    Ubuntu 24.04.1 LTS
# Release:        24.04
# Codename:       noble

# 清理历史 MySQL/MariaDB(关键!避免冲突)
sudo systemctl stop mysql mariadb 2>/dev/null || true
sudo apt remove --purge mysql* mariadb* 2>/dev/null || true
sudo rm -rf /var/lib/mysql /etc/mysql /var/log/mysql*

# 安装基础依赖(离线环境需提前准备这些 deb 包)
sudo apt update
sudo apt install -y \
    libaio1t64 \           # 异步 IO 支持,InnoDB 必需
    libnuma1 \             # NUMA 内存优化,大内存服务器关键
    psmisc \               # 提供 killall/fuser,管理脚本依赖
    mecab-utils \          # 日文分词(MySQL 全文索引可选)
    mecab-ipadic \         # 日文词典数据
    mecab-ipadic-utf8      # UTF-8 编码支持

依赖包作用详解

包名 功能 缺失后果
libaio1t64 Linux 原生异步 IO InnoDB 无法初始化,启动失败
libnuma1 非统一内存访问优化 大内存(>64GB)服务器性能下降
psmisc 进程管理工具 mysql_secure_installation 等脚本报错
mecab-* 日文全文检索 不使用日文搜索可省略,但建议保留

3.2 获取官方离线安装包

复制代码
# 方式一:官网直链下载(推荐,可验证签名)
cd /opt/mysql-packages  # 建议集中管理离线包
sudo wget https://cdn.mysql.com/archives/mysql-8.4/mysql-server_8.4.3-1ubuntu24.04_amd64.deb-bundle.tar

# 方式二:浏览器下载后传输(隔离环境)
# 访问 https://downloads.mysql.com/archives/community/
# 选择:
#   - Product: MySQL Community Server
#   - Version: 8.4.3
#   - OS: Ubuntu Linux
#   - OS Version: Ubuntu Linux 24.04 (x86, 64-bit)
#   - Package: Debian Bundle

# 验证包完整性(官网提供 SHA256 校验值)
sha256sum mysql-server_8.4.3-1ubuntu24.04_amd64.deb-bundle.tar
# 对比官网值:a1b2c3d4...(实际值需官网查询)

# 解压 bundle 包
sudo tar -xf mysql-server_8.4.3-1ubuntu24.04_amd64.deb-bundle.tar
ls -la *.deb
# 输出:
# mysql-common_8.4.3-1ubuntu24.04_amd64.deb                    # 通用组件
# mysql-community-client-plugins_8.4.3-1ubuntu24.04_amd64.deb  # 认证插件
# mysql-community-client-core_8.4.3-1ubuntu24.04_amd64.deb     # 客户端核心
# mysql-community-client_8.4.3-1ubuntu24.04_amd64.deb          # 客户端完整
# mysql-client_8.4.3-1ubuntu24.04_amd64.deb                    # 客户端元包
# mysql-community-server-core_8.4.3-1ubuntu24.04_amd64.deb     # 服务端核心
# mysql-community-server_8.4.3-1ubuntu24.04_amd64.deb          # 服务端完整
# mysql-server_8.4.3-1ubuntu24.04_amd64.deb                    # 服务端元包
# mysql-community-server-debug_8.4.3-1ubuntu24.04_amd64.deb    # 调试符号(可选)
# mysql-community-test_8.4.3-1ubuntu24.04_amd64.deb            # 测试套件(可选)

3.3 按依赖顺序安装

复制代码
# 必须严格按依赖顺序安装,否则 dpkg 会报错
cd /opt/mysql-packages

sudo dpkg -i \
    mysql-common_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-community-client-plugins_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-community-client-core_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-community-client_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-client_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-community-server-core_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-community-server_8.4.3-1ubuntu24.04_amd64.deb \
    mysql-server_8.4.3-1ubuntu24.04_amd64.deb

# 安装顺序逻辑:
# 1. mysql-common: 通用文件和目录结构
# 2. client-plugins: 认证插件(caching_sha2_password 等)
# 3. client-core: 客户端二进制和库
# 4. client: 客户端配置和依赖
# 5. client 元包: 统一客户端入口
# 6. server-core: mysqld 二进制和系统表
# 7. server: 服务端配置和启动脚本
# 8. server 元包: 统一服务端入口

常见错误处理

复制代码
# 错误1:依赖未满足
# dpkg: error processing package mysql-community-server (--install):
#  dependency problems - leaving unconfigured

# 解决:自动修复依赖
sudo apt -f install -y
# 或手动安装缺失包
sudo apt install -y libmecab2 libprotobuf-lite32

# 错误2:端口被占用
# [ERROR] Do you already have another mysqld server running on port: 3306?

# 解决:检查并停止冲突服务
sudo lsof -i :3306
sudo systemctl stop mysql mariadb 2>/dev/null || true
sudo killall mysqld 2>/dev/null || true

# 错误3:数据目录非空
# [ERROR] --initialize specified but the data directory has files in it

# 解决:清理或备份旧数据
sudo mv /var/lib/mysql /var/lib/mysql.backup.$(date +%Y%m%d)
sudo mkdir /var/lib/mysql && sudo chown mysql:mysql /var/lib/mysql

3.4 初始化数据目录

复制代码
# 方式A:自动初始化(推荐,生成临时 root 密码)
sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql

# 查看生成的临时密码
sudo grep 'temporary password' /var/log/mysql/error.log
# 2024-11-15T06:30:00.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Abc9#xyz!def

# 方式B:安全初始化(无密码,首次登录设置)
sudo mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# 警告:仅测试环境使用,生产必须用 --initialize

# 目录权限修正
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql

3.5 启动与验证

复制代码
# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql

# 检查状态
sudo systemctl status mysql
# ● mysql.service - MySQL Community Server
#      Loaded: loaded (/lib/systemd/system/mysql.service; enabled; preset: enabled)
#      Active: active (running) since Fri 2024-11-15 14:30:00 CST; 1min ago

# 查看版本确认
mysql -V
# mysql  Ver 8.4.3 for Linux on x86_64 (MySQL Community Server - GPL)

# 登录验证(使用临时密码或空密码)
sudo mysql -uroot -p
# 或
sudo mysql -uroot  # 如果是 --initialize-insecure

# SQL 验证
mysql> SELECT @@version, @@version_comment;
+-----------+------------------------------+
| @@version | @@version_comment            |
+-----------+------------------------------+
| 8.4.3     | MySQL Community Server - GPL |
+-----------+------------------------------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'validate_password%';
# 查看密码策略(8.4 默认更严格)

四、版本锁定与防升级策略

4.1 apt 标记保留(关键!)

复制代码
# 防止 apt upgrade 自动升级 MySQL
sudo apt-mark hold \
    mysql-server \
    mysql-community-server \
    mysql-community-client \
    mysql-community-client-core \
    mysql-community-server-core \
    mysql-community-client-plugins \
    mysql-common

# 验证标记状态
apt-mark showhold
# 应输出:
# mysql-common
# mysql-community-client
# mysql-community-client-core
# mysql-community-server
# mysql-community-server-core
# mysql-server

# 查看包状态详情
dpkg -l | grep mysql
# ii  mysql-common                    8.4.3-1ubuntu24.04   amd64   hold
# ii  mysql-community-client          8.4.3-1ubuntu24.04   amd64   hold
# ...

4.2 配置 apt 自动排除

复制代码
# 创建 apt 偏好配置,彻底阻止 MySQL 相关包升级
sudo tee /etc/apt/preferences.d/mysql-no-upgrade << 'EOF'
Package: mysql* libmysql*
Pin: version 8.4.*
Pin-Priority: 1001

Package: mysql* libmysql*
Pin: version *
Pin-Priority: -1
EOF

# 解释:
# - 8.4.* 版本优先级 1001(高于默认 500,允许安装但需手动确认)
# - 其他版本优先级 -1(禁止安装)

# 测试:尝试安装新版本会被阻止
sudo apt install mysql-server-8.0  # 应提示:将保持现状

4.3 升级流程(受控变更)

复制代码
# 当需要升级时,按以下流程:

# 1. 解除锁定
sudo apt-mark unhold mysql-server mysql-community-server ...

# 2. 下载新版离线包
wget https://cdn.mysql.com/.../mysql-server_8.4.4-1ubuntu24.04_amd64.deb-bundle.tar

# 3. 备份数据
sudo mysqldump -uroot -p --all-databases --single-transaction > mysql_backup_$(date +%Y%m%d).sql

# 4. 停止服务
sudo systemctl stop mysql

# 5. 解压并安装新版
tar -xf mysql-server_8.4.4...
sudo dpkg -i ... # 同上顺序

# 6. 启动并验证
sudo systemctl start mysql
mysql_upgrade -uroot -p  # 如有需要

# 7. 重新锁定
sudo apt-mark hold mysql-server ...

五、安全加固与初始化配置

5.1 首次登录必做

复制代码
# 修改临时密码(必须满足复杂度)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNew@Strong#Pass123';

# 创建应用专用账户(禁止 root 远程)
mysql> CREATE USER 'app_user'@'%' IDENTIFIED BY 'App@Secure#456';
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON app_database.* TO 'app_user'@'%';

# 删除匿名用户和测试库
mysql> DELETE FROM mysql.user WHERE User='';
mysql> DROP DATABASE IF EXISTS test;
mysql> DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
mysql> FLUSH PRIVILEGES;

5.2 配置文件优化

复制代码
# 创建生产配置文件
sudo tee /etc/mysql/mysql.conf.d/99-production.cnf << 'EOF'
[mysqld]
# 基础设置
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
symbolic-links = 0

# 字符集(8.4 默认已 utf8mb4,显式确认)
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

# InnoDB 优化(根据内存调整)
innodb_buffer_pool_size = 4G          # 物理内存的 50-70%
innodb_buffer_pool_instances = 4
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2     # 平衡性能与持久化
innodb_flush_method = O_DIRECT

# 连接设置
max_connections = 500
wait_timeout = 600
interactive_timeout = 600

# 日志配置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 安全设置
local_infile = 0
skip-symbolic-links
require_secure_transport = ON           # 强制 SSL(需配置证书)

# 性能监控
performance_schema = ON
EOF

sudo systemctl restart mysql

六、故障排查速查

现象 诊断命令 解决方案
启动失败 sudo journalctl -u mysql -n 50 检查 /var/log/mysql/error.log
端口冲突 sudo lsof -i :3306 停止冲突服务或修改 port
权限拒绝 sudo ls -la /var/lib/mysql chown -R mysql:mysql
密码遗忘 sudo mysqld --skip-grant-tables 重置 root 密码
远程连接失败 telnet server 3306 检查 bind-address 和防火墙
性能下降 SHOW ENGINE INNODB STATUS 优化 innodb_buffer_pool_size

七、一键安装脚本(待测试)

复制代码
#!/bin/bash
# install-mysql-8.4.3-offline.sh

set -euo pipefail

MYSQL_VERSION="8.4.3"
UBUNTU_CODENAME="noble"  # 24.04
INSTALL_DIR="/opt/mysql-${MYSQL_VERSION}"
DATA_DIR="/var/lib/mysql"

# 颜色输出
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'

log() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }

# 检查 root
[ "$(id -u)" -ne 0 ] && error "请使用 sudo 运行"

# 检查现有 MySQL
if systemctl is-active --quiet mysql 2>/dev/null; then
    warn "检测到运行中的 MySQL,将停止备份"
    mysqldump -uroot -p --all-databases > mysql_backup_$(date +%Y%m%d).sql 2>/dev/null || true
    systemctl stop mysql
fi

# 安装依赖
log "安装基础依赖..."
apt-get update
apt-get install -y libaio1t64 libnuma1 psmisc || error "依赖安装失败"

# 检查离线包
BUNDLE_TAR="mysql-server_${MYSQL_VERSION}-1ubuntu24.04_amd64.deb-bundle.tar"
if [ ! -f "$BUNDLE_TAR" ]; then
    error "未找到 ${BUNDLE_TAR},请从官网下载后放置于当前目录"
fi

# 解压安装
log "解压并安装 MySQL ${MYSQL_VERSION}..."
mkdir -p "$INSTALL_DIR" && cd "$INSTALL_DIR"
tar -xf "/${BUNDLE_TAR}" 2>/dev/null || tar -xf "../${BUNDLE_TAR}"

dpkg -i mysql-common_*.deb \
      mysql-community-client-plugins_*.deb \
      mysql-community-client-core_*.deb \
      mysql-community-client_*.deb \
      mysql-client_*.deb \
      mysql-community-server-core_*.deb \
      mysql-community-server_*.deb \
      mysql-server_*.deb 2>/dev/null || apt-get -f install -y

# 初始化
log "初始化数据目录..."
if [ ! -d "$DATA_DIR/mysql" ]; then
    mysqld --initialize --user=mysql --basedir=/usr --datadir="$DATA_DIR"
    TEMP_PASS=$(grep 'temporary password' /var/log/mysql/error.log | tail -1 | awk -F': ' '{print $NF}')
    log "临时 root 密码: ${TEMP_PASS}"
else
    warn "数据目录已存在,跳过初始化"
fi

# 启动服务
log "启动 MySQL 服务..."
systemctl start mysql
systemctl enable mysql

# 版本验证
INSTALLED_VERSION=$(mysql -V | awk '{print $3}')
log "安装版本: ${INSTALLED_VERSION}"

# 锁定版本
log "锁定版本防止自动升级..."
apt-mark hold mysql-server mysql-community-server mysql-community-client \
              mysql-community-client-core mysql-community-server-core mysql-common

log "安装完成!请执行:"
log "1. 使用临时密码登录: sudo mysql -uroot -p"
log "2. 立即修改密码: ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';"
log "3. 运行安全脚本: sudo mysql_secure_installation"

总结

关键点 操作
版本控制 apt-mark hold + /etc/apt/preferences.d/ 双重锁定
离线部署 官网 bundle tar → dpkg 按序安装 → 初始化 → 启动
安全基线 临时密码 → 强制修改 → 创建应用账户 → 删除匿名用户
配置优化 99-production.cnf 覆盖默认,InnoDB 按内存调优
升级流程 解锁 → 备份 → 安装新版 → 验证 → 重新锁定

本文为同步搬运内容,原创首发于个人独立博客网站:https://www.zheng-chang-ren.xyz

平台更新优先级说明:所有技术笔记、实验教程、踩坑总结均会优先发布、长期维护于个人独立博客;CSDN 仅作为辅助分发渠道。

若想查阅全部完整文集、获取最新首发内容,建议收藏并优先访问我的个人博客网站。