ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL安装教程:Windows、Linux、Docker全攻略

MySQL安装教程:Windows、Linux、Docker全攻略 一提到 mysql 安装教程很多人脑子里都是下载、下一步、下一步、完成。真这么顺利当然好但我在实际环境里见过太多翻车现场Windows 上服务起来了却登录不进去Linux 上装完找不到临时密码Docker 启动两秒就退出。这篇文章把 Windows、Linux、Docker 三条路线都走一遍每一步选型理由、初始化细节和常见坑都写清楚无论你是刚接触 MySQL 的新手还是已经被安装问题折磨过的老油条都能照着操作。内容会涉及官方下载渠道、my.ini、rpm 安装、systemd、防火墙、SSL 连接错误以及卸载残留都是一线装机时真正会碰到的问题。1. 装 MySQL 前先花五分钟确认这三件事1.1 选哪个版本8.0 是默认答案5.7 要慎重很多新手下载时直接搜“mysql 下载官网”进去后看到一堆版本号就懵了。我的建议很简单新装环境无脑选MySQL 8.0系列。8.0 从 2018 年发布到现在已经非常成熟性能、JSON 支持、窗口函数、公共表表达式都比 5.7 强一截官方也把更多精力放在 8.0 和 8.4 上。那 5.7 还有人用吗有但大部分是因为老项目、老驱动或者 DBA 团队的历史包袱。网上经常有人问“为什么 5.7.43 之后直接跳到 5.7.44后来又不出 5.7.45 了”其实就是 5.7 已经进入生命周期末尾5.7.44 基本是官方合并的最后一个补丁版本后面不会再有大版本更新。如果没人逼你必须用 5.7不要为了“稳定”去选一个快要停更的版本那才是真的不稳定。另外要留意 8.0 默认的认证插件是caching_sha2_password老客户端工具如果不升级可能会报Authentication plugin caching_sha2_password cannot be loaded或者 SSL 连接错误。这不是 MySQL 坏了而是驱动太老。后面第 5 章和第 6 章我会专门讲兼容性处理。1.2 安装方式对比解压包、系统包管理器还是 Docker同是装 MySQL方式不一样后面的维护习惯也不一样。我把常见三种方式放在一起对比安装方式优点缺点适合场景官方 ZIP / TAR 二进制包目录可控、版本精确、无自动默认配置初始化、服务注册、环境变量都要自己来Windows 本机开发、定制化部署系统包管理器apt / yum / dnf依赖处理省心、systemd 集成、开机自启方便版本可能不是最新目录分散在 /etc、/var 各处Linux 服务器、生产环境Docker环境隔离、起停干净、一个镜像搞定数据卷权限、端口映射、容器内调试有门槛本地快速测试、CI 环境、微服务部署说实话本地开发我首选解压包因为你看得到文件在哪、配置在哪出了问题好查。Linux 服务器上我推荐官方仓库或系统包管理器毕竟生产环境需要的是稳定和易维护。Docker 适合你不想污染本机环境或者想一句话切多个 MySQL 版本的情况。1.3 认准官方下载渠道别碰第三方“一键安装”下载地址我只认一个https://dev.mysql.com/downloads/mysql/。进去之后选MySQL Community Server这里才是社区版官方发布页。不要从乱七八糟的“高速下载站”下很多第三方打包器会带推广软件甚至改了默认配置。下载前先确认两件事操作系统位数Windows 现在基本是 64 位Linux 上先跑uname -m看是x86_64还是aarch64别下错平台包。包类型Windows 有MySQL Installer和ZIP Archive两种建议选 ZIPLinux 有Linux - Generic (glibc)TAR 包也有各种发行版的 RPM / DEB 包。直接用系统包管理器走官方仓库比手动 TAR 解压省事。另外别为了图快使用所谓“绿色版”“破解版管理工具”。连接工具用 MySQL Workbench、DBeaver Community 就够用旧版破解 Navicat 不仅容易中招连接 8.0 还经常被认证插件挡在外面。2. Windows 上装 MySQL 8.0从 ZIP 解压到命令行跑通2.1 下载 ZIP 而不是 InstallerWindows 下我推荐下载ZIP Archive而不是一键 Installer。理由很简单Installer 默认安装到C:\Program Files\MySQL还附带一堆你用不到的组件卸载也麻烦ZIP 解压后就是一个独立的 MySQL 目录想挪就挪想删就删。假设你下载的是mysql-8.0.44-winx64.zip解压到D:\mysql注意两点目录不要带中文不要带空格。比如D:\软件\mysql这种路径后面初始化时可能因为字符编码出奇怪问题D:\Program Files\mysql这种带空格的路径命令行里要不停加引号纯粹给自己找罪受。解压完先不要急着双击任何 exe。第一步是进入D:\mysql\bin确认有mysqld.exe。如果只有一堆文件没有 mysqld说明下成了源码包或者下载不完整重新下载。2.2 写对 my.ini初始化数据目录ZIP 包默认没有配置文件MySQL 启动时会用一堆内置默认值这样也能跑但字符集、端口、数据目录没法控制。所以我们要手动建一个my.ini放在D:\mysql根目录下。[mysqld] basedirD:/mysql datadirD:/mysql/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineINNODB max_connections200 [client] default-character-setutf8mb4这里最关键的是basedir和datadir路径里的反斜杠要么写成两个\\要么像我一样直接用正斜杠/避免 Python 风格转义问题。datadir是数据目录第一次跑的时候它会自动创建。配置写好后打开一个管理员权限的 CMD进入D:\mysql\bin执行初始化命令mysqld --initialize-insecure我习惯用--initialize-insecure因为它会生成一个空密码的 root 账号方便首次登录。不带--insecure的mysqld --initialize会生成一长串随机临时密码藏在D:\mysql\data\*.err里新手经常找不到。初始化完成后确认D:\mysql\data目录下出现了 开头的错误日志文件简单扫一眼没有 ERROR就算成功。2.3 把 MySQL 注册成 Windows 服务数据目录初始化好之后每次手动敲mysqld --console启动太原始了。我推荐把 MySQL 注册成 Windows 服务这样开机自启、服务管理都方便。还是在管理员 CMD 里执行mysqld --install MySQL --defaults-fileD:/mysql/my.ini如果返回Service successfully installed.说明注册成功。接着启动服务net start MySQL启动时如果报“服务无法启动”先不要重装。最快的排查方法是直接去看日志mysqld --console用--console会把错误直接打到屏幕上多数情况是my.ini路径写错、datadir权限不对或者端口 3306 被其他程序占了。我之前遇到过 SQL Server 监听 1433但也有别的程序占用 3306把端口改成 3307 就正常了。2.4 首次登录、改密码、配置环境变量服务启动后Windows 的 MySQL 默认允许 root 空密码登录。执行mysql -uroot -p提示输密码时直接回车。进入mysql提示符后马上把密码改掉ALTER USER rootlocalhost IDENTIFIED BY YourPassw0rd!; FLUSH PRIVILEGES; EXIT;注意 MySQL 8.0 默认密码策略要求至少一个大写字母、一个小写字母、一个数字、一个特殊字符长度至少 8 位。如果你用123456这种弱密码大概率会被直接拒绝。这不是 Bug是安全策略。最后一步是配置环境变量。在“系统属性 - 高级 - 环境变量 - Path”里新建一条D:\mysql\bin。配好之后新开一个 CMD输mysql --version能直接看到版本号以后就不需要每次cd到 bin 目录再执行命令了。3. Linux 下三种安装姿势apt、官方仓库和 RPM 裸装3.1 Ubuntu / Debianapt 一把梭Ubuntu 和 Debian 下最简单的方式是直接从系统仓库装sudo apt update sudo apt install mysql-server sudo systemctl enable --now mysql装完后执行sudo mysql注意不能直接mysql -uroot -p。Debian/Ubuntu 的 MySQL 默认 root 用的是auth_socket插件只允许系统 root 用户通过sudo mysql登录。如果后面你的 Java 程序要用 root 连需要先把 root 改成密码认证ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY YourPassw0rd!; FLUSH PRIVILEGES;改完再敲mysql -uroot -p就能正常登录了。用 apt 装的 MySQL目录分散在/var/lib/mysql数据、/etc/mysql配置、/var/log/mysql日志这点和 Windows ZIP 包完全不一样找配置时别只盯着一个地方。3.2 CentOS / RHEL官方仓库是最省事的方式CentOS 和 RHEL 上系统自带的仓库里 MySQL 经常是 MariaDB如果直接yum install mysql装出来的可能不是 MySQL。正确姿势是先装官方仓库sudo yum install https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm注意 el9 对应 RHEL 9 系列如果是 CentOS 7要选 el7 对应的 release 包。装完官方仓库后sudo yum install mysql-community-server sudo systemctl enable --now mysqldCentOS/RHEL 用mysqld作为服务名不像 apt 装完叫mysql。这一步非常容易混淆。启动后再登录就要用临时密码了。在/var/log/mysqld.log里找sudo grep temporary password /var/log/mysqld.log复制那串临时密码执行mysql -uroot -p登录进去后MySQL 会强制你改掉临时密码ALTER USER rootlocalhost IDENTIFIED BY YourPassw0rd!;3.3 直接 RPM 裸装的依赖坑有一部分同学喜欢去官网下 RPM 包然后rpm -ivh mysql-community-server-*.rpm一个个装结果经常看到libaio.so.1()(64bit) is needed by mysql-community-server libncurses.so.5()(64bit) is needed by mysql-community-server这就是典型的依赖缺失。MySQL 官方把所有组件打成一个 bundle 下载时里面包含 server、client、common、libs 好几个 RPM手工rpm -ivh容易因为依赖顺序乱掉而失败。正确做法是让包管理器自动处理依赖sudo yum localinstall mysql-community-*.rpm或者sudo dnf install ./mysql-community-server-*.rpm这样包管理器会去已配置的仓库里补全依赖比自己rpm -ivh逐个强敲靠谱得多。RPM 裸装适合离线内网环境但前提是你把依赖包一次性下载齐全。3.4 启动、开机自启、防火墙一个都不能少Linux 上装完 MySQL不接受“现在能连重启服务器就失联”这种状态。先把开机自启打开sudo systemctl enable mysqld sudo systemctl start mysqld sudo systemctl status mysqldstatus输出里看到active (running)才算启动成功。然后检查端口是否在监听sudo ss -lntp | grep 3306如果只能看到127.0.0.1:3306说明 MySQL 默认或配置文件里设置了bind-address127.0.0.1。这不是不能连而是只能本机连。远程要访问必须改配置和防火墙sudo firewall-cmd --add-port3306/tcp --permanent sudo firewall-cmd --reloadUbuntu 上则是sudo ufw allow 3306/tcp防火墙放行后还要确认 MySQL 配置里bind-address不是固定回环地址。如果是改成0.0.0.0再重启服务。这个我放到第 5 章细讲。4. Docker 跑 MySQL两条命令起步四个失败原因排查4.1 基础启动命令和参数解释Docker 装 MySQL 核心就一条命令docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourPassw0rd! \ -v mysql8_data:/var/lib/mysql \ mysql:8.0三个参数必须理解-p 3306:3306把容器的 3306 映射到宿主机 3306外部程序才能连。-e MYSQL_ROOT_PASSWORD只在数据卷为空、首次初始化时生效。如果数据卷已经有了旧数据再改这个环境变量不会改密码很多人栽在这。-v mysql8_data:/var/lib/mysql数据卷让数据存在容器外。不加这句你docker rm mysql8之后数据就全没了。如果你只想快速体验不关心持久化可以省掉-v。但真实项目里一定要加否则删容器等于删数据库。4.2 失败原因一数据目录权限不对Docker 装 MySQL 失败最经典的是这样启动docker run -d --name mysql8 \ -v /home/user/mysql-data:/var/lib/mysql \ mysql:8.0然后docker logs mysql8里看到[ERROR] mysqld: Cant read dir of /var/lib/mysql/ (OS errno 13 - Permission denied)原因很简单容器里的 MySQL 进程是以 UID 999 的mysql用户跑的而宿主机/home/user/mysql-data目录的属主是user权限是 755容器里的 mysql 用户没有写权限。解决方式sudo chown -R 999:999 /home/user/mysql-data或者不用宿主机目录直接用 Docker 命名卷docker volume create mysql8_data命名卷由 Docker 管理不存在 UID 冲突问题这是更省心的选择。4.3 失败原因二端口被占用、内存不足、镜像拉取超时有同学启动容器后秒退docker ps看不到容器先跑docker logs mysql8 --tail 50看日志。常见的几个原因端口被占用[ERROR] [MY-010146] bind() failed: Address already in use本地已经有一个 MySQL 或别的进程占了 3306。改端口映射就行docker run -d --name mysql8 -p 3307:3306 ...内存不足[ERROR] InnoDB: Cannot allocate memory for the buffer pool默认 InnoDB buffer pool 可能超过机器内存加启动参数限制docker run -d --name mysql8 --innodb-buffer-pool-size256M ...注意这是 mysqld 参数要放在镜像名后面docker run -d --name mysql8 mysql:8.0 --innodb-buffer-pool-size256M镜像拉取超时国内网络环境拉mysql:8.0经常卡住。可以在 Docker 配置里设置镜像加速地址然后重新docker pull mysql:8.0。加速地址一般是镜像服务商提供建议用你所在云平台自带的加速源。4.4 容器日常运维日志、进入容器执行 SQL、修改配置容器方式调试 MySQL 和本机不太一样常用四个操作查看日志docker logs mysql8 --tail 100进入容器执行 SQLdocker exec -it mysql8 mysql -uroot -p查看容器内的配置文件docker exec -it mysql8 cat /etc/my.cnf修改配置后重启docker restart mysql8如果你习惯了本机 MySQL用 Docker 初期会觉得不顺手但熟练之后会发现“删掉重来”太方便了。测试某个新版本或新参数起一个容器跑完就删完全不影响宿主机。5. 远程连接和安全加固从 bind-address 到业务账号5.1 先看 bind-address 和防火墙本机能连、远程连不上90% 是 bind-address 或防火墙的问题。MySQL 默认在某些发行版里只监听回环地址127.0.0.1默认配置里可能出现bind-address 127.0.0.1改成bind-address 0.0.0.0然后重启 MySQL。改完先验证监听地址Windows 下netstat -ano | findstr :3306Linux 下sudo ss -lntp | grep 3306如果看到0.0.0.0:3306或*:3306说明监听关系没问题。接下来再看防火墙放行没有Windows 弹窗里允许 MySQL 通信Linux 用前面提到的firewall-cmd或ufw。如果你用的是云服务器还要检查安全组规则。云厂商安全组不放行 3306你在服务器内部把防火墙关了都连不上。5.2 用业务账号连接数据库别让 root 满天飞装完 MySQL 第一时间应该做的不是配远程 root而是创建业务账号。我见过很多项目直接把 root 密码写在 JDBC 配置里还允许 root 远程登录这是最危险的操作。建议这样创建CREATE DATABASE app_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER app_user% IDENTIFIED BY App123456; GRANT ALL PRIVILEGES ON app_db.* TO app_user%; FLUSH PRIVILEGES;这里%表示允许从任意主机登录。如果是内网固定 IP最好把%换成具体 IP比如192.168.1.10减小暴露面。业务账号只给app_db库的权限不要给全局权限。后续如果程序被攻击攻击者能碰到的也只是这一个库损失能控制住。5.3 字符集、密码策略和默认值为 0 这类小配置连接正常后建议顺手检查字符集。SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE collation_server;中文乱码大多因为服务器默认字符集不是utf8mb4。MySQL 8.0 默认倒是utf8mb4但如果你是从 5.7 升上来的字符集可能还是旧的。在 Linux 的/etc/my.cnf或 Windows 的my.ini里加上[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci另外很多人被“mysql 设置默认值为 0”这个问题卡住。建表时如果日期字段想设置DEFAULT 0MySQL 的sql_mode里默认可能带着NO_ZERO_DATE会直接报错。排查方式SELECT sql_mode;确认有无NO_ZERO_DATE有就把它从sql_mode里去掉再重启。对于非日期字段DEFAULT 0一般没关系。密码策略也可以通过变量调整SHOW VARIABLES LIKE validate_password%;开发环境嫌策略太严可以降低要求SET GLOBAL validate_password.policy LOW;注意这只是全局会话级别重启后会恢复要永久改还是写在配置文件里。5.4 客户端驱动连接串的兼容问题Java 项目连接 MySQL 8.0 时最常见的问题之一是Public Key Retrieval is not allowed这是因为 8.0 的caching_sha2_password插件在非 SSL 连接下需要获取服务器公钥而客户端驱动默认不允许。解决方式是在连接串里加上两个参数jdbc:mysql://localhost:3306/app_db?sslModeDISABLEDallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaisslModeDISABLED是告诉驱动不走 SSLallowPublicKeyRetrievaltrue是允许获取公钥。这两个参数在本地开发环境特别有用但生产环境尽量用 SSL 加密连接不要长期禁用。如果是旧版 JDBC 驱动可能不认识sslMode这个参数那就用旧写法jdbc:mysql://localhost:3306/app_db?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai但更推荐直接把驱动升级到 8.0 系列的最新版本新驱动对 MySQL 8 的支持完善很多。6. 安装结束后最容易碰到的报错SSL、0xe0434352 和端口占用6.1 mysql ssl 连接错误先升级驱动再谈禁用 SSLMySQL 8.0 默认启用 SSL很多旧版客户端在连接时直接报ERROR 2026 (HY000): SSL connection error: protocol version mismatch或者SSL connection error: unknown error number根因通常是客户端或驱动使用的 TLS 版本太老而 8.0 默认禁用了 TLSv1.0、TLSv1.1。排查思路先看服务器支持的 TLS 版本SHOW VARIABLES LIKE tls_version;升级客户端工具到新版本。比如在 Linux 上用旧版mysql命令行就安装新的mysql-client。真着急可以在命令行临时跳过 SSLmysql --ssl-modeDISABLED -uroot -p这个只是绕过 SSL 握手问题密码传输仍然以安全方式处理但数据链路不加密。生产环境还是优先升级驱动不要长期禁用 SSL。如果项目里用的是 JDBC连接串里加sslModeDISABLED再次强调这只是排查阶段的临时手段。6.2 事件查看器里的 0xe0434352别先怀疑 MySQLWindows 上有一个很误导人的现象MySQL 服务正常运行但打开 MySQL Workbench 或某些图形工具时秒崩Windows 事件查看器里记录异常代码0xe0434352。看到这个代码先别怀疑 MySQL 本体。0xe0434352是 .NET Runtime 抛出的异常编号不是 MySQL 的错误码通常和 .NET 组件损坏、Visual C 运行库缺失或管理工具版本太旧有关。解决办法安装最新.NET Framework 4.8。安装最新的Microsoft Visual C Redistributable。把 MySQL Workbench 或连接工具升级到新版本。大部分情况下做完这三步就正常了。如果你在服务端要用命令行连接 MySQL直接mysql -uroot -p就能绕开图形工具这一层。6.3 端口 10061、Access denied、临时密码过期还有几个高频报错放在一起说报错信息原因处理Cant connect to MySQL server on localhost (10061)服务没启动或端口不对确认net start MySQL检查端口是否 3306Access denied for user rootlocalhost密码错误或 root 认证方式不对用正确密码重试或重置密码Your password has expired安装时强制密码过期策略执行ALTER USER rootlocalhost IDENTIFIED BY 新密码;ERROR 1130: Host x.x.x.x is not allowed to connectroot 账号没有远程主机授权创建业务账号或给 root 授权root%但不推荐遇到这些问题思路是先确认服务在跑再确认端口通最后确认账号权限。不要一上来就重装重装解决不了权限配置问题。6.4 root 密码忘记后的临时修复安装在手root 密码忘了还有一招先停掉 MySQL 服务Windowsnet stop MySQLLinuxsudo systemctl stop mysqld然后以跳过权限表方式启动mysqld --skip-grant-tables --shared-memoryWindows 上需要开一个管理员 CMD 在前台运行Linux 上直接在前台跑也行。此时不需要密码就能进去mysql -uroot进去后立刻执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPassw0rd!;改完密码后关闭这个进程再正常启动服务。注意--skip-grant-tables启动期间 MySQL 是裸奔状态任何本机能连接到 3306 的客户端都能无密码登录所以只能在内网本机临时用改完密码必须马上恢复。7. 卸载重装不翻车Windows、Linux、Docker 的残留清理7.1 Windows 卸载服务、目录、环境变量Windows 上重装 MySQL 反复失败八成是没卸载干净。正确的卸载顺序是停止并删除服务net stop MySQL mysqld --remove MySQLmysqld --remove已经包含了删除服务的动作如果提示服务不存在再用管理员 CMD 执行sc delete MySQL。删除整个 MySQL 目录包括D:\mysql和数据目录。清理环境变量里D:\mysql\bin的 Path 条目。如果安装过 Installer 版去C:\Program Files\MySQL和C:\ProgramData\MySQL看有没有残留ProgramData 是隐藏目录很多人会漏掉。7.2 Linux 卸载包和数据目录Ubuntu 上彻底卸载sudo systemctl stop mysql sudo apt purge mysql-server mysql-client mysql-common sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysqlCentOS / RHEL 上sudo systemctl stop mysqld sudo yum remove mysql-community-server mysql-community-client mysql-community-common sudo rm -rf /var/lib/mysql sudo rm -rf /etc/my.cnf/var/lib/mysql是数据目录如果只是升级软件不想删数据这步可以跳过。但如果遇到数据文件损坏或者不兼容留着旧数据重装照样报错该删就删。7.3 Docker 卸载容器、镜像、数据卷Docker 卸载 MySQL 看起来就三条命令但很多人忘了删数据卷docker stop mysql8 docker rm mysql8 docker rmi mysql:8.0 docker volume rm mysql8_data如果docker volume rm提示 volume 正在被占用先把容器删掉再执行。数据卷不删下次再跑docker run带相同卷名时会复用旧数据你设置的新MYSQL_ROOT_PASSWORD根本不会生效。这也是为什么我前面说要先确认“数据卷是否有旧数据”很多人在 Docker 里“重装” MySQL装完了密码不对就是这个原因。说点实在的。我每次帮别人排查 MySQL 安装问题最后都会强调一句所有报错第一件事是看日志不是复制报错去群里问。Windows 看D:\mysql\data下的.err文件Linux 看/var/log/mysqld.logDocker 直接docker logs mysql8。日志里通常已经把原因写得明明白白端口占用、目录权限、密码策略不满足都是直给的。先把日志看明白再动手改配置比反复重装省太多时间。希望这篇 mysql 安装教程能帮你把最耗时的装机环节一次走通。
返回列表