02_MySQL 安装部署实战 —— RPM/二进制安装、8.0 初始化与 my.cnf 参数调优
系列定位:《MySQL 数据库全栈运维实战系列》第 02 篇,与《Oracle 数据库全栈运维实战系列(VMware 版)》同构对标。适用版本:MySQL 8.0(5.7 差异随文标注)。官方文档:MySQL 8.0 Reference Manual、Installing MySQL on Linux / Initializing the Data Directory。
一、安装方式全景(一张图看懂)
图 1
| 安装方式 | 优点 | 缺点 | 类比 Oracle |
|---|---|---|---|
| RPM/yum | 依赖自动解决、systemd 集成、升级方便 | 路径固定、定制弱 | Oracle RPM 安装 |
| 二进制 tar.gz | 目录自由、多版本并存、不污染系统 | 依赖手动解决 | 解压版 Oracle Home |
| 源码编译 | 可定制编译选项、裁剪功能 | 耗时长、维护成本高 | Oracle 源码编译(罕见) |
| Docker | 环境隔离、秒级拉起 | 生产需额外考虑持久化 | 容器化 Oracle |
生产推荐:RHEL/CentOS 系用RPM 官方仓库(运维最省心);需要多版本并存或自定义路径用二进制通用包。源码编译仅在特殊内核/CPU 指令集调优场景使用。
二、环境准备(VMware 虚机 + Linux)
图 2
2.1 虚机规格建议
| 项 | 最小规格 | 生产建议 | 说明 |
|---|---|---|---|
| vCPU | 2 | 4~8 | MySQL 8.0 对多核友好 |
| 内存 | 2GB | 8GB+ | Buffer Pool 至少 1~2GB |
| 系统盘 | 40GB | 60GB | 操作系统 + 软件 |
| 数据盘 | 50GB | 200GB+ | 建议独立挂载 /data |
| 网卡 | NAT/桥接 | 桥接/仅主机 | 远程连接需固定 IP |
2.2 VMware 注意事项(安装部署相关)
| 项 | 建议 | 原因 |
|---|---|---|
| 磁盘格式 | Thick Eager Zeroed(生产)或 Thin(测试) | Thin 首次写入有延迟抖动;数据库建议厚置备 |
| IO 控制器 | LSI Logic SAS或Paravirtual (VMware Paravirtual) | 对磁盘 IO 性能敏感,IDE 控制器性能差 |
| 磁盘模式 | 独立 & 持久(Independent - Persistent) | 防止快照回滚时数据盘一起回滚,保护数据 |
| CPU 虚拟化 | 开启 VT-x/AMD-V,虚机 CPU 勾选"虚拟化 Intel VT-x" | MySQL 不需要嵌套虚拟化,但需要硬件虚拟化支持 |
| 时间同步 | VMware Tools 开启时间同步 + 宿主机 NTP | 数据库时间漂移会导致 binlog/复制时间错乱 |
| VMware Tools | 必须安装并运行 | 时间同步、网卡性能、关机优雅 |
| 内存预留 | 预留所有客户机内存(Reserve all guest memory) | 避免内存交换到磁盘导致数据库性能骤降 |
| 快照策略 | 安装完系统+MySQL 后做一次干净快照,之后业务盘不随快照回滚 | 快照回滚会导致 binlog 位点断裂、主从复制错乱 |
2.3 操作系统准备(root 执行)
图 3
# 解释:主机名与 hosts 解析(MySQL 8.0 初始化会用到 hostname) hostnamectl set-hostname mysql01 echo "192.168.10.60 mysql01.example.com mysql01" >> /etc/hosts # 解释:关闭防火墙(测试环境;生产建议放行 3306 端口) systemctl stop firewalld && systemctl disable firewalld # 解释:SELinux 设为 permissive 或 disabled(生产建议配好策略而非直接关) setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config # 解释:创建 mysql 用户和组(MySQL 官方 RPM 会自动创建,二进制安装需手动) groupadd -r mysql useradd -r -g mysql -s /sbin/nologin mysql # 解释:资源限制(MySQL 需要大量文件句柄) cat > /etc/security/limits.d/mysql.conf << 'EOF' mysql soft nofile 65535 mysql hard nofile 65535 mysql soft nproc 65535 mysql hard nproc 65535 mysql soft stack 10240 mysql hard stack 32768 EOF # 解释:关闭透明大页(THP 会导致 MySQL 性能抖动) echo never > /sys/kernel/mm/transparent_hugepage/enabled # 永久生效:在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 追加 transparent_hugepage=never # 然后执行 grub2-mkconfig -o /boot/grub2/grub.cfg # 解释:磁盘调度器(SSD 建议 none/mq-deadline) echo none > /sys/block/sdb/queue/scheduler2.4 目录规划(OFA 风格)
| 目录 | 用途 | 类比 Oracle |
|---|---|---|
| /usr/local/mysql | 软件安装目录(二进制) | ORACLE_HOME |
| /data/mysql | 数据目录 datadir | ORACLE_BASE/oradata |
| /data/mysql/binlog | binlog 目录 | 归档日志目录 |
| /data/mysql/redo | redo log 目录 | redo 日志 |
| /backup/mysql | 备份目录 | FRA |
| /etc/my.cnf | 配置文件 | spfile/pfile |
mkdir -p /data/mysql /data/mysql/binlog /data/mysql/redo /backup/mysql chown -R mysql:mysql /data/mysql /backup/mysql chmod 750 /data/mysql三、RPM 包安装(推荐生产方式)
图 4
3.1 添加 MySQL 官方 YUM 仓库
# 解释:下载 MySQL 8.0 官方 yum 仓库配置(RHEL/CentOS 8/9) # 官方仓库选择页面:https://dev.mysql.com/downloads/repo/yum/ dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm # RHEL/CentOS 7 用: # yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 解释:验证仓库已启用 dnf repolist enabled | grep mysql3.2 安装 MySQL Server
# 解释:安装 mysql-community-server(会自动拉取 client、common、libs 等依赖包) dnf install -y mysql-community-server # 解释:查看安装版本 mysql --version # 输出示例:mysql Ver 8.0.xx for Linux on x86_64 (MySQL Community Server - GPL)3.3 RPM 安装后的自动初始化
RPM 包首次启动systemctl start mysqld时会自动:
- 创建数据目录
/var/lib/mysql - 生成 SSL/RSA 证书
- 初始化数据字典
- 生成临时 root 密码(写入 error log)
# 解释:启动 MySQL 服务 systemctl start mysqld systemctl enable mysqld # 解释:查看临时 root 密码(8.0 安装后必须先改密码才能操作) grep 'temporary password' /var/log/mysqld.log # 输出示例:A temporary password is generated for root@localhost: xxxxxxxx-- 解释:用临时密码登录后,必须先改密码(8.0 默认密码策略强) ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass_2026!'; -- 解释:验证密码策略(8.0 默认 MEDIUM:长度≥8、含数字/大小写/特殊字符) SHOW VARIABLES LIKE 'validate_password%';5.7 差异:5.7 安装后 root 密码为空(
--initialize-insecure),或临时密码在 error log;8.0 统一为临时密码机制,且默认认证插件变为caching_sha2_password。
四、二进制通用包安装(多版本并存首选)
图 5
4.1 下载与解压
# 解释:从 https://dev.mysql.com/downloads/mysql/ 下载 Generic Linux (x86, 64-bit), Compressed TAR Archive # 以 mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz 为例 cd /usr/local tar xJf /tmp/mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz # 解释:创建软链接方便升级切换 ln -s mysql-8.0.39-linux-glibc2.28-x86_64 mysql # 解释:属主改为 mysql chown -R mysql:mysql /usr/local/mysql-8.0.39-linux-glibc2.28-x86_644.2 依赖检查
# 解释:二进制包需要 libaio、ncurses 等依赖 dnf install -y libaio libaio-devel ncurses-compat-libs numactl-libs # RHEL/CentOS 8+ 还需要 libtirpc4.3 初始化数据目录(关键步骤)
# 解释:mysqld --initialize 会创建数据目录并生成临时 root 密码 # --user=mysql 指定运行用户 # --datadir 指定数据目录(必须为空或不存在) # --basedir 指定软件目录 cd /usr/local/mysql bin/mysqld --initialize --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/mysql # 解释:如果不想生成临时密码(5.7 风格空密码),用 --initialize-insecure # 生产环境强烈建议用 --initialize(有临时密码) # 解释:查看临时密码 grep 'temporary password' /data/mysql/*.err # 或指定日志路径时查看 error log4.4 配置 systemd 服务
# /etc/systemd/system/mysqld.service [Unit] Description=MySQL 8.0 Server After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=65535 Restart=on-failure [Install] WantedBy=multi-user.targetsystemctl daemon-reload systemctl start mysqld systemctl enable mysqld五、源码编译安装(了解即可,生产极少用)
# 解释:源码编译需要 cmake、gcc、ncurses-devel # 仅在需要自定义编译选项(如 -DWITH_UBSAN=OFF、特定 CPU 架构优化)时使用 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci make -j$(nproc) make install结论:源码编译耗时长(30~60 分钟)、升级维护成本高,生产环境除非有特殊裁剪需求,否则不推荐。
六、my.cnf 核心参数详解(官方:Server System Variables)
6.1 配置文件结构
# /etc/my.cnf(MySQL 8.0 官方示例配置文件) [mysqld] # ===== 基本 ===== user = mysql basedir = /usr/local/mysql datadir = /data/mysql port = 3306 socket = /data/mysql/mysql.sock pid-file = /data/mysql/mysql.pid # ===== 字符集(8.0 默认 utf8mb4)===== character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci # ===== 内存 ===== innodb_buffer_pool_size = 2G # 解释:Buffer Pool,建议物理内存 60~70% innodb_log_buffer_size = 64M # redo 缓冲 max_connections = 500 # 最大连接数 table_open_cache = 4096 table_definition_cache = 2048 # ===== InnoDB ===== default_storage_engine = InnoDB innodb_flush_log_at_trx_commit = 1 # 解释:1=每次事务 commit 刷 redo(最安全) innodb_flush_method = O_DIRECT # 解释:绕过 OS 缓存,直接 IO(生产推荐) innodb_file_per_table = ON # 解释:每表独立 .ibd 文件(8.0 默认 ON) innodb_redo_log_capacity = 2G # 解释:8.0.30+ 统一 redo 容量(替代 innodb_log_file_size) # ===== binlog ===== log_bin = /data/mysql/binlog/mysql-bin binlog_format = ROW # 解释:ROW 模式最安全 binlog_row_image = FULL expire_logs_days = 7 # 解释:binlog 保留 7 天(8.0 也可用 binlog_expire_logs_seconds) max_binlog_size = 1G # ===== 慢查询日志 ===== slow_query_log = ON slow_query_log_file = /data/mysql/slow.log long_query_time = 1 # 解释:超过 1 秒记录慢查询 log_queries_not_using_indexes = ON # ===== 日志 ===== log_error = /data/mysql/error.log log_timestamps = SYSTEM [client] socket = /data/mysql/mysql.sock default-character-set = utf8mb46.2 关键参数速查表
| 参数 | 推荐值 | 说明 | 类比 Oracle |
|---|---|---|---|
| innodb_buffer_pool_size | 物理内存 60~70% | InnoDB 数据页缓存 | DB Cache Size / SGA |
| innodb_flush_log_at_trx_commit | 1 | 事务持久化保证 | REDO 同步写 |
| sync_binlog | 1 | binlog 刷盘策略(1=最安全) | 归档同步 |
| innodb_flush_method | O_DIRECT | 绕过 OS page cache | direct IO |
| max_connections | 500~2000 | 最大并发连接 | sessions/processes |
| innodb_redo_log_capacity | 1~4G | redo 总容量 | redo log size |
| tmp_table_size / heap_table_size | 64M~256M | 临时表内存上限 | pga |
| slow_query_log | ON | 慢查询开关 | audit/trace |
双 1 安全配置:
innodb_flush_log_at_trx_commit=1+sync_binlog=1= 最高数据安全级别,生产必备(性能与安全的平衡点)。
七、初始化后必做配置
图 6
7.1 修改 root 密码与远程登录
-- 解释:8.0 默认 root 只允许 localhost 登录 ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root_2026!'; -- 解释:创建远程管理用户(生产建议限制来源 IP) CREATE USER 'dba'@'192.168.10.%' IDENTIFIED BY 'Dba_2026!'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'192.168.10.%' WITH GRANT OPTION;7.2 业务库与用户创建
-- 解释:创建业务库,指定字符集 CREATE DATABASE appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- 解释:创建业务账号(最小权限原则) CREATE USER 'appuser'@'192.168.10.%' IDENTIFIED BY 'App_2026!'; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'192.168.10.%'; FLUSH PRIVILEGES;7.3 验证安装
# 解释:服务状态 systemctl status mysqld # 解释:端口监听 ss -tlnp | grep 3306 # 解释:登录验证 mysql -u root -p -e "SELECT VERSION();" mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';" mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"| 验证项 | 期望结果 |
|---|---|
| systemctl status mysqld | active (running) |
| ss -tlnp | 3306 端口 LISTEN |
| SELECT VERSION() | 8.0.xx |
| datadir | /data/mysql |
| default_storage_engine | InnoDB |
| character_set_server | utf8mb4 |
八、源码 vs 二进制 vs RPM 对比总结
| 维度 | RPM | 二进制 tar.gz | 源码编译 |
|---|---|---|---|
| 安装速度 | 分钟级 | 分钟级 | 30~60 分钟 |
| 依赖处理 | 自动 | 手动 | 手动 |
| systemd 集成 | 自动 | 需手写 service | 需手写 service |
| 路径灵活性 | 固定 /var/lib/mysql | 完全自定义 | 完全自定义 |
| 多版本并存 | 困难 | 容易(软链接切换) | 容易 |
| 升级方式 | dnf update | 替换目录+重启 | 重新编译 |
| 生产推荐度 | ★★★★★ | ★★★★ | ★★ |
九、踩坑记录(实测汇总)
| # | 坑 | 现象 | 解决 | |
|---|---|---|---|---|
| 1 | 忘记取临时密码 | 登录被拒,不知道密码 | grep 'temporary password' /var/log/mysqld.log | |
| 2 | 密码策略太严 | 改密码报 ERROR 1819 | 密码含大小写+数字+特殊字符,长度≥8 | |
| 3 | datadir 非空 | initialize 报错已存在文件 | 清空 datadir 或换目录后重新 initialize | |
| 4 | 目录属主错误 | 启动报 Permission denied | chown -R mysql:mysql 数据目录 | |
| 5 | 端口被占 | 启动报 Can't start server: Bind on TCP/IP port | `ss -tlnp \ | grep 3306` 找占用进程 |
| 6 | 缺 libaio | 二进制启动报错 error while loading shared libraries | dnf install libaio | |
| 7 | THP 未关 | 性能抖动、延迟毛刺 | grub 加 transparent_hugepage=never | |
| 8 | VMware 磁盘随快照回滚 | 数据盘回滚后 binlog 位点错乱 | 数据盘设为 Independent - Persistent | |
| 9 | 时间不同步 | binlog 时间戳错乱、复制延迟 | 安装 VMware Tools + 开启时间同步 | |
| 10 | my.cnf 缩进错误 | 启动报错 unknown variable | my.cnf 参数不缩进,顶格写 | |
| 11 | max_connections 太小 | 应用报 Too many connections | 按业务容量调整 + 应用侧连接池 | |
| 12 | 5.7 升到 8.0 字符集 | 中文乱码 | 8.0 默认 utf8mb4,5.7 默认 latin1,迁移需统一 |
十、要点速记
- 三种安装方式:RPM(生产首选)、二进制(多版本并存)、源码(定制编译,极少用)。
- 8.0 初始化关键:
mysqld --initialize生成临时密码,首次登录必须改密码。 - my.cnf 核心三件套:
innodb_buffer_pool_size(内存)、innodb_flush_log_at_trx_commit=1(安全)、sync_binlog=1(安全)。 - VMware 注意:数据盘独立持久、关闭 THP、时间同步、内存预留。
- 5.7→8.0 差异:默认认证插件变为 caching_sha2_password、默认字符集变为 utf8mb4、数据字典统一管理。
十一、参考资料(官方正式文档)
| 主题 | 官方链接 |
|---|---|
| MySQL 8.0 Reference Manual | https://dev.mysql.com/doc/refman/8.0/en/ |
| Installing MySQL on Linux Using RPM Packages | https://dev.mysql.com/doc/refman/8.0/en/linux-installation-rpm.html |
| Installing MySQL on Linux Using Generic Binaries | https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html |
| Initializing the Data Directory | https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html |
| Server System Variables (my.cnf 参数) | https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html |
| MySQL 8.0 YUM Repository | https://dev.mysql.com/downloads/repo/yum/ |
| MySQL 8.0 Download (Generic Linux) | https://dev.mysql.com/downloads/mysql/ |
本文章属于《MySQL 数据库全栈运维实战系列》基础与架构篇。欢迎收藏、交流。