离线安装特定mysql
2026-02-14
运维
00
请注意,本文编写于 49 天前,最后修改于 5 天前,其中某些信息可能已经过时。

目录

一、为什么需要离线安装特定版本?
1.1 场景分析:apt 安装的隐患
1.2 离线安装的核心价值
二、MySQL 版本选择策略
2.1 MySQL 版本生命周期
2.2 8.4.3 关键特性
三、离线安装完整流程
3.1 环境准备与依赖分析
3.2 获取官方离线安装包
3.3 按依赖顺序安装
3.4 初始化数据目录
3.5 启动与验证
四、版本锁定与防升级策略
4.1 apt 标记保留(关键!)
4.2 配置 apt 自动排除
4.3 升级流程(受控变更)
五、安全加固与初始化配置
5.1 首次登录必做
5.2 配置文件优化
六、故障排查速查
七、一键安装脚本(待测试)
总结

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

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 编码支持

依赖包作用详解

包名功能缺失后果
libaio1t64Linux 原生异步 IOInnoDB 无法初始化,启动失败
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/mysqlchown -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 按内存调优
升级流程解锁 → 备份 → 安装新版 → 验证 → 重新锁定

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!