一、为什么需要离线安装特定版本?
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 仅作为辅助分发渠道。
若想查阅全部完整文集、获取最新首发内容,建议收藏并优先访问我的个人博客网站。