默认官方box不预装MySQL,需通过provision脚本安装配置;否则vagrant up后mysql服务未启用、仅监听127.0.0.1、宿主机无法直连,须设bind-address=0.0.0.0、开3306端口、配remote用户并用private_network模式分配静态IP。

直接用 vagrant up 启动一台预装 MySQL 的 Debian/CentOS 虚拟机,比手动装包、配服务、开端口快得多;但关键不在“能不能跑”,而在“端口通不通”“数据落不落地”“宿主机连不连得上”——这三个点卡住的人最多。
为什么不能直接 vagrant up 就用 MySQL?
默认的官方 box(如 debian/bookworm64 或 centos/7)不带 MySQL。你得在 Vagrantfile 里加 provision 脚本,或用 shell 命令自动安装配置。否则 vagrant ssh 进去后执行 mysql --version 会报 command not found。
常见错误现象:
-
vagrant up成功,但vagrant ssh进去后systemctl status mysql显示 inactive - 宿主机用
mysql -h 192.168.56.10 -P 3306 -u root -p连不上,提示Connection refused - MySQL 启动了,但只监听
127.0.0.1:3306,没放开给虚拟机网卡(如enp0s8)
实操建议:
- 用
shellprovision 方式最轻量,避免引入 Ansible 等额外依赖 - 确保 MySQL 绑定地址设为
0.0.0.0(或注释掉bind-address),并开放3306端口 - 创建一个非 root 用户(如
vagrant),并赋予远程访问权限:GRANT ALL ON *.* TO 'vagrant'@'%' IDENTIFIED BY 'vagrant'; FLUSH PRIVILEGES;
VirtualBox 网络怎么配才能让宿主机连上 MySQL?
必须用 private_network 模式分配静态 IP,不能只靠 NAT + 端口转发——后者容易被 VirtualBox 的 NAT 规则拦截,且调试困难。
在 Vagrantfile 中这样写才可靠:
config.vm.network "private_network", ip: "192.168.56.10" config.vm.network "forwarded_port", guest: 3306, host: 3307, auto_correct: true
说明:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
private_network让虚拟机获得独立局域网 IP,宿主机可直连(无需 SSH 隧道) -
forwarded_port是备用方案:如果 VirtualBox Host-Only 网卡被禁用或驱动异常,仍可通过127.0.0.1:3307访问 -
auto_correct: true防止端口冲突(比如本地已有 MySQL 占了 3306)
容易踩的坑:
- Windows 上 VirtualBox Host-Only 网卡被禁用 → 打开“网络连接”,右键启用对应适配器
- macOS 上防火墙拦截入站连接 →
System Settings → Network → Firewall Options → Allow incoming connections for MySQL - Debian 12+ 默认用
mariadb-server替代mysql-server,包名和配置路径不同
如何验证 MySQL 数据真正持久化?
很多人以为 vagrant reload 后表还在就等于持久化,其实不是——默认的 /vagrant 同步目录是临时挂载,重启后文件可能丢失;MySQL 数据目录(如 /var/lib/mysql)必须在虚拟机磁盘内,且不能放在同步目录下。
实操建议:
- 不要把
datadir改到/vagrant/mysql-data,那是 NFS 挂载点,不稳定 - 用
vagrant plugin install vagrant-disksize扩容磁盘(默认只有 10GB),避免mysqld因空间满崩溃 - 测试方法:建库插入数据 →
vagrant halt && vagrant up→ 登录查数据是否还在
性能影响:
- VirtualBox 默认磁盘是 VDI 动态分配,IO 较慢;开发环境建议用
v.customize ["sethdtype", :id, "static"]改成固定大小 - MySQL 的
innodb_buffer_pool_size别设太高(比如超过 1GB),虚拟机内存通常只有 2GB
宿主机连不上时,优先查哪三件事?
别一上来就重装 MySQL 或改配置,先快速定位链路断在哪:
- 在虚拟机里执行
ss -tlnp | grep :3306→ 看是否监听0.0.0.0:3306,而不是127.0.0.1:3306 - 在宿主机执行
ping 192.168.56.10→ 不通?说明 VirtualBox Host-Only 网络没起来 - 在宿主机执行
telnet 192.168.56.10 3306或nc -zv 192.168.56.10 3306→ 拒绝连接?说明 MySQL 没监听或防火墙挡了
最容易被忽略的是 MySQL 用户权限里的 'vagrant'@'%' 和 'vagrant'@'192.168.56.%' 的区别——用 % 更稳妥,192.168.56.% 在某些 VirtualBox 版本下会因子网掩码不匹配失效。










