搞前后端分离项目,最绕不开的就是数据库这一环。Spring Boot + Vue 这套组合拳打下来,业务逻辑再漂亮,数据没地方存也是白搭。我这次要安装的就是 MySQL,也是整个部署系列里最基础的环节。这篇文章就专门聊清楚 MySQL 的安装与初始化,涵盖 Windows 和 Linux 两种主流环境,从版本选择、安装步骤、初始化配置到字符集设置、远程访问授权,全套走一遍。无论你是本地开发环境需要装数据库,还是服务器上线前要搭运行环境,这套流程都能直接照着抄。
1. 安装前的版本选择与部署规划
1.1 为什么推荐 MySQL 8.0 而不是 5.7
先说一个很多人纠结的问题:到底装 MySQL 8.0 还是 5.7?我的建议是,新项目直接上 8.0,不要犹豫。
原因很简单,Spring Boot 2.6+ 的官方驱动mysql-connector-java已经对 8.0 做了完整适配,驱动类名从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver。如果你装 5.7,虽然也能用,但后续要升级就得动配置、动依赖,麻烦事一堆。
另外一个关键点是字符集。MySQL 8.0 的默认字符集是utf8mb4,而 5.7 的默认字符集是latin1。这区别有多大?举个例子,utf8mb4支持 emoji 表情和生僻字,而latin1连中文都存不利索。你总不希望用户注册个昵称,带个 emoji 就报错吧。
1.2 版本号怎么选
这里有个小坑,不是所有 8.0 的版本号都是一样的,比如 8.0.28、8.0.30、8.0.36。我的选择标准是:不要追最新,要选稳定。
MySQL 的版本发布逻辑里,.0 的版本(比如 8.0.0)都是功能版本,bug 率偏高;.5.xx 之后的版本则是修订版,稳定性更好。我个人推荐选 8.0.36 之后的版本,因为这几个版本解决了大量已知 bug,尤其是主从复制和高并发场景下的性能问题,对生产环境比较友好。
2. Linux 服务器安装 MySQL(以 CentOS 7 为例)
2.1 确认系统环境
生产环境大部分都是 Linux,我这里以最常用的 CentOS 7 为例做演示。在开始安装前,先检查一下系统的版本和架构:
cat /etc/redhat-release uname -m确认是x86_64架构之后,再确认系统时间是不是准确的,因为 MySQL 依赖时间戳做日志记录和数据同步,时间不对会在后续排查时造成很多误导。
2.2 下载并安装 RPM 包
CentOS 7 自带的 yum 源里的 MySQL 版本太旧,而且会和其他组件产生依赖冲突。我建议直接用 MySQL 官方 yum 源,流程如下:
# 下载 MySQL 官方 yum 源 RPM 包 wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 安装 yum 源 rpm -ivh mysql80-community-release-el7-11.noarch.rpm # 清理缓存并安装 mysql-community-server yum clean all yum install -y mysql-community-server这一步下载时间比较长,因为 MySQL 的服务端程序有好几百兆,建议在网络稳定的环境下操作。如果下载速度特别慢,可以考虑换一个国内镜像源。
2.3 启动服务并查看状态
安装完成之后,先别急着初始化,先把服务启起来。这一步有个细节,MySQL 8.0 安装完之后,会自动生成一个临时 root 密码,存在日志文件里。我们启动完服务之后,第一步就是去拿这个临时密码:
# 启动 MySQL 服务 systemctl start mysqld # 查看服务状态,一定要是 active (running) systemctl status mysqld # 查看临时密码 grep 'temporary password' /var/log/mysqld.log临时密码长这样:root@localhost: xxxxxxxx。这个密码要立刻记下来,因为你后面所有操作都建立在能登录 root 账号的基础上。要是忘了,后面还得重置,会很麻烦。
2.4 初始化安全设置
拿到密码之后,执行 MySQL 自带的安全配置命令:
mysql_secure_installation这个命令是交互式的,会依次问你是否要修改 root 密码、是否删除匿名用户、是否禁止 root 远程登录等,建议全部选 Y。重点说一下密码强度的问题,MySQL 8.0 的默认密码策略是validate_password,要求密码必须包含大写字母、小写字母、数字和特殊字符,长度至少 8 位。千万别想偷懒设个简单密码,过不了校验,浪费时间。
2.5 设置 MySQL 开机自启
systemctl enable mysqld这一步很重要。如果你忘了执行,系统重启之后 MySQL 不会自动启动,到时候你的 Spring Boot 项目连不上数据库,排查起来会很痛苦。
3. Windows 环境安装与配置(开发机场景)
3.1 安装方式选择
很多人在本地开发时用 Windows,装 MySQL 有两种主流方式:MSI 安装包和 ZIP 压缩包。
MSI 方式适合新手,图形化界面,下一步下一步就行。ZIP 方式适合需要快速部署多套环境、或者想要保留数据文件独立管理的人。我用得最多的是 ZIP 方式,因为可以同时验证多个 MySQL 版本,互不干扰。
3.2 ZIP 包安装步骤
步骤如下:
- 解压到指定目录,比如
D:\mysql-8.0.36-winx64 - 在目录下新建
my.ini配置文件,这一步很多人会漏,不建这个文件 MySQL 启动就会报错。内容参考:
[mysqld] port=3306 basedir=D:/mysql-8.0.36-winx64 datadir=D:/mysql-8.0.36-winx64/data character-set-server=utf8mb4 default-authentication-plugin=mysql_native_password这里有几个参数值得解释一下。datadir是数据文件存储目录,建议建在单独的磁盘分区;default-authentication-plugin是认证插件,8.0 默认是caching_sha2_password,但有些老的客户端工具不兼容,先改成mysql_native_password更稳。
- 以管理员身份打开 CMD,进入 MySQL 的
bin目录,执行:
mysqld --initialize-insecure--initialize-insecure的意思是初始化一个 root 密码为空的数据目录。用这个参数比--initialize方便,因为它不会给你生临时密码,少一个查日志的环节。
- 安装并启动服务:
mysqld --install mysql84 net start mysql84这里的mysql84是服务名称,可以随便起。如果你电脑上有多个 MySQL 实例,建议把服务名也带上版本号,方便区分,比如mysql8036。
3.3 登录并修改密码
mysql -u root -p密码为空,直接回车就能进去。进去之后第一件事就是改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码'; FLUSH PRIVILEGES;4. 数据库初始化与字符集配置
4.1 为什么字符集必须统一
这一步我要多说两句,因为这是整个数据库部署过程中最容易埋坑的地方。前后端项目的所有文本信息,包括用户名、评论内容、商品描述,都可能包含中文和 emoji 表情,如果数据库是latin1或utf8,会导致两个严重后果:一个是中文乱码,一个是插入 emoji 直接报错。
解决方案就是全链路使用utf8mb4。检查字符集是否一致的命令:
SHOW VARIABLES LIKE 'character_set%';如果看到character_set_server不是utf8mb4,在 MySQL 8.0 里这样改:
SET GLOBAL character_set_server = utf8mb4; SET GLOBAL collation_server = utf8mb4_general_ci;但如果想让这个配置持久化,建议直接写到配置文件里,Windows 改my.ini,Linux 改/etc/my.cnf:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci改完配置文件记得重启 MySQL,不然不生效。
4.2 创建 Spring Boot 专用账号
这里说一点我自己的习惯,绝对建议效仿:不要用 root 账号直接连业务数据库。因为 root 权限太大了,一旦应用被注入,整个数据库都完蛋。单独建一个专用账号,只授予这个账号操作业务数据库的权限,即使出问题,波及范围也就限制在业务库里。
-- 创建数据库 CREATE DATABASE springboot_vue DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 创建专用账号 CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'AppPass@123'; -- 授权 GRANT ALL PRIVILEGES ON springboot_vue.* TO 'appuser'@'localhost'; FLUSH PRIVILEGES;这两段 SQL 里,springboot_vue就是你的业务数据库名,appuser是应用账号。注意看授权语句,springboot_vue.*的意思是把springboot_vue这个库下所有表的权限都授权给这个账号,但只限这个库,其他库还是没权限。
5. 配置远程访问权限(服务器部署必做)
5.1 开启远程访问的必要条件
本地开发不用考虑远程访问,但你的 Spring Boot 应用如果部署在另一台服务器上,数据库在另外一台服务器上,跨服务器的连接就必须开远程访问权限。
开启远程访问要满足三个条件:
- MySQL 用户表里有允许非 localhost 登录的账号记录
- MySQL 监听的端口是 0.0.0.0 而不是 127.0.0.1
- 防火墙放行了 3306 端口
这三个条件缺一不可,很多人在排查连接不上的问题时就卡在这个逻辑上。
5.2 授权远程登录账号
登录 MySQL 之后,创建或者修改一个允许所有 IP 登录的账号:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPass@123'; GRANT ALL PRIVILEGES ON springboot_vue.* TO 'appuser'@'%'; FLUSH PRIVILEGES;注意这里的'%',意思是不限 IP。如果想限制固定 IP,替换成具体 IP,比如'192.168.1.100',这样安全性会好很多。
5.3 检查 MySQL 监听地址
MySQL 8.0 默认监听所有网卡,但如果你在 my.cnf 里手动指定了bind-address=127.0.0.1,那就只能本机连接了。检查命令:
netstat -tlnp | grep 3306如果看到0.0.0.0:3306,说明监听正常。如果是127.0.0.1:3306,需要改配置文件,删掉这行配置,重启 MySQL。
5.4 防火墙放行
以 CentOS 7 为例,放行 3306 端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload如果是云服务器,还得在云控制台的安全组里也放行 3306 端口。这一步很容易漏,很多人折腾半天,最后发现是安全组没配。
5.5 Spring Boot 连接串配置参考
配置好远程访问权限之后,Spring Boot 项目里的application.yml按如下方式配置:
spring: datasource: url: jdbc:mysql://数据库服务器IP:3306/springboot_vue?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai&useSSL=false username: appuser password: AppPass@123 driver-class-name: com.mysql.cj.jdbc.Driver这里几个参数再展开解释一下:
serverTimezone=Asia/Shanghai不设的话,MySQL 驱动会报警告,而且时间字段会差 8 小时useSSL=false是关闭 SSL 连接,因为内网部署没必要加密,开着反而影响性能useUnicode=true&characterEncoding=utf8mb4是告诉驱动以 utf8mb4 编码传输数据,防止中文乱码
这个配置文件改完之后,Spring Boot 应用在启动时就能正常连上数据库了。
6. MySQL 8.0 常见问题排查与避坑清单
6.1 密码策略强制校验问题
MySQL 8.0 安装后默认密码策略比较严格,必须包含大写、小写、数字、特殊字符,长度至少 8 位。这个策略的本意是提升安全,但在开发环境里确实烦人。
如果开发环境想降低密码强度,可以这样改:
SET GLOBAL validate_password.policy = LOW; SET GLOBAL validate_password.length = 4;但这个方法只在当前会话生效,重启 MySQL 就失效了。要永久修改,建议改配置文件:
[mysqld] validate_password.policy=LOW validate_password.length=46.2 服务启动失败与端口占用
启动失败最常见的原因是 3306 端口被占。排查思路:
netstat -tlnp | grep 3306如果发现端口被别的服务占用,最省事的方法就是换端口,比如改成 3307。然后记得同步修改 Spring Boot 的配置文件。
6.3 连接超时 / 拒绝连接
这个问题的排查路径我总结了四步,按顺序来:
- ping 一下数据库服务器 IP,确认网络通不通
- telnet IP 3306,确认端口通不通
- 检查 MySQL 用户表,确认账号是否存在、 host 匹配是否正确
- 检查密码是否正确
按这个顺序排查,90% 的连接问题都能解决。还记得我之前说的三个条件吗?用户表、监听地址、防火墙,一个环节出问题都会连不上。
6.4 中文乱码问题
数据能写入但读出来乱码,问题通常不在 MySQL,而在 Spring Boot 应用的连接字符串上。重点检查characterEncoding=utf8mb4参数是否加上了。同时检查一下 MySQL 服务端的字符集配置:
SHOW VARIABLES LIKE 'collation%';另一个经常被忽略的坑是:表的字符集和数据库的字符集不一致。比如数据库是 utf8mb4,表是创建时用了默认的 latin1。修复指定表:
ALTER TABLE user_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;6.5 时区相差 8 小时问题
这个坑太经典了。查数据发现时间字段比实际时间早了或者晚了 8 个小时,原因就是服务器时区和数据库时区不一致。
两个层面检查:
- MySQL 时区:
SELECT NOW(); - 服务器的系统时区:
date
Spring Boot 连接串里加上了serverTimezone=Asia/Shanghai之后,这类问题基本不会再出现。
7. 数据库备份与后期运维建议
7.1 定时备份策略
数据是无价的,尤其是业务上线之后。我的建议是每天凌晨做一次物理备份,保留最近 7 天的备份文件。用 crontab 实现:
0 2 * * * mysqldump -u appuser -p'AppPass@123' springboot_vue > /backup/db_$(date +%Y%m%d).sql如果数据量比较大,建议做物理备份(直接拷贝数据目录),恢复速度比逻辑备份快很多。
7.2 日志检查
MySQL 的错误日志默认在/var/log/mysqld.log,隔段时间看一下,能发现很多潜在问题。比如磁盘空间不足、慢查询增多等,都会在日志里有迹可循。
7.3 缓冲池配置(优化)
如果业务量上来了,性能出现瓶颈,优先调这个参数:
[mysqld] innodb_buffer_pool_size = 1G这个参数决定了 InnoDB 引擎能使用多少内存来做数据缓存,默认值只有 128MB,生产环境肯定不够。建议设置为服务器物理内存的 60%~70%,比如服务器是 8G 内存,设为 5G 左右。
数据库装好,只是万里长征第一步。Spring Boot 项目要跑起来,还要配套 Redis、Nginx 这些东西,后面我都会逐步展开。但我实际部署过几次之后,最深的一个体会是:数据库配置这件事,慢就是快。不要急着把服务整起来,而是把字符集、权限、密码策略、时区这些问题在源头上理清楚,后面应用层出问题排查起来会非常顺畅。
最后再分享一个小技巧,安装完成后,记得把初始化和修改留下的 SQL 历史记录清理一下,生产环境尤其要注意。道理很简单,谁都不希望数据库的 root 密码留在某个地方,让别人有机会拿到。所以像我上面说的,每台机器的数据库密码,我都建议不要重复,也不要在各种环境变量、配置仓库里明文暴露。安全这件事,提前多做一点,后面省心一大截。