MySQL虚拟机部署需重点配置资源、网络与持久化:内存不低于2GB并禁用swap,磁盘独立且格式化为xfs/ext4,网络用桥接模式;安装需导入RPM仓库并启用mysql:8.0模块;远程连接须修改bind-address、开放防火墙端口并授权用户;快照前必须停止服务,推荐mysqldump逻辑备份。

MySQL 在虚拟机中搭建,本质是普通 Linux 安装流程的复现,但需特别注意资源分配、网络连通性与持久化设计——虚拟机不是“更轻量的服务器”,而是更容易因配置疏忽导致连接失败或数据丢失的环境。
虚拟机基础配置要点(内存、磁盘、网络)
MySQL 对内存敏感,innodb_buffer_pool_size 默认会占系统内存 75%,若虚拟机只配 1GB 内存,MySQL 启动后极易 OOM;磁盘建议用独立虚拟硬盘(非与系统盘共用),格式化为 xfs 或 ext4 并挂载到 /var/lib/mysql;网络推荐桥接模式(Bridged),避免 NAT 下端口转发失效或宿主机无法直连。
- 最低建议:2 核 CPU + 2GB RAM + 20GB 独立磁盘
- 禁用 swap:MySQL 在交换分区频繁读写时性能断崖式下降,运行
sudo swapoff -a并注释/etc/fstab中 swap 行 - 关闭 SELinux 或设为 permissive:否则
mysqld可能因权限拒绝无法绑定 3306 端口
CentOS/RHEL 8+ 安装 MySQL 8.0 的关键步骤
官方不再提供 mysql-community-server 的 yum 仓库默认启用,必须手动导入 GPG 密钥并启用模块流;若跳过这步,yum install mysql-server 会报 “No match for argument”。
- 下载并安装 RPM 仓库包:
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm - 启用 mysql80 模块:
sudo dnf module enable mysql:8.0 - 安装服务:
sudo dnf install mysql-server - 首次启动前先初始化:
sudo mysqld --initialize --skip-grant-tables(仅调试用),生产环境应直接sudo systemctl start mysqld,密码在/var/log/mysqld.log中查找A temporary password
宿主机连不上虚拟机 MySQL 的常见原因
错误现象常是 ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.x.x' (111),90% 以上不是 MySQL 没启,而是防火墙或 bind 地址拦住了。
- 检查 MySQL 是否监听外部地址:
sudo ss -tlnp | grep :3306,若显示127.0.0.1:3306,说明bind-address = 127.0.0.1未改,需在/etc/my.cnf的[mysqld]段落加bind-address = 0.0.0.0 - 开放防火墙端口:
sudo firewall-cmd --permanent --add-port=3306/tcp+sudo firewall-cmd --reload - 确认用户允许远程登录:登录 MySQL 后执行
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
数据持久化与快照陷阱
虚拟机快照(Snapshot)不能替代 MySQL 备份。InnoDB 的事务日志(ib_logfile*)和数据文件(ibdata1)处于中间状态时打快照,恢复后大概率报 Tablespace is missing 或崩溃。
- 停机快照前务必执行:
sudo systemctl stop mysqld,再打快照 - 更安全的做法是用逻辑备份:
mysqldump --all-databases --single-transaction > backup.sql,配合crontab定期导出到宿主机共享目录 - 若用 LVM 或虚拟磁盘快照,需确保 MySQL 已调用
FLUSH TABLES WITH READ LOCK(仅限 MyISAM)或依赖--single-transaction保证一致性
虚拟机里跑 MySQL,最常被忽略的是磁盘 I/O 虚拟化层带来的延迟放大——哪怕宿主机 SSD 很快,虚拟磁盘控制器选错(如 IDE 而非 VirtIO)或未开启 discard 和 io_uring 支持,INSERT ... SELECT 类操作可能慢 3 倍以上。










