news 2026/10/19 20:00:06

MySQL 8.0 安装与初始化全指南:从字符集到远程访问,Spring Boot 部署必看

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 8.0 安装与初始化全指南:从字符集到远程访问,Spring Boot 部署必看

搞前后端分离项目,最绕不开的就是数据库这一环。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 包安装步骤

步骤如下:

  1. 解压到指定目录,比如D:\mysql-8.0.36-winx64
  2. 在目录下新建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更稳。

  1. 以管理员身份打开 CMD,进入 MySQL 的bin目录,执行:
mysqld --initialize-insecure

--initialize-insecure的意思是初始化一个 root 密码为空的数据目录。用这个参数比--initialize方便,因为它不会给你生临时密码,少一个查日志的环节。

  1. 安装并启动服务:
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 应用如果部署在另一台服务器上,数据库在另外一台服务器上,跨服务器的连接就必须开远程访问权限。

开启远程访问要满足三个条件:

  1. MySQL 用户表里有允许非 localhost 登录的账号记录
  2. MySQL 监听的端口是 0.0.0.0 而不是 127.0.0.1
  3. 防火墙放行了 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=4

6.2 服务启动失败与端口占用

启动失败最常见的原因是 3306 端口被占。排查思路:

netstat -tlnp | grep 3306

如果发现端口被别的服务占用,最省事的方法就是换端口,比如改成 3307。然后记得同步修改 Spring Boot 的配置文件。

6.3 连接超时 / 拒绝连接

这个问题的排查路径我总结了四步,按顺序来:

  1. ping 一下数据库服务器 IP,确认网络通不通
  2. telnet IP 3306,确认端口通不通
  3. 检查 MySQL 用户表,确认账号是否存在、 host 匹配是否正确
  4. 检查密码是否正确

按这个顺序排查,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 密码留在某个地方,让别人有机会拿到。所以像我上面说的,每台机器的数据库密码,我都建议不要重复,也不要在各种环境变量、配置仓库里明文暴露。安全这件事,提前多做一点,后面省心一大截。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 19:58:48

分布式电源接入对配电网故障定位的影响:Python仿真与分析

1. 为什么分布式电源一进来,故障定位就开始"犯迷糊" 先说点我自己的体会。搞配电网的人都知道,传统配电网的设计思路是"单电源、辐射状",电能从变电站流向用户,路径清晰,方向和大小都很好预测。所…

作者头像 李华
网站建设 2026/10/19 19:58:02

具身世界动作模型全解析:从机器人控制到端到端预测

1. 先聊聊为什么"感知—规划—控制"的老路子走到了尽头做机器人控制项目做到第六个月,我最大的体会是:卡住你的往往不是控制器,而是模型对世界到底有没有"预判"。过去几年,工业里最成熟的机器人方案几乎都走同…

作者头像 李华
网站建设 2026/10/19 19:54:00

open-code-review:基于 Git Diff 与 Tree-sitter 的可审计 AI 代码评审

1. 这不是又一个“AI Code Review”工具:open-code-review 的真实定位与设计哲学我第一次在 GitHub 上看到 open-code-review 这个仓库时,下意识点开 README, expecting 又是一个“用 LLM 给 PR 加评论”的玩具项目——结果发现它连一行模型调…

作者头像 李华
网站建设 2026/10/19 19:38:05

open-code-review:基于规则驱动的AI协同代码评审范式

1. 什么是 open-code-review:一个被严重低估的工程实践新范式“open-code-review”这个词最近在技术社区里频繁出现,但很多人把它简单理解成“开源项目的代码评审”,或者误以为是某个具体工具的名字。其实它根本不是产品名,也不是…

作者头像 李华
网站建设 2026/10/19 19:22:46

CAT实时监控平台从零部署到Java客户端接入实践

排障搞到凌晨一点,接口的 P99 从 200 毫秒涨到 1.2 秒,线上查了一圈:MySQL 慢查询没发现、Redis 命中率正常、消息队列积压为零,就是找不到瓶颈。最后是某同事提议把链路里的每一个外部调用都拉出来看,逐一排查&#x…

作者头像 李华
网站建设 2026/10/19 19:22:20

BERT微调实战:酒店评论情感分类完整流程与代码实现

做文本分类这几年,我从最原始的词典匹配一路换到word2vec、textCNN,再到BERT,每一步升级感受都很明显,但最让我觉得“省心”的,还是BERT。省心不是因为它精度一定最高,而是它几乎把特征工程这件事从流程里彻…

作者头像 李华