最近一周内我连续帮三台电脑装 MySQL分别翻车在密码初始化、JDBC 连不上、字符集乱码上。都是很常规的场景但每次看新人在安装时踩的坑总觉得官方文档和网上的教程之间缺了一层“现场感”。所以我把这套 MySQL 8.0 的安装与配置过程完整写下来纯文字没有截图但每一步的界面状态、命令回显、可能出现的报错都写清楚适合第一次装数据库的人也适合需要快速搭一套开发/测试环境的老手做参考。文章只讲官方渠道和标准配置不推荐来路不明的绿色版、精简版因为数据库这东西装歪了后面排查起来特别痛苦。1. 安装前的思考版本、环境与安装方式1.1 为什么选择 MySQL 8.0 而不是 5.7很多人还在用 MySQL 5.7原因无非是两个老项目依赖、网上老教程多。但如果你是新项目、新环境我基本只推荐 8.0。8.0 从性能、安全、功能上都比 5.7 有明显优势比如默认存储引擎 InnoDB 的优化、窗口函数、公用表表达式CTE、原子 DDL以及密码插件从 mysql_native_password 换成了 caching_sha2_password。这个密码插件的变更会让一些旧客户端连接时报认证错误但这恰恰是安全问题被正视的表现。8.0 对硬件内存也更友好虽然默认配置保守但你调好 innodb_buffer_pool_size 之后跑起来比 5.7 更稳。而且 MySQL 8.0 已经发布多年社区问题沉淀足够踩坑资料一搜一大把。从长期维护角度看5.7 的扩展支持期已经过了与其在老旧版本上纠结不如直接上 8.0。如果你是从 5.7 升级到 8.0那要注意大版本升级不是原地小版本升级建议备份后做逻辑升级尽量别直接替换二进制文件。1.2 不同操作系统下的安装方式对比MySQL 8.0 的安装方式很多我平时接触最多的是三种环境。Windows 平台走官方 MSI 安装包最省事有图形界面适合新手。稍微麻烦的是安装完要补环境变量还要注意 MSI 安装到一半报错时怎么清理注册表。Linux 平台又分两类一类是用发行版自带的包管理器比如 apt 装的 mysql-server但很多是发行版改过的版本版本号可能落后另一类是用官方 Yum/Apt 仓库安装真正原版的 mysql-community-server这是我推荐的姿势因为版本干净、升级方便。还有一类是 Docker 容器docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORDxxx -p 3306:3306 mysql:8.0命令简洁但容器里的数据持久化、配置文件挂载、时区处理都跟真机不太一样适合快速验证不适合还没弄懂基础原理的新手。这篇文章重点讲 Windows 和 Linux 两种物理机/虚拟机安装方式Docker 后面有机会单独写。1.3 动手之前的环境检查清单我见过太多装到一半才发现问题的人所以先列一个检查清单。操作系统版本Windows 10/11、Windows Server 2016 以上Linux 建议 CentOS 7、Rocky Linux 9、Ubuntu 20.04/22.04尽量选 x86_64 架构。内存和磁盘MySQL 8.0 安装后空闲内存至少 2GB开发环境 1GB 也能跑但别指望性能磁盘至少 5GB 可用空间数据目录以后会长大预留 20GB 更稳妥。端口占用检查 3306 是否被占用Windows 用 netstat -ano | findstr 3306Linux 用 ss -lnt | grep 3306。账号权限Windows 安装需要管理员权限Linux 建议用 root 或者有 sudo 权限的用户执行安装命令。关闭旧版本如果机器上已经有 MySQL先备份数据再彻底卸载避免数据目录冲突。这几点确认完基本能保证后面的安装流程顺畅。特别是端口占用我遇到过一次装了 MySQL 但服务一直起不来查了半天是另一个程序占着 3306非常烦人。2. Windows 平台安装从 MSI 到可视化客户端连接2.1 下载安装包与安装类型选择去 MySQL 官网下载页面选 MySQL Community Server 8.0然后下载 Windows 平台的 MySQL Installer注意是 mysql-installer-community-8.0.xx.msi不是 zip 压缩包。MSI 安装器的体积只有几百兆但它会在安装过程中自动帮你下载需要的组件所以网络要稳定。双击打开安装器后会出现 Setup Type 选择界面常见选项有 Developer Default、Server only、Client only、Full 等。我的建议是选 Server only之后再单独安装 MySQL Workbench 或者连命令行工具。原因很简单Developer Default 会附带一大堆你用不上的东西比如 Connector/ODBC、Python 的 API、文档示例装多了不仅慢还会让系统变得臃肿。如果你只需要一个数据库服务Server only 是最干净的。安装器界面是英文的看不懂也没关系认准 Developer Default 和 Server only 这两个选项就行。选好类型后安装器会检查依赖环境比如你有没有装 Visual Studio Redistributable。缺什么它会自动装你只要点执行即可。整个过程有进度条耐心等。2.2 配置类型、账户与系统服务安装完成后会自动进入 MySQL 实例配置向导。这里面有几个关键选择我逐个说。第一个是 Config Type有 Development Machine、Server Machine、Dedicated Machine 三个选项对应不同内存占用策略。个人学习用选 Development Machine内存占用小跑起来轻快。生产服务器选 Server Machine 或者 Dedicated Machine会预留更多缓冲池。第二个是端口号默认 3306保持默认即可除非真的被占用。接下来是 X Protocol 端口默认 33060这是给 MySQL X 插件用的MySQL Shell 和某些新客户端会用到一般默认就行不想要可以取消勾选。第三个是 MySQL Root Password这里要设置 root 密码。密码建议包含大小写、数字、特殊字符因为 8.0 默认密码策略有强度要求。填完之后还有个选项是 Add MySQL User就是额外创建几个开发账号新手可以先跳过后面用命令行建更灵活。最后一步 Configure Windows Service把 MySQL Server 注册为系统服务开机自启建议勾上服务名默认 MySQL80。账户选 Standard System Account 就行不需要单独指定服务账户。设置完会提示 Apply Configuration执行完服务会自动启动这一步失败的话多半是权限不足右键以管理员身份重新跑安装器。2.3 初始化数据目录与 my.ini 优化如果用 MSI 安装初始化数据目录是自动完成的一般不需要手动执行 mysqld --initialize。但有个场景你会碰到以前用 zip 包解压的 MySQL或者 MSI 安装中途失败需要手动初始化。手动初始化命令是mysqld --initialize-insecure加 insecure 表示生成一个空密码的 root 账号方便第一次登录。不加的话是随机密码会写在数据目录的日志文件里对新手不友好。注意初始化命令要在 MySQL 安装目录的 bin 目录下、且当前用户对 data 目录有写权限时执行。关于 my.ini默认安装位置是 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini这个文件是隐藏目录下的资源管理器默认看不到可以在地址栏直接输入路径访问。建议在里面追加以下配置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci port3306 max_connections500 default-time-zone08:00改完配置文件必须重启 MySQL 服务才能生效Windows 下用管理员身份打开命令行执行net stop MySQL80 net start MySQL80或者用 services.msc 找到 MySQL80 右键重启。配置文件是纯文字所以这篇纯文字教程反而比截图更清楚地告诉你每个参数写在哪。2.4 添加环境变量并验证安装MSI 安装器默认不会把 MySQL 的 bin 目录加入 PATH所以你在 cmd 里直接敲 mysql 会提示“不是内部或外部命令”。解决办法是配置环境变量右键此电脑 - 属性 - 高级系统设置 - 环境变量找到系统变量里的 Path点编辑新增一行 C:\Program Files\MySQL\MySQL Server 8.0\bin根据实际安装目录调整。配置好环境变量后重新打开命令行输入mysql -u root -p输入密码就能进入 MySQL 控制台。进去后执行SELECT VERSION();能返回 8.0.x 就说明安装成功。如果提示 ERROR 1045 Access denied说明密码不对如果提示 ERROR 2003 Cant connect说明服务没启动或者端口被拦截。Windows 防火墙第一次启动 MySQL 时会弹窗询问是否允许公网访问开发机选取消服务器上则按需放行 3306 端口。到了这一步Windows 上最基本的安装流程就通了。3. Linux 平台安装Yum 仓库与命令行完整流程3.1 配置官方 Yum 仓库Linux 上我推荐的安装方式是使用官方 MySQL Yum 仓库好处是之后 yum update 能直接升级 MySQL 小版本不用手动下载 rpm 包。以 CentOS/Rocky Linux 为例先去 MySQL 官网 Yum Repository 页面下载对应系统的 rpm 包比如 mysql80-community-release-el9-5.noarch.rpm 这种文件名注意 el 后面的数字要和你的系统大版本一致el7 对应 CentOS 7el9 对应 Rocky Linux 9 / AlmaLinux 9。下载后用 rpm 命令导入仓库sudo rpm -ivh mysql80-community-release-el9-5.noarch.rpm导入完检查仓库是否生效yum repolist all | grep mysql要能看到 mysql80-community 仓库。此时还要留意一下仓库是否被禁用确保 mysql80-community 是 enabled 状态。如果是多版本仓库共存执行安装前最好禁用其他版本仓库避免装错版本。假如之前机器上有 remi 或者 epel 里的 mysql 相关包也可能产生冲突安装时要看提示。3.2 安装服务端与客户端仓库配置好后安装命令很简单sudo yum install -y mysql-community-server这个命令会同时安装 mysql-community-server 和 mysql-community-client也就是服务和命令行客户端。安装过程会下载不少依赖包网络慢就等着。装完后先启动服务sudo systemctl start mysqld sudo systemctl enable mysqld在 RHEL/CentOS 系列的官方仓库包中数据目录是 /var/lib/mysql配置文件是 /etc/my.cnf错误日志是 /var/log/mysqld.log。第一次启动时MySQL 会执行数据目录初始化并给 root 生成一个临时密码这个临时密码写在日志文件里。获取方式sudo grep temporary password /var/log/mysqld.log这里我多说一句有些人第一次启动就失败往往是 /var/lib/mysql 目录权限不对或者 /var/log/mysqld.log 路径不可写。排查时先用 systemctl status mysqld 看服务状态然后看 journalctl -u mysqld 或日志文件里的报错。3.3 安全初始化与启动配置用临时密码登录mysql -u root -p登录后 MySQL 会提示密码过期限制必须先修改 root 密码才能执行其他操作ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;设定完新密码可以顺手运行官方自带的安全加固脚本sudo mysql_secure_installation这个脚本会引导你做几件事设置密码策略强度、删除匿名用户、禁止 root 远程登录、删除 test 数据库、重新加载权限表。对于生产环境建议这些全部选是对于开发环境至少要把匿名用户删掉root 远程登录这事后面需要的时候再单独处理。密码策略这一关值得展开说。MySQL 8.0 默认装好 validate_password 组件策略默认 MEDIUM要求密码至少 8 位包含大小写、数字、特殊字符。如果你开发环境想用简单密码可以登录后执行SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;注意这是运行时设置重启后失效想永久生效需要写到配置文件的 [mysqld] 段里。但我不建议在生产环境调低密码策略安全永远是第一位的。3.4 开放远程访问与防火墙策略默认情况下MySQL 只监听 localhost也就是 127.0.0.1外部机器是连不上的。如果你需要让程序从另一台服务器连接要先做两件事。第一件确认 my.cnf 里的 bind-address 设置。默认配置可能没有指定 bind-address此时 MySQL 默认只绑 127.0.0.1如果你想允许所有网段访问可以设置[mysqld] bind-address0.0.0.0或者指定具体内网网段。改完重启服务。注意暴露 3306 到公网有风险生产环境建议用内网 IP或者通过防火墙只允许特定来源 IP。第二件在 MySQL 里创建远程访问账号。一般不建议直接用 root 开远程而是创建专用账号CREATE USER app192.168.1.% IDENTIFIED BY StrongPass123!; GRANT ALL PRIVILEGES ON mydb.* TO app192.168.1.%; FLUSH PRIVILEGES;这里 app 账号只允许 192.168.1.0/24 网段访问权限也限制在 mydb 库比直接开放 root 安全得多。最后别忘防火墙sudo firewall-cmd --permanent --add-servicemysql sudo firewall-cmd --reload如果用的是 iptables就添加一条放行 3306 的规则。测试远程连接时在另一台机器执行 mysql -h 服务器IP -u app -p能连上就说明整个链路通了。4. 核心配置参数详解字符集、连接数、时区与日志4.1 字符集与排序规则设置MySQL 安装完第一件事就是把默认字符集改成 utf8mb4。为什么一定要 utf8mb4因为 utf8 在 MySQL 里最多只支持 3 字节像 emoji 表情和一些生僻字、日韩特殊字符都需要 4 字节用 utf8 存会直接报错或者乱码。utf8mb4 才是真正意义上的完整的 UTF-8。MySQL 8.0 的配置方式如下在 Linux 是 /etc/my.cnf 的 [mysqld] 段Windows 是 my.ini 的 [mysqld] 段[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci8.0 默认的排序规则是 utf8mb4_0900_ai_ciai 表示 accent insensitive不区分音调ci 表示 case insensitive不区分大小写。如果你以后要用 MySQL 同步到其他数据库或者对 collation 兼容性有特殊要求也可以改成 utf8mb4_general_ci但新项目直接默认即可。服务器字符集改完后还要注意客户端连接字符集。登录时执行SHOW VARIABLES LIKE character_set%;正常情况下 character_set_server、character_set_database、character_set_client 都应该是 utf8mb4。如果客户端连接后中文乱码可以在连接字符串里加上 characterEncodingutf8JDBC或者执行 SET NAMES utf8mb4。4.2 连接数与线程缓存调整MySQL 默认 max_connections 是 151 个开发环境够用但只要业务稍微上来连接数很容易打满报错通常是 Too many connections。但这个参数不是拍脑袋随便调大的每个连接都会占用线程和内存调得太大反而导致系统资源耗尽。常用调整思路是同时看三个参数max_connections、max_user_connections、thread_cache_size。比如一个 4G 内存的机器可以把 max_connections 设为 500thread_cache_size 设为 100。配置文件写法[mysqld] max_connections500 max_user_connections400 thread_cache_size100改完重启服务用 SHOW STATUS LIKE Threads_connected 观察实际连接数。如果连接数长期飙高先排查应用连接池是不是没有正确释放而不是一味调高上限。连接池这块Java 的 HikariCP 默认 maximum-pool-size 是 10数据库端的 max_connections 留足余量就行别搞成几千连接把内存吃光。4.3 时区、默认存储引擎与 SQL 模式时区问题在 JDBC 连接时非常典型。你用新版 MySQL Connector/J 连接 8.0 时如果连接串不带 serverTimezone 参数可能会报 The server time zone value ?й is unrecognized 或者 CST 相关错误。更稳妥的做法是在服务器端配置默认时区[mysqld] default-time-zone08:00如果你的系统时区是 Asia/Shanghai也可以设置 default-time-zoneAsia/Shanghai但 MySQL 的时区表需要加载不如直接写偏移量来得省事。配置完后在 MySQL 里执行 SELECT NOW()看到的才是本地时间。默认存储引擎这块8.0 默认就是 InnoDB基本不用改。你只需要注意建表时别显式指定 MyISAM8.0 里 MyISAM 已经越来越边缘化了。SQL 模式默认是 ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES 等建议保持默认。ONLY_FULL_GROUP_BY 会让一些老 SQL 报错比如 select * from t group by id这是因为你查了不在 group by 里的列。如果升级后遇到这种报错先改 SQL 习惯别急着关 SQL 模式。4.4 日志类型与慢查询定位MySQL 8.0 的日志主要分四类错误日志、通用查询日志、慢查询日志、二进制日志。新手至少要搞懂慢查询日志因为排查 SQL 性能全靠它。默认情况下MySQL 8.0 是关闭慢查询日志的。开启方式[mysqld] slow_query_log1 slow_query_log_file/var/log/mysql-slow.log long_query_time2 log_queries_not_using_indexes1long_query_time2 表示执行时间超过 2 秒的 SQL 会被记录。log_queries_not_using_indexes 会把没走索引的 SQL 也记下来这个开关在开发阶段很有用但生产环境比较吵视情况开。配置完重启服务用 mysqldumpslow 工具分析慢查询日志mysqldumpslow -s t -t 10 /var/log/mysql-slow.log这条命令按执行时间排序并显示前 10 条慢 SQL。除了慢查询general_log 是记录所有 SQL 的生产环境千万别开日志文件会爆炸式增长。binlog 负责主从复制和数据恢复默认开着的这里是提一句详细配置后面单独聊。5. 运维实战用户权限、备份恢复与常见问题排查5.1 用户与权限管理的正确姿势数据库装好只是开始日常运维里用户权限管理是最容易出事的环节。我见过很多团队所有人共用 root一旦某个人误删数据连是谁删的都不知道。正确做法是一个业务一个账号一个开发者一个账号权限最小化。创建用户和授权的标准姿势CREATE USER devlocalhost IDENTIFIED BY DevPass123!; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO devlocalhost; FLUSH PRIVILEGES;这里 dev 账号只有增删改查权限没有 DDL 权限不能建表删表。如果某个人确实需要建表权限再加 ALTER、CREATE、INDEX。如果要撤销权限REVOKE DELETE ON mydb.* FROM devlocalhost;删除用户用 DROP USER devlocalhost;。记住MySQL 的账号是由 user 和 host 共同决定的devlocalhost 和 dev% 是两个不同账号别搞混。host 字段建议精确到 IP 或者网段不要无脑写 %。再补充一个常见的权限刷新问题执行了 GRANT 或 REVOKE 后有人习惯性执行 FLUSH PRIVILEGES其实 GRANT/REVOKE 已经实时更新了权限表FLUSH 只是当你在手动修改 mysql.user 表或者不确定状态时才需要。另外修改密码时用ALTER USER devlocalhost IDENTIFIED BY NewPass456!;不要再用老旧的 SET PASSWORD FOR ... PASSWORD(...)8.0 里 PASSWORD() 函数已经废弃了。5.2 备份与恢复的常用命令备份数据库没有捷径必须形成习惯。我常用的逻辑备份命令是mysqldump -u root -p --single-transaction --set-gtid-purgedOFF --default-character-setutf8mb4 mydb mydb_$(date %F).sql--single-transaction 适用于 InnoDB可以在不锁表的情况下做一致性的备份。--set-gtid-purgedOFF 是为了避免恢复时因为 GTID 信息导致不必要的问题如果你不做主从可以不加这个参数。备份出来的是一个 SQL 文本文件内容包含建表语句和 INSERT 语句。恢复命令也简单mysql -u root -p mydb mydb_2025-01-01.sql如果备份文件压缩过比如 mydb.sql.gz要先解压再导入gunzip mydb.sql.gz mysql -u root -p mydb mydb.sql恢复前确保目标数据库存在不存在要先 CREATE DATABASE mydb CHARACTER SET utf8mb4;。还要注意mysqldump 备份的只是逻辑数据不是操作系统级文件备份前最好用 SHOW PROCESSLIST 确认没有正在执行的大事务否则一致性可能出问题。对于大库可以考虑 Percona XtraBackup但那是物理备份工具适合对运维有经验的人学习。5.3 常见安装与连接问题排查速查表我把这些年安装配置 MySQL 8.0 遇到的典型报错整理成一张速查表按提示信息和解决顺序排列。报错/现象可能原因排查命令与解决思路Access denied for user rootlocalhost密码错误或用户不存在确认密码大小写忘记密码时跳过授权重启或用 --init-file 重置ERROR 2003 (HY000): Cant connect to MySQL server服务没启动、端口被防火墙拦截systemctl status mysqld检查 3306 端口监听开放防火墙ERROR 1045 (28000): Plugin caching_sha2_password ...客户端太旧不支持新密码插件升级客户端驱动或临时改认证插件为 mysql_native_passwordERROR 1130: Host x.x.x.x is not allowed to connectroot 或用户只允许 localhost 连接创建指定 host 的账号或修改 mysql.user 中 host 为 %[Warning] root password expired / password has expired初始密码过期登录后执行 ALTER USER ... IDENTIFIED BY 重置新密码MySQL service failed to start / The server quit without updating PID file数据目录权限、my.cnf 语法或端口冲突查看错误日志验证 my.cnf确保 /var/lib/mysql 属主 mysql:mysqlUnknown collation utf8mb4_0900_ai_ci恢复的备份文件来自 8.0但导入到旧版本升级目标库到 8.0或备份时把排序规则改为低版本兼容规则InnoDB: Operating system error number 13数据目录权限或系统限流检查 data 目录属主、SELinux 上下文必要时 restorecon这里重点说下忘记 root 密码怎么办。Linux 上最简单可靠的方式是sudo systemctl stop mysqld sudo systemctl set-environment MYSQLD_OPTS--skip-grant-tables sudo systemctl start mysqld然后用 mysql -u root 免密登录执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完密码后关闭 mysqld取消环境变量再正常启动服务sudo systemctl unset-environment MYSQLD_OPTS sudo systemctl restart mysqld这个流程我实测过多次注意一定要先 FLUSH PRIVILEGES不然 ALTER USER 会报权限不足。5.4 补丁升级与安全卸载MySQL 8.0 的小版本更新很快官方发布的安全补丁和 bug 修复都在小版本里。如果你是用 Yum 仓库安装的升级很简单sudo yum update mysql-community-server sudo systemctl restart mysqld升级前务必先备份虽然小版本升级一般不会动数据但生产环境不允许赌。升级后检查版本mysql -V以及所有库表状态CHECK TABLE your_table;MySQL 8.0 在部分小版本升级时会自动运行升级检查启动日志里能看到。如果遇到字符集校验问题可以用 mysqlcheck --upgrade -u root -p 手动跑一遍8.0 官方已经计划弃用 mysql_upgrade用到 mysqlcheck 的升级模式即可。至于卸载Windows 用户去控制面板卸载 MySQL Installer 和相关组件然后删除残留的 C:\ProgramData\MySQL 数据目录和 C:\Program Files\MySQL 安装目录以及 C:\Windows 下的 my.ini 残留如果有。Linux 用户卸载sudo yum remove -y mysql-community-server mysql-community-client卸载前先备份 /var/lib/mysql 整个目录这是你最值钱的数据。卸载后还要删除 /etc/my.cnf 如果不再使用。注意 yum remove 不会自动删除数据目录这是安全设计避免你误操作丢数据确定不要了再手动 rm -rf /var/lib/mysql。这步一定要三思我见过删完才想起里面有老板一个季度数据的兄弟场面极其惨烈。最后分享一个我实际操作中的体会装 MySQL 从来都不难难的是装完之后你知不知道它为什么起不来、为什么连不上、为什么慢。上面这份攻略看起来很长但真正动手走一遍四十分钟到一个小时足够。装完之后建议你先建一个自己的测试库把增删改查、字符集、连接用户都试一遍遇到问题再回头查这篇文字版比满屏截图对着找按钮要高效得多。