一、二进制部署规范与目录设计
- /opt 与 /usr/local 的定位与区别
/opt:存放独立完整的第三方软件包,单软件独占一个目录,隔离性强,天然支持多版本共存,安装卸载只需操作对应目录/usr/local:全局共享的用户级软件路径,内部按文件类型拆分为 bin/lib/etc 等子目录,默认在系统 PATH 中,适合长期固定版本的全局工具
- 软链接
/usr/local/mysql的核心作用- 统一路径,所有配置、脚本、环境变量无需书写带版本号的长路径
- 实现版本无缝切换与秒级回滚,升级时只需修改软链接指向,无需改动任何业务配置
- 二进制包部署对比 yum/rpm 部署的优势
- 版本完全可控,可自由选择指定小版本
- 目录灵活可控,支持多版本共存
- 不依赖系统软件源,升级降级更自由
必懂原理
为什么不直接把 MySQL 放进/usr/local:多版本容易冲突,升级回滚困难,不符合生产环境「可回滚、可追溯」的运维原则。
二、my.cnf 配置文件核心
- 核心配置段与作用
[mysqld]:服务端核心参数段,数据目录、套接字、运行用户、端口等核心参数均在此配置[mysqld_safe]:守护启动模式的参数段,配置错误日志、PID 文件路径[client]:所有客户端工具的公共配置段,统一套接字路径后,客户端无需每次手动指定
- 核心参数含义
datadir:数据目录,所有数据库、表、日志、系统表的存储位置,是 MySQL 最核心的目录socket:Unix 套接字文件,本机本地连接不走 TCP 协议,速度更快;服务端与客户端的路径必须一致user=mysql:服务进程以低权限 mysql 用户运行,遵循最小权限安全原则
- 配置文件加载优先级 :
/etc/my.cnf> 基于安装目录的配置 > 用户家目录配置
必懂原理
为什么客户端也要配置 socket 路径:MySQL 客户端默认查找/tmp/mysql.sock,服务端指定到数据目录下后,路径不一致会导致本地连接失败。
三、数据初始化与账号安全
mysqld --initialize的核心作用- 自动创建数据目录、InnoDB 系统表空间、系统数据库(mysql、information_schema 等)、SSL 加密证书
- 生成
root@localhost临时密码,首次登录强制要求修改
- ERROR 1820 报错的含义与解决
- 含义:临时密码已过期,账号仅允许登录,不允许执行任何 SQL 语句
- 解决:执行
ALTER USER USER() IDENTIFIED BY '新密码'完成密码修改
- MySQL 5.7 对比旧版本的初始化变化
- 废弃旧工具
mysql_install_db,统一使用mysqld --initialize - 默认生成随机临时密码,从根源杜绝空密码安全隐患
- 废弃旧工具
必懂原理
为什么要用低权限 mysql 用户运行服务:防止 MySQL 服务被入侵后,攻击者直接拿到服务器 root 权限,是生产环境的标准安全规范。
四、MySQL 启停与进程管理
- 优雅关闭的标准方式 :
mysqladmin -uroot -p shutdown - 为什么不能直接
kill -9杀进程kill -9是强制终止,内存中未刷盘的脏数据会丢失,可能导致表文件损坏、数据不一致mysqladmin shutdown是优雅关闭:停止接收新连接→将内存脏页刷入磁盘→正常关闭所有表文件,保证数据完整无损
mysqld_safe的作用- MySQL 官方推荐的守护启动方式
- 持续监控 mysqld 主进程,服务异常崩溃时自动重启,提升服务可用性
五、systemd 服务化
- 服务化的核心价值:实现开机自启、统一启停命令、进程托管、故障自动重启、状态统一监控
- 服务文件核心配置项含义
Type=forking:MySQL 启动为父子进程 fork 模式,systemd 通过 PID 文件识别真正的主进程PIDFile:必须与 MySQL 配置完全一致,systemd 依靠它追踪服务运行状态Restart=on-failure:服务异常退出时自动重启LimitNOFILE:调高文件句柄限制,解决 MySQL 连接数、表打开数超限的问题
- 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 升级
-
两种主流升级方式对比
升级方式 实现方式 优点 缺点 适用场景 原地升级(In-place) 保留数据目录不变,替换软件二进制包,启动后自动升级系统表 速度快、数据无需迁移、磁盘占用少 回滚有前提条件,兼容性风险相对更高 数据量大、停机时间有限的生产环境 逻辑升级(Logical) 用 mysqldump 导出全量数据,导入新版本实例 最稳妥、兼容性最好、可跨大版本升级 数据量大时速度极慢,停机时间长 数据量小、跨极大版本升级 -
原地升级标准完整流程
- 升级前对数据做全量备份
- 使用 MySQL Shell 执行
checkForServerUpgrade兼容性检查,修复所有不兼容项 - 优雅停止旧版本 MySQL 服务
- 解压新版本二进制包到
/opt,与旧版本物理隔离共存 - 修改软链接
/usr/local/mysql,指向新版本目录 - 更新 systemd 服务文件,执行
daemon-reload重载配置 - 启动新版本服务,8.0.16 及以上版本会自动完成系统表升级
- 验证数据库版本、业务功能、数据完整性
-
升级前两个必做动作:全量数据备份 + 兼容性检查,缺一不可
-
兼容性检查核心维度:保留字冲突、废弃函数与语法、旧时间类型、认证插件变更、系统变量变更
-
8.0 升级的核心版本差异
- 8.0.16 起正式废弃
mysql_upgrade工具,升级动作在服务启动时自动完成 - 默认认证插件从
mysql_native_password变为caching_sha2_password,旧版本客户端可能连接失败 - 默认字符集从 latin1 变为 utf8mb4
- 8.0.16 起正式废弃
必懂原理
- 软链接架构在升级中的价值:实现版本秒级切换,升级失败可立即将软链接切回旧版本目录,实现快速回滚
- 自动升级的底层逻辑:新版本 MySQL 启动时,自动检测数据字典版本,不一致则自动执行数据字典、系统表、sys 库、帮助表的全量升级
- 认证插件兼容方案 :业务旧客户端不兼容时,可临时配置
default_authentication_plugin=mysql_native_password回退,但属于临时方案,长期建议升级客户端