1. 先搞清楚:你现在该装的到底是哪个MySQL
如果你在搜索引擎里敲下“mysql下载”或者“mysql安装教程”,大概率会遇到第一道坎:官网那一堆版本和发行版,到底选哪个?更迷惑的是,很多教程说自己是 MySQL,但一看安装包名字是 MariaDB 或者 Percona Server,这算不算 MySQL?我的建议是:先把版本这件事理清楚,否则后面所有的踩坑都会加倍。
1.1 MySQL 8.0和5.7怎么选——版本差异和现实考量
现在的主流选择就两个:5.7 和 8.0。别去看 5.6 了,它已经 EOL 很久,安全补丁都不更新了,新项目再用它属于给自己埋雷。5.7 是前些年的绝对主力,稳定、资料多、几乎所有老项目都在它上面跑;8.0 是当前长期支持版本,也是新项目的默认选择。
我见过很多人纠结“8.0会不会不兼容”,实际上从 5.7 迁到 8.0,大部分业务 SQL 不用改,真正要留意的是这么几个差异。第一,8.0 默认认证插件改成了 caching_sha2_password,老客户端(比如 5.x 的 JDBC 驱动、老版本 Navicat)直接连不上,报错就是你经常搜到的那句 Client does not support authentication protocol requested by server。第二,8.0 移除了 query cache,因为它在高并发下反而成为瓶颈,所以网上那些“开启 query cache 提升性能”的老文章,在 8.0 上直接无效。第三,8.0 的 GROUP BY 不再隐式排序,以前写 GROUP BY id 期待结果按 id 排序的同学,升级后会发现顺序变了。
如果是从零开始学、或者做新项目,我建议直接上 8.0;如果是要维护老系统,就老实用 5.7,别为了“新”随便动生产环境。还有一种情况是公司里用的云数据库,比如阿里云 RDS、腾讯云 CDB,它们底层虽然也是 MySQL,但控制台、备份恢复、参数模板这些操作都是封装过的,部署方式跟自建完全不同,后面我会单独讲到。
1.2 发行版不等于MySQL:MariaDB、Percona Server和一众云RDS的区别
很多人不知道,MySQL 这个项目早期是 MySQL AB 公司的,后来被 Sun 收购,Sun 又被 Oracle 收购,所以现在 MySQL 的版权在 Oracle 手里。MariaDB 是 MySQL 创始人 Monty 在 Oracle 收购后分支出来的社区版本,API、命令、存储引擎基本兼容,所以很多 Linux 发行版默认的“mysql”命令,实际指向的其实是 MariaDB。比如 CentOS 7 自带的 mariadb-server,你 yum install mysql 装出来的其实是 MariaDB。这本身不是问题,但如果你照着 MySQL 官方文档去操作,会发现某些系统表、参数名对不上,容易产生困惑。
Percona Server 则是另一个兼容分支,主打性能优化和运维增强,像 pt-query-digest、XtraBackup 这些工具都是 Percona 家的。平时学习、开发直接用官方 MySQL 就够了,生产环境如果公司有 DBA 团队,可能会基于 Percona 自建,但这不是新手阶段需要操心的。
云 RDS 就更特殊了,它把 MySQL 的安装、高可用、备份都封装好了,你在控制台点几下就能得到一个实例,但代价是你拿不到服务器 root 权限,很多系统参数改不了,my.cnf 也不是随便能动的。用云 RDS 的时候,重点是学会控制台上的参数组、白名单、备份恢复这些功能,而不是去纠结配置文件。
一句话总结:自己装,选 Oracle 官方 MySQL 8.0;图省心,直接买云 RDS;在 Linux 上看到 MariaDB 别慌,它绝大多数行为跟 MySQL 一致,但排查问题时心里要清楚自己到底用的哪个。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种部署方式,按场景各取所需
装 MySQL 这件事,看起来简单,实际上每个平台都有各自的坑。我尽量把 Windows、Linux、Docker 三种方式分别讲清楚,你只需要挑一条符合自己场景的路走就行。
2.1 Windows安装:最省心也最容易踩权限坑的一路
Windows 下安装 MySQL 有两个路径:一个是下载 .msi 安装包,图形化点下一步;另一个是下载 .zip 压缩包,手动初始化。.msi 适合纯新手,安装过程中会引导你设置 root 密码、配置端口、选择字符集,基本不会出错。但有个细节:安装到“Windows Service”那一步时,建议把服务名改成 MySQL80 这种带版本号的,别用默认的 MySQL,否则以后电脑上装了多个实例会互相冲突。
.zip 方式更适合开发者,因为它干净、可控、卸载也方便。步骤大概是:解压到 C:\mysql,然后在目录下新建 my.ini,关键内容如下:
ini复制[mysqld]
basedir=C:/mysql
datadir=C:/mysql/data
port=3306
character-set-server=utf8mb4
default-storage-engine=InnoDB
[client]
default-character-set=utf8mb4
然后用管理员权限打开命令行,执行初始化命令:
bash复制mysqld --initialize-insecure
注意,--initialize 会生成一个随机 root 密码,--initialize-insecure 则是把 root 初始化为空密码。新手建议用后者,初始化完直接 net start mysql,然后 mysql -u root -p 回车就能进去,进去后再改密码。若你用的是 5.7 以下的老版本,没有 --initialize 参数,直接运行 mysqld --console 就能启动,但 8.0 以后必须初始化。
Windows 上最常见的报错是“服务没有响应控制功能”或者“发生系统错误 5”,这俩基本都是权限问题——服务启动需要管理员权限,把命令行工具用“以管理员身份运行”打开再执行一次即可。还有“安装 mysql 启动服务报错”这种,十有八九是 my.ini 里配置了不存在的目录路径,比如 datadir 指向了没创建的文件夹,MySQL 起不来就会报错,检查 C:\ProgramData\MySQL\MySQL Server 8.0\Data 目录下的 .err 日志,比在搜索引擎里盲猜快得多。
2.2 Linux安装:生产环境的标准玩法
Linux 上安装无非两种途径:用包管理器装,或者用官方 tar.gz 二进制包手动部署。包管理器最省事,Ubuntu 系用 apt install mysql-server,CentOS/RHEL 系用 yum install mysql-server,装完自动注册 systemd 服务,systemctl start mysqld 就能启动。
但要注意,CentOS 7 默认源里没有 MySQL,只有 MariaDB。想装真正的 MySQL,需要先添加 MySQL 官方 yum 源:
bash复制rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum install mysql-community-server
装完后启动前,MySQL 8.0 会自动生成一个临时 root 密码,存放在 /var/log/mysqld.log 里:
bash复制grep 'temporary password' /var/log/mysqld.log
然后用这个临时密码登录,登录后必须立刻改密码,否则你什么都干不了。如果你是在内网环境无法访问外网,那就用 tar.gz 二进制包,把它解压到 /usr/local/mysql,创建 mysql 用户,再手动执行 mysqld --initialize 初始化。这里有个老手习惯:不要用 root 用户直接运行 mysqld,MySQL 官方明确要求用独立低权限用户运行,否则会有安全隐患。
Linux 下安装完后还有几个需要手动处理的点:防火墙放行 3306 端口,firewall-cmd --add-port=3306/tcp --permanent;SELinux 如果开着,需要 setsebool -P httpd_can_network_connect_db 1 或者直接给 MySQL 数据目录设置正确的上下文;远程连接默认是禁止的,需要给用户授权 'user'@'%'。
2.3 Docker一把梭:本地开发和测试环境的最优解
Docker 装 MySQL 是我现在最推荐的方式,尤其是本地开发环境。好处是干净、可重复、不污染宿主机,删了重来也就几秒钟的事。官方镜像一条命令就能跑起来:
bash复制docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=testdb \
-v /my/own/datadir:/var/lib/mysql \
mysql:8.0
这条命令里有几个值得说说的参数。-e MYSQL_ROOT_PASSWORD 是设置 root 密码;MYSQL_DATABASE 会在首次启动时自动创建一个数据库,省得进去再 CREATE DATABASE;-v 把容器里的数据目录挂载到宿主机,这样容器删了数据还在,生产环境必须挂载,不然 Docker 一重建数据全没了。
Docker 方式最常遇到的问题就是 3306 端口被宿主机上已有的 MySQL 占用了。解决方案有两个,一个是换映射端口,比如 -p 3307:3306,连接时用 3307;另一个是在 Docker Compose 里对每个服务映射不同的宿主机端口。我个人习惯是把宿主机 3306 留给固定环境,Docker 测试环境用 3307、3308 这种,避免冲突。
还有个细节:MySQL 官方镜像默认的字符集不是 utf8mb4,如果你要存 emoji 或者生僻字,最好在启动命令里加 `--character-set-serve
