展开代码# 传统 apt 安装的问题 sudo apt install mysql-server # 实际安装的是 Ubuntu 仓库维护的版本,可能: # - 版本滞后(Ubuntu 22.04 默认 MySQL 8.0.35,而非最新 8.4.3) # - 补丁级别不可控(自动更新可能引入未测试的变更) # - 依赖冲突(与现有 Percona/MariaDB 组件不兼容)
| 场景 | 风险 | 离线安装优势 |
|---|---|---|
| 生产环境 | apt upgrade 自动升级导致不兼容 | 版本锁定,变更可控 |
| 内网/隔离环境 | 无外网访问,无法 apt | 提前下载,本地部署 |
| 合规审计 | 需精确版本追溯 | 哈希校验,来源明确 |
| 多节点集群 | 版本必须完全一致 | 统一介质,批量复制 |
| 回滚需求 | 新版本故障需降级 | 保留历史版本安装包 |
展开代码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) └── 仅建议测试环境使用
| 特性 | 说明 | 影响 |
|---|---|---|
| 认证插件变更 | caching_sha2_password 替代 mysql_native_password | 旧客户端需升级或显式配置 |
| 默认字符集 | utf8mb4 全面替代 latin1 | 中文支持更完善,存储增加 |
| InnoDB 改进 | 并行 DDL、优化器增强 | 大表操作性能提升 30%+ |
| JSON 增强 | 多值索引、聚合函数 | 文档型应用场景扩展 |
| 克隆插件 | 物理热备份替代 XtraBackup | 备份架构简化 |
展开代码# 确认系统版本(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-* | 日文全文检索 | 不使用日文搜索可省略,但建议保留 |
展开代码# 方式一:官网直链下载(推荐,可验证签名) 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 # 测试套件(可选)
展开代码# 必须严格按依赖顺序安装,否则 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
展开代码# 方式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
展开代码# 启动服务 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 默认更严格)
展开代码# 防止 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 # ...
展开代码# 创建 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 # 应提示:将保持现状
展开代码# 当需要升级时,按以下流程: # 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 ...
展开代码# 修改临时密码(必须满足复杂度) 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;
展开代码# 创建生产配置文件 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 按内存调优 |
| 升级流程 | 解锁 → 备份 → 安装新版 → 验证 → 重新锁定 |
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!