MySQL 部署与升级

一、二进制部署规范与目录设计

  1. /opt 与 /usr/local 的定位与区别
    • /opt:存放独立完整的第三方软件包,单软件独占一个目录,隔离性强,天然支持多版本共存,安装卸载只需操作对应目录
    • /usr/local:全局共享的用户级软件路径,内部按文件类型拆分为 bin/lib/etc 等子目录,默认在系统 PATH 中,适合长期固定版本的全局工具
  2. 软链接 /usr/local/mysql 的核心作用
    • 统一路径,所有配置、脚本、环境变量无需书写带版本号的长路径
    • 实现版本无缝切换与秒级回滚,升级时只需修改软链接指向,无需改动任何业务配置
  3. 二进制包部署对比 yum/rpm 部署的优势
    • 版本完全可控,可自由选择指定小版本
    • 目录灵活可控,支持多版本共存
    • 不依赖系统软件源,升级降级更自由

必懂原理

为什么不直接把 MySQL 放进/usr/local:多版本容易冲突,升级回滚困难,不符合生产环境「可回滚、可追溯」的运维原则。


二、my.cnf 配置文件核心

  1. 核心配置段与作用
    • [mysqld]:服务端核心参数段,数据目录、套接字、运行用户、端口等核心参数均在此配置
    • [mysqld_safe]:守护启动模式的参数段,配置错误日志、PID 文件路径
    • [client]:所有客户端工具的公共配置段,统一套接字路径后,客户端无需每次手动指定
  2. 核心参数含义
    • datadir:数据目录,所有数据库、表、日志、系统表的存储位置,是 MySQL 最核心的目录
    • socket:Unix 套接字文件,本机本地连接不走 TCP 协议,速度更快;服务端与客户端的路径必须一致
    • user=mysql:服务进程以低权限 mysql 用户运行,遵循最小权限安全原则
  3. 配置文件加载优先级/etc/my.cnf > 基于安装目录的配置 > 用户家目录配置

必懂原理

为什么客户端也要配置 socket 路径:MySQL 客户端默认查找/tmp/mysql.sock,服务端指定到数据目录下后,路径不一致会导致本地连接失败。


三、数据初始化与账号安全

  1. mysqld --initialize 的核心作用
    • 自动创建数据目录、InnoDB 系统表空间、系统数据库(mysql、information_schema 等)、SSL 加密证书
    • 生成root@localhost临时密码,首次登录强制要求修改
  2. ERROR 1820 报错的含义与解决
    • 含义:临时密码已过期,账号仅允许登录,不允许执行任何 SQL 语句
    • 解决:执行 ALTER USER USER() IDENTIFIED BY '新密码' 完成密码修改
  3. MySQL 5.7 对比旧版本的初始化变化
    • 废弃旧工具mysql_install_db,统一使用mysqld --initialize
    • 默认生成随机临时密码,从根源杜绝空密码安全隐患

必懂原理

为什么要用低权限 mysql 用户运行服务:防止 MySQL 服务被入侵后,攻击者直接拿到服务器 root 权限,是生产环境的标准安全规范。


四、MySQL 启停与进程管理

  1. 优雅关闭的标准方式mysqladmin -uroot -p shutdown
  2. 为什么不能直接 kill -9 杀进程
    • kill -9 是强制终止,内存中未刷盘的脏数据会丢失,可能导致表文件损坏、数据不一致
    • mysqladmin shutdown 是优雅关闭:停止接收新连接→将内存脏页刷入磁盘→正常关闭所有表文件,保证数据完整无损
  3. mysqld_safe 的作用
    • MySQL 官方推荐的守护启动方式
    • 持续监控 mysqld 主进程,服务异常崩溃时自动重启,提升服务可用性

五、systemd 服务化

  1. 服务化的核心价值:实现开机自启、统一启停命令、进程托管、故障自动重启、状态统一监控
  2. 服务文件核心配置项含义
    • Type=forking:MySQL 启动为父子进程 fork 模式,systemd 通过 PID 文件识别真正的主进程
    • PIDFile:必须与 MySQL 配置完全一致,systemd 依靠它追踪服务运行状态
    • Restart=on-failure:服务异常退出时自动重启
    • LimitNOFILE:调高文件句柄限制,解决 MySQL 连接数、表打开数超限的问题
  3. systemctl 核心命令与原理
    • systemctl daemon-reload:修改.service 文件后必须执行,用于重载 systemd 的配置缓存
    • systemctl enable:设置开机自启,本质是在multi-user.target.wants目录下创建服务文件软链接
    • systemctl start/stop/status:服务启停、状态查看

必懂原理

systemctl enable的底层逻辑:在/etc/systemd/system/multi-user.target.wants下创建服务文件的软链接,系统进入多用户运行模式时,自动启动该目录下的所有服务。


六、MySQL 5.7→8.0 升级

  1. 两种主流升级方式对比

    升级方式 实现方式 优点 缺点 适用场景
    原地升级(In-place) 保留数据目录不变,替换软件二进制包,启动后自动升级系统表 速度快、数据无需迁移、磁盘占用少 回滚有前提条件,兼容性风险相对更高 数据量大、停机时间有限的生产环境
    逻辑升级(Logical) 用 mysqldump 导出全量数据,导入新版本实例 最稳妥、兼容性最好、可跨大版本升级 数据量大时速度极慢,停机时间长 数据量小、跨极大版本升级
  2. 原地升级标准完整流程

    1. 升级前对数据做全量备份
    2. 使用 MySQL Shell 执行checkForServerUpgrade兼容性检查,修复所有不兼容项
    3. 优雅停止旧版本 MySQL 服务
    4. 解压新版本二进制包到/opt,与旧版本物理隔离共存
    5. 修改软链接/usr/local/mysql,指向新版本目录
    6. 更新 systemd 服务文件,执行daemon-reload重载配置
    7. 启动新版本服务,8.0.16 及以上版本会自动完成系统表升级
    8. 验证数据库版本、业务功能、数据完整性
  3. 升级前两个必做动作:全量数据备份 + 兼容性检查,缺一不可

  4. 兼容性检查核心维度:保留字冲突、废弃函数与语法、旧时间类型、认证插件变更、系统变量变更

  5. 8.0 升级的核心版本差异

    • 8.0.16 起正式废弃mysql_upgrade工具,升级动作在服务启动时自动完成
    • 默认认证插件从mysql_native_password变为caching_sha2_password,旧版本客户端可能连接失败
    • 默认字符集从 latin1 变为 utf8mb4

必懂原理

  1. 软链接架构在升级中的价值:实现版本秒级切换,升级失败可立即将软链接切回旧版本目录,实现快速回滚
  2. 自动升级的底层逻辑:新版本 MySQL 启动时,自动检测数据字典版本,不一致则自动执行数据字典、系统表、sys 库、帮助表的全量升级
  3. 认证插件兼容方案 :业务旧客户端不兼容时,可临时配置default_authentication_plugin=mysql_native_password回退,但属于临时方案,长期建议升级客户端