
MySQL 8.0的安装说大不大说小不小。我自己见过太多人卡在这一步装完了连不上、密码不对、字符集乱码、远程访问被拒绕了一大圈回来发现全是基础没打牢。这文章不配图、不贴视频纯文字把每一步位置和原因讲清楚你照着敲就行。主要讲三件事怎么选版本和安装方式、Windows 和 Linux 下的完整实操、装完之后必做的配置与排查。不管你是刚入门还是准备搭 Zabbix 或后端服务都建议完整过一遍。我一直主张安装类教程最值钱的部分不是“下一步、下一步”而是每个选择背后的为什么。比如为什么 8.0 是首选而不是 5.7为什么 Windows 下推荐 ZIP 手动装为什么初始化之后要先改密码策略这些搞明白后面运维能少踩很多坑。所以这篇文章我会把原理和实操混在一起讲尽量让你既装得上也理解自己刚做了什么。1. 动手之前先想清楚版本、平台和安装方式1.1 版本抉择为什么默认选 MySQL 8.0 而不是 5.7如果你在网上搜索安装教程很容易看到大量关于 5.7 的内容但这几年再新装库我强烈建议直接上 8.0。原因很直接MySQL 5.7 已经停止小版本维护官方不再提供安全更新新项目没必要抱着一个停止维护的版本起步。8.0 在性能、安全、JSON 支持、窗口函数等方面都有明显提升企业和新手学习都适合。MySQL 8.0 有个关键变化需要提前知道默认认证插件是caching_sha2_password而不是 5.7 时代的mysql_native_password。这会导致一些老客户端连不上报错通常是 1045 或 2059。这不是你密码错了而是客户端版本太老、不认识新认证方式。后面我会讲怎么兼容但你先有这个认知遇到报错就不会慌。另一个变化是 8.0 默认开启二进制日志数据目录里会有 binlog 文件。对生产环境这是好事方便备份和恢复对刚学的朋友也不用担心它不会影响正常使用只是磁盘占用稍微多一点。1.2 不同平台怎么选安装方式安装方式没有绝对的好坏只有适合不适合。我平时用得最多的是这么几种整理成表格方便你对照平台安装方式适用场景我的评价WindowsMSI 安装向导新手、图形界面操作省事但安装后目录分散环境变量和密码策略容易懵WindowsZIP 压缩包手动安装想搞清结构、后续维护方便推荐可迁移、可控性强Linux官方 YUM/APT 仓库绝大多数生产服务器最标准命令一敲就能装好并注册为系统服务Linux通用二进制包内网无外网、特殊目录需求部署灵活但初始化和服务配置要自己来如果你只是自己电脑上学习Windows 下用 ZIP 手动装一次能把目录结构、配置文件、初始化流程都过一遍这个底子打好了Linux 上就是换汤不换药。如果服务器上用直接官方 YUM 仓库最靠谱升级也方便。源码编译这种一般没必要除非你有特殊裁剪需求。2. Windows 平台完整安装实战纯文字可直接照做2.1 MSI 安装器的关键选择先说一下 MSI 向导。到 MySQL 官网下载mysql-installer-community-8.0.x.msi双击后会问你装哪些组件。新手建议选Server only只装数据库服务其他工具后面需要再补。有些人手一抖选了 Developer Default一下装出十几个组件网络不好还会卡半天没必要。安装向导里会让你设置 root 密码。8.0 的默认密码策略比较严格要求至少 8 位、包含大小写字母、数字、特殊字符。你可以在向导里直接填一个复杂密码也可以后面用命令行改。还有一步是配置 Windows 服务可以把服务名改成MySQL80并勾选开机自启。端口默认 3306 就好除非你这台机器上已经跑了别的 MySQL。MSI 的优点是交互直观缺点是它会自动帮你做很多事比如生成配置文件、注册服务、初始化数据目录但你不一定清楚它把文件放哪了。很多人在 MSI 装完之后想改配置却连my.ini在哪都找不到这在后面调优时就很被动。2.2 ZIP 压缩包手动安装流程推荐ZIP 手动安装是我个人最推荐 Windows 新手的路径。先去官网下载mysql-8.0.x-winx64.zip解压到某个固定目录比如C:\mysql-8.0.x-winx64。注意路径里不要带中文和空格后面配置、启动都会省事很多。解压后先别急着启动在解压目录下新建一个my.ini配置文件。这是 8.0 手动安装比较关键的一步[mysqld] basedirC:/mysql-8.0.x-winx64 datadirC:/mysql-8.0.x-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci max_connections200 [client] port3306 default-character-setutf8mb4这里说明一下为什么必须写basedir和datadir。ZIP 包没有打包默认路径你不告诉它 MySQL 安装目录和数据目录在哪启动时会找不到路径。字符集直接定成utf8mb4这是 8.0 时代最推荐也几乎是唯一推荐的编码后面我会专门讲。配置文件写好后用管理员身份打开 CMD进入C:\mysql-8.0.x-winx64\bin先执行初始化命令mysqld --initialize --console这条命令会创建数据目录初始化系统表并在控制台直接打印一个临时 root 密码。一定要把控制台里那串A temporary password is generated for rootlocalhost: xxxxxxxx抄下来忘了的话就得走后面讲到的免密重置流程。初始化完成后注册 Windows 服务mysqld --install MySQL80 --defaults-fileC:/mysql-8.0.x-winx64/my.ini然后启动服务net start MySQL80服务名可以随便取MySQL80是为了和 8.0 对应方便以后认出来。注册服务的好处是 MySQL 会跟着 Windows 开机自动启动不用每次手动开进程。2.3 初始化密码、验证连接与环境变量服务启动后用临时密码登录mysql -uroot -p输入临时密码进入 MySQL 之后第一件事就是改密码ALTER USER rootlocalhost IDENTIFIED BY YourPass!234;注意 MySQL 8.0 默认密码验证策略比较严格密码太简单会直接被拒绝提示不满足 validate_password 的要求。如果你只是在本地学习想用简单密码可以先把密码策略调低SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;然后再改密码。这个策略设置在重启后会失效想永久生效得写进配置文件。最后建议把 MySQL 的 bin 目录加进系统环境变量 PATH。这样在任何路径下都能直接敲mysql命令不用老 cd 到 bin 目录。流程是此电脑右键属性、高级系统设置、环境变量在系统变量里找到 Path追加C:\mysql-8.0.x-winx64\bin。完成后重开一个 CMD直接敲mysql -uroot -p就能登录说明环境变量生效了。3. Linux 平台部署实操CentOS/Rocky 为例3.1 用官方 YUM 仓库一步步装Linux 下最标准的装法是官方 YUM 仓库。CentOS 7/8、Rocky Linux、AlmaLinux 都适用原理一样只是仓库包版本不同。服务器上一般不会预装 MySQL反而会自带 MariaDB 的兼容库这两个用 yum 硬装会冲突先检查一下rpm -qa | grep mariadb如果输出里有mariadb-libs就先移除yum remove -y mariadb-libs然后添加 MySQL 官方仓库。我习惯用两个命令组合rpm -Uvh https://repo.mysql.com/mysql80-community-release-el8-1.noarch.rpm这里el8要按系统大版本改CentOS 8 用 el8CentOS 9 用 el9。如果你拿不准去 MySQL 官网 Yum Repository 页面找对应的 release 包链接。装完仓库之后直接安装yum install -y mysql-community-server这个命令会把mysql-community-server、mysql-community-client以及一堆依赖一起装好。相比 Windows 手动装YUM 方式会自动创建mysql用户、默认数据目录、默认配置文件省心很多。3.2 首次登录、修改密码与自启动配置装完后先启动服务systemctl start mysqld systemctl status mysqld8.0 安装后 root 初始密码不会告诉你而是自动写进日志文件。查看方式grep temporary password /var/log/mysqld.log日志里会有一行类似A temporary password is generated for rootlocalhost: xxxxxxxx的内容这就是你第一次登录要用的密码。登录mysql -uroot -p进去之后立刻改密码ALTER USER rootlocalhost IDENTIFIED BY NewPass!234;同样密码策略默认较强太简单会被拒。如果你需要弱密码做测试先执行SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;最后设置开机自启systemctl enable mysqld到这里 Linux 下基础安装就完成了。和 Windows 手动装最大的区别是Linux 包管理器会帮你把服务脚本、配置文件、数据目录都放在标准位置你不需要自己初始化数据目录。3.3 配置文件位置与最小可用配置Linux 下 MySQL 8.0 的默认配置文件是/etc/my.cnfYUM 安装后会自动生成。你可以打开看一下里面内容很少大量参数走默认值。这其实是好事默认值经过官方调校适合大多数场景。我通常在/etc/my.cnf的[mysqld]段补上这几个最小配置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci default-time-zone08:00 max_connections300 slow_query_logON long_query_time2为什么只加这些因为默认的 InnoDB 引擎、缓存策略已经够用改动越多、风险越大。字符集和时区属于“不适合默认值”的项必须主动设置慢查询日志是为了以后排查性能问题提前开着没坏处。配置完成记得重启生效systemctl restart mysqld改完配置后不要急着关终端先确认 MySQL 还能正常启动systemctl status mysqld mysql -uroot -p -e SELECT VERSION();如果看到版本号说明重启成功配置没有写错。4. 装完必做的第一轮配置4.1 安全加固改密码策略和删匿名账户装完 MySQL 第一件事不是急着建库而是把明显不安全的默认项收一收。官方提供了一个安全初始化脚本mysql_secure_installation全程交互式提问包括是否设置密码复杂度、是否删除匿名用户、是否禁止 root 远程登录、是否删除 test 库。我的建议是匿名用户删掉、test 库删掉、root 远程登录拒绝。这套操作在生产环境上是基本要求本地学习也可以顺手做一遍。如果你不想走交互脚本手动执行也一样DELETE FROM mysql.user WHERE User; DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;这里有个经验8.0 的密码策略默认等级是MEDIUM实际要求是 8 位以上、包含字母大小写、数字和特殊字符。你可以用SHOW VARIABLES LIKE validate_password%;查看当前策略用前面讲的SET GLOBAL临时调低。生产环境建议保持默认强度本地学习可以放宽。4.2 字符集与时区从源头杜绝乱码和 8 小时问题字符集和时区是最容易被忽略、出问题后最折磨人的两项。先检查当前字符集SHOW VARIABLES LIKE character_set_server;默认大概率是utf8mb4但如果你是从 5.7 迁移过来的库可能是latin1或utf8mb3。MySQL 里的utf8其实是utf8mb3不支持完整的 Unicode只有utf8mb4才是完整版。生产环境一律用utf8mb4在my.ini或my.cnf里写死character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci在 8.0 里默认排序规则是utf8mb4_0900_ai_ci比旧的utf8mb4_general_ci更准确。如果是从 5.7 迁移的旧库可以先保持旧的排序规则避免字段比较时报错。时区问题更隐蔽。MySQL 默认time_zoneSYSTEM也就是跟随操作系统时间。如果你服务器时区是 UTC而应用日志要的是北京时间就会出现数据库时间差 8 小时。最稳妥的做法是在配置文件里固定default-time-zone08:00或者直接写时区名default-time-zoneAsia/Shanghai注意时区名写法在某些环境下需要加载系统时区表08:00这种偏移量写法不会依赖时区表兼容性更好。修改后记得重启。4.3 开放远程访问授权、防火墙与注意事项刚装完的 MySQL 只有 root 且只允许 localhost 登录远程连接会报 1130。生产环境如果应用服务器和数据库服务器是分开的就需要开放远程访问。正确做法不是给 root 开远程而是新建一个专用账号CREATE USER app% IDENTIFIED BY AppPass!234; GRANT ALL PRIVILEGES ON appdb.* TO app%; FLUSH PRIVILEGES;这条命令的意思是新建一个用户 app允许从任何主机连接并且对 appdb 库有全部权限。如果你希望它只能操作某个数据库就在授权时指定库名如果只想让固定 IP 连把%换成具体 IP比如192.168.1.100。授权完成后还要检查两件事。第一Linux 防火墙是否放行 3306 端口systemctl status firewalld firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload第二如果用的是云服务器还要确认安全组规则有没有放行 3306。很多人在本机测试完全正常换台电脑连不上多半就是卡在云平台安全组这个经常被忽略。还有个值得说的参数是skip-name-resolve。MySQL 默认会根据客户端 IP 反向解析域名如果 DNS 有问题连接会明显变慢。在配置里加上[mysqld] skip-name-resolve加了之后授权语句里的主机名就不能用域名了必须写 IP 或%。好处是连接速度快、不受 DNS 干扰坏处是不能按主机名授权。我自己的习惯是能加就加配合 IP 白名单用。5. 核心参数调优让数据库跑得更稳5.1 配置文件优先级与最小修改原则MySQL 启动时读取配置文件的顺序是固定的后读的会覆盖先读的。Linux 下默认顺序大概是/etc/my.cnf、/etc/mysql/my.cnf、~/my.cnf。你先搞清楚自己改的是哪个文件避免改了半天没生效。修改配置我只坚持一个原则一次只改一两项改完重启验证不要一把梭。很多人看到别人的“优化配置”整段复制到自己的生产库结果内存不够服务都起不来。调优的前提是你知道每个参数是干什么的否则默认值反而是最安全的。5.2 三个必调参数缓冲池、连接数、慢查询innodb_buffer_pool_size是 InnoDB 的缓冲池大小直接影响读性能。经验值设为物理内存的 60% 到 70%。比如机器有 8G 内存缓冲池设 5G 左右留出给操作系统和其他进程的空间innodb_buffer_pool_size5G注意这只是经验起点具体要看业务类型。如果机器内存只有 2G就别硬设 1.5G系统会卡到不行。max_connections是最大连接数默认 151对多数中小项目够用但如果并发高会出现Too many connections报错。建议先设 300 到 500观察连接使用情况再往上调。slow_query_log配合long_query_time是排查性能问题的利器。开启后执行时间超过阈值的 SQL 会被记录帮你定位慢查询slow_query_logON long_query_time2 slow_query_log_file/var/log/mysql-slow.log我见过很多开发同学应用卡了不知道从哪入手一开慢查询日志问题 SQL 一目了然。这个参数平时就该开着代价很低收益很高。5.3 动态修改参数的正确姿势MySQL 8.0 很多参数支持在线修改不用重启SET GLOBAL max_connections 400;但有个坑SET GLOBAL修改的只是运行时值重启后会回退到配置文件里的值。想持久化必须写进配置文件。所以正确姿势是先用SET GLOBAL在线调整观察效果确认没问题再写进配置文件避免一次性改太多导致重启失败。另外注意有些参数虽然能在线改但不是所有参数都能比如innodb_buffer_pool_size在 8.0 里可以动态改但要等它实际扩容完成而port、datadir这类只能改配置文件重启。判断方法是查官方文档或者执行SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAMEinnodb_buffer_pool_size;总之在线修改适合临时调整配置文件才是最终的持久化方案。6. 常见问题与排查思路实录6.1 忘记 root 密码的应急处理这个场景我处理过太多次。按下面的步骤来几乎都能救回来。先停服务systemctl stop mysqld然后在配置文件里临时加一行[mysqld] skip-grant-tables重启服务systemctl start mysqld此时可以免密进入mysql -uroot进去后先刷新权限再改密码FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass!234;如果ALTER USER因为权限问题报错可以先清空密码字段再重新设置UPDATE mysql.user SET authentication_string WHERE Userroot; FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass!234;处理完记得把配置文件里加的skip-grant-tables删掉重启 MySQL。这一步最容易忘忘了的话数据库就处于裸奔状态非常危险。6.2 无法连接的三大报错这里整理一下我自己排查远程连接时最常遇到的三种报错以及处理方向报错编号报错含义排查方向2003无法连接到服务器看服务是否启动、端口是否监听、防火墙/安全组是否放行1130主机不被允许连接授权时没写对应 hostroot 默认只允许 localhost1045Access denied密码错、用户不存在或认证插件不兼容先说 2003。用netstat -ano | findstr 3306或 Linux 的ss -tlnp | grep 3306确认端口在监听。端口在监听但连不上90% 是防火墙或安全组问题。再看 1130。这通常不是密码问题是用户表的 host 限制。解决办法就是前面讲的新建一个xxx%用户并授权不要直接改 root 的 host。最后是 1045。如果密码确定没错多半是认证插件问题。8.0 默认caching_sha2_password老客户端会报Authentication plugin caching_sha2_password cannot be loaded临时兼容办法是降级认证插件ALTER USER app% IDENTIFIED WITH mysql_native_password BY AppPass!234;但我不建议长期依赖这种方案最好是把客户端换成新版因为mysql_native_password在 MySQL 8.0 中已标记废弃长远来看不安全。6.3 字符集、时区与认证插件相关的坑字符集乱码的排查思路很清晰从端到端一层层查。先看数据库、表、字段的字符集再看客户端连接字符集最后看应用层有没有指定characterEncodingutf8mb4。常见场景是 MySQL 服务端是 utf8mb4但 JDBC 连接串没加编码参数最终写入的还是错误编码。时区问题最常见的表现是数据库查出来的时间比正确时间差 8 小时或者反过来。先执行SELECT NOW(); SELECT global.time_zone, session.time_zone;如果NOW()结果正确而业务系统读出来还是错的问题往往出在连接层。JDBC 连接串可以加serverTimezoneAsia/Shanghai但治本的办法还是数据库固定时区应用和数据库统一用北京时间。认证插件的问题我再补充一句安装完成后如果你想确认当前用户用的认证方式SELECT user, host, plugin FROM mysql.user;看到rootlocalhost的 plugin 是caching_sha2_password就说明正在用新版认证。这一栏信息在排查老客户端连接问题时非常有用。6.4 端口被占用、服务起不来的处理端口被占用这个也很常见。如果启动时报Port 3306 is already in use先确认是不是机器上已经装了另一个 MySQL 或 MariaDB。Windows 下用netstat -ano | findstr 3306Linux 下用ss -tlnp | grep 3306如果确认有别的进程占用要么停掉旧服务要么把新 MySQL 的端口改掉。改端口只需要配置port3307但别忘了防火墙和客户端连接参数都要跟着改否则又是一堆连不上的问题。服务起不来的另一个常见原因是数据目录权限不对。Linux 下如果错误日志里出现Permission denied大概率是/var/lib/mysql目录的所有者不是 mysql 用户。解决办法chown -R mysql:mysql /var/lib/mysql这个错误在手动迁移数据目录时特别容易触发YUM 安装一般不会遇到。最后提醒一句遇到问题先看日志。MySQL 错误日志默认在/var/log/mysqld.logLinux或数据目录下的*.err文件Windows里面写明了启动失败的原因。大部分问题其实一眼就能从日志里定位比漫无目的地百度高效得多。我个人实际操作中的习惯是装完 MySQL 之后第一时间把my.ini或my.cnf备份一份再把初始临时密码记录下来最后把整个安装过程整理成一段命令笔记。这个习惯帮我省了非常多返工时间。这文章虽然叫“纯文字版”但我更愿意把它理解成一份可以照着执行的完整清单你按这个顺序走下来MySQL 8.0 不难装也不该难装。