首页 / 资讯中心 / 文章详情

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

MySQL 8.0 安装与初始化全指南:从字符集到远程访问,Spring Boot 部署必看 ★ FEATURED ARTICLE
搞前后端分离项目最绕不开的就是数据库这一环。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临时密码长这样rootlocalhost: 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] port3306 basedirD:/mysql-8.0.36-winx64 datadirD:/mysql-8.0.36-winx64/data character-set-serverutf8mb4 default-authentication-pluginmysql_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 rootlocalhost 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.iniLinux 改/etc/my.cnf[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_general_ci改完配置文件记得重启 MySQL不然不生效。4.2 创建 Spring Boot 专用账号这里说一点我自己的习惯绝对建议效仿不要用 root 账号直接连业务数据库。因为 root 权限太大了一旦应用被注入整个数据库都完蛋。单独建一个专用账号只授予这个账号操作业务数据库的权限即使出问题波及范围也就限制在业务库里。-- 创建数据库 CREATE DATABASE springboot_vue DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 创建专用账号 CREATE USER appuserlocalhost IDENTIFIED BY AppPass123; -- 授权 GRANT ALL PRIVILEGES ON springboot_vue.* TO appuserlocalhost; 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 AppPass123; 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-address127.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 --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload如果是云服务器还得在云控制台的安全组里也放行 3306 端口。这一步很容易漏很多人折腾半天最后发现是安全组没配。5.5 Spring Boot 连接串配置参考配置好远程访问权限之后Spring Boot 项目里的application.yml按如下方式配置spring: datasource: url: jdbc:mysql://数据库服务器IP:3306/springboot_vue?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiuseSSLfalse username: appuser password: AppPass123 driver-class-name: com.mysql.cj.jdbc.Driver这里几个参数再展开解释一下serverTimezoneAsia/Shanghai不设的话MySQL 驱动会报警告而且时间字段会差 8 小时useSSLfalse是关闭 SSL 连接因为内网部署没必要加密开着反而影响性能useUnicodetruecharacterEncodingutf8mb4是告诉驱动以 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.policyLOW validate_password.length46.2 服务启动失败与端口占用启动失败最常见的原因是 3306 端口被占。排查思路netstat -tlnp | grep 3306如果发现端口被别的服务占用最省事的方法就是换端口比如改成 3307。然后记得同步修改 Spring Boot 的配置文件。6.3 连接超时 / 拒绝连接这个问题的排查路径我总结了四步按顺序来ping 一下数据库服务器 IP确认网络通不通telnet IP 3306确认端口通不通检查 MySQL 用户表确认账号是否存在、 host 匹配是否正确检查密码是否正确按这个顺序排查90% 的连接问题都能解决。还记得我之前说的三个条件吗用户表、监听地址、防火墙一个环节出问题都会连不上。6.4 中文乱码问题数据能写入但读出来乱码问题通常不在 MySQL而在 Spring Boot 应用的连接字符串上。重点检查characterEncodingutf8mb4参数是否加上了。同时检查一下 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();服务器的系统时区dateSpring Boot 连接串里加上了serverTimezoneAsia/Shanghai之后这类问题基本不会再出现。7. 数据库备份与后期运维建议7.1 定时备份策略数据是无价的尤其是业务上线之后。我的建议是每天凌晨做一次物理备份保留最近 7 天的备份文件。用 crontab 实现0 2 * * * mysqldump -u appuser -pAppPass123 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 密码留在某个地方让别人有机会拿到。所以像我上面说的每台机器的数据库密码我都建议不要重复也不要在各种环境变量、配置仓库里明文暴露。安全这件事提前多做一点后面省心一大截。
阅读完成 · 觉得有帮助?
咨询建站