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 倍以上。
