ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL安装全攻略:Windows与Linux各方式对比与避坑指南

MySQL安装全攻略:Windows与Linux各方式对比与避坑指南 写这篇东西的起因挺简单前两天帮一个刚转行的同事排查环境问题他在 Windows 笔记本上能跑通的 MySQL 库换到公司 Linux 服务器上就玩不转了。折腾半天发现不是代码问题纯粹是两边安装方式不一样初始化的行为也不同。类似的混乱我见太多了——开发机上用安装包一路下一步生产机上用包管理器装完连 root 密码都不知道在哪看。所以干脆把 MySQL 在 Windows 和 Linux 下常见的几种安装方式完整梳理一遍从原理到实操、从选型到避坑一次性讲透。这篇文章的核心内容覆盖整个 MySQL 部署生命周期装之前要做什么规划、Windows 下的 MSI 和 ZIP 安装、Linux 下的 apt/yum 和二进制包安装、装完之后的初始化和服务配置、还有远程访问授权和防火墙。适合两类人看一类是刚入门、只知道双击下一步的初学者另一类是已经会装但没系统对比过各种方式差异、想搞清楚“为什么生产环境要用这种方式”的运维和开发。1. 装之前先想明白版本、端口和目录规划很多人装 MySQL 失败或者装完不好用根本不是安装步骤出了问题而是装之前根本没想清楚三个问题用哪个版本、端口要不要改、数据目录放在哪。先说版本。目前主流是 MySQL 8.05.7 已经停止维护社区版连安全更新都不再发布了。如果你还在盲目下载 5.7真不如直接上 8.0。8.0 和 5.7 在安装层面的最大差异体现在两点一是 8.0 默认字符集是 utf8mb4而 5.7 安装完后默认还是 latin1数据表建完之后再改字符集非常痛苦二是 8.0 的密码认证插件默认是 caching_sha2_password老版本客户端连接不上得改认证方式这个细节后面会细说。再说端口。3306 是 MySQL 默认端口绝大多数场景不用改。但如果你同一台机器要跑多个实例或者公司安全基线要求端口不能走默认那就要在安装阶段把端口定下来。这里有个很多人忽略的问题MySQL 8.0 的 MySQL X Protocol 默认走 33060 端口你在防火墙只放行 3306 的话有些 MySQL Workbench 的新功能会连不上这个不算故障但容易让人误会。最后说目录规划这可能是最容易被忽略的事。Windows 下大家都习惯默认装到 C:\Program Files\MySQL但如果 C 盘空间紧张数据库文件持续增长会让系统盘爆掉Linux 下更要注意/var/lib/mysql 是很多发行版默认的数据目录如果你当时分区时没单独给 /var 或者 /home 分够空间后面迁移数据目录会非常折腾。提示安装之前先确认三件事——版本选 8.0.x 最新稳定版端口默认沿用 3306分配前确认端口没被占用Windows 用 netstat -ano | findstr 3306Linux 用 ss -lntp | grep 3306数据目录单独规划尽量别放在系统盘。另外一个容易踩的坑是“要不要把 MySQL 的 bin 目录加入系统 PATH”。我的建议是加入这样你不论在哪个目录下都能直接敲 mysql 命令排查问题的时候效率高很多。Windows 下加 PATH 在“系统属性-环境变量”里操作Linux 下一般是软链接 /usr/bin/mysql 指向实际安装路径的 mysql 二进制或者修改 /etc/profile 追加 export PATH。安装方式不同这个操作的侧重也不同下面分平台展开。2. Windows 下最常见的三条路MSI、绿色版 ZIP 和 Docker2.1 MSI 安装包图形化引导适合开发机MSI 是 Windows 上体验最接近“双击安装”的方式。官网 Downloads 页面选择 MySQL Community Server然后挑 Windows (x86, 32-bit), MSI Installer 这个类型下载。MSI 安装程序带一个图形化的 MySQL Installer能同时管理 MySQL Server、Workbench、Shell、Router 等一系列组件。MSI 的安装流程基本是选安装类型Developer Default 会装一堆额外组件Server only 只装服务端、检查依赖、设置 root 密码、配置 Windows 服务名、执行安装。这里有几个实际经验值得说安装类型别贪多Developer Default 会带上 MySQL Workbench、Shell、Router、ODBC 等一大堆组件。如果只是本地开发选 Server only 最干净客户端工具有一个命令行足够了GUI 工具后面需要再装也不迟。密码设置时8.0 默认会启用密码校验强度组件 validate_password。你设个 123456 它会直接报错要求至少 8 位且混合大小写字母和数字。这是安全组件的正常行为不是安装出错了。配置 Windows 服务这一步服务名默认是 MySQL80建议保留默认启动类型选“自动”。这样开机自动启动省得每次手动 net start。MSI 装完后安装目录在 C:\Program Files\MySQL\MySQL Server 8.0数据目录默认在 C:\ProgramData\MySQL\MySQL Server 8.0\Data。注意 ProgramData 默认是隐藏文件夹想手动看数据文件得先在资源管理器里显示隐藏项目。MSI 最大的优点是省心最大的缺点是“黑盒”。很多刚入门的同学装完就忘了配置文件在哪出了问题完全无从下手。Windows 下 MySQL 的配置文件叫 my.ini默认读取顺序是 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini而不是安装目录里的那个。这个和 Linux 下的 /etc/my.cnf 逻辑上是一样的——配置文件不一定在你以为的位置。2.2 ZIP 绿色版免安装动手党最爱如果你不想用 MSI 安装器或者需要在 Windows 服务器上快速部署一个实例ZIP 归档版是更好的选择。官网下载页选择 Windows (x86, 64-bit), ZIP Archive下载后解压到目标目录比如 D:\mysql-8.0.40-winx64就算“安装”完成了一半。解压后的绿色版目录结构大概是这样的mysql-8.0.40-winx64/ ├── bin/ # 可执行文件mysqld、mysql、mysqldump 等 ├── docs/ # 文档 ├── include/ # 头文件编译插件时用 ├── lib/ # 库文件 ├── share/ # 错误信息、字符集等 └── my.ini # 配置文件初始没有需自己创建ZIP 版和 MSI 版在安装逻辑上的最大差异是MSI 版会自动初始化数据目录并生成系统库mysql 库、performance_schema 等而 ZIP 版默认没有 data 目录你必须手动初始化。这是绿色版唯一一个稍显繁琐的步骤但理解了它的原理后其实很简单——初始化就是执行一条 mysqld 命令让它生成 data 目录下的系统文件。手动初始化的步骤如下在解压目录下新建 my.ini这是 ZIP 版的核心配置文件。我的配置习惯如下[mysqld] # 安装目录 basedirD:/mysql-8.0.40-winx64 # 数据目录 datadirD:/mysql-8.0.40-winx64/data # 端口 port3306 # 字符集 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci [client] default-character-setutf8mb4这里有个特别容易被 Windows 用户坑到的地方路径里的分隔符统一用正斜杠/或者双反斜杠\\。在 my.ini 里写 D:\mysql\data 这种单反斜杠路径MySQL 解析时会把\m、\d当成转义字符处理导致路径找不到。我见过太多人栽在这个细节上。以管理员身份打开 CMD这一步很重要进入 bin 目录执行初始化命令mysqld --initialize-insecure关键区别在--initialize-insecure和--initialize之间。--initialize-insecure会生成一个 root 空密码账号适合本地开发--initialize会生成一个随机临时密码并把密码写入日志文件适合需要安全约束的生产环境。开发机直接用 insecure 就好少一道找密码的麻烦。初始化完成后data 目录就生成了。接下来把 mysqld 注册成 Windows 服务mysqld --install MySQL8这里的 MySQL8 是服务名可以自己定义。注册成功后用net start MySQL8启动服务。如果你不想注册服务也可以每次手动用 mysqld --console 在前台启动但这样 CMD 窗口一关 MySQL 就停了开发调试可以长期跑不建议。启动后连数据库验证mysql -uroot -p因为用的是--initialize-insecure提示输入密码时直接回车就能进入。进去后第一件事就是修改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;2.3 Docker 一条命令起库如果 Windows 上装了 Docker Desktop那第三种思路是直接跑容器。这种方式最大的好处是干净——不用在宿主机上装任何 MySQL 相关的包数据库运行在容器里删掉容器就是彻底卸载。docker run --name mysql8 \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -d mysql:8.0命令本身很简单但有几个细节必须注意容器里的 MySQL 数据目录是 /var/lib/mysql如果不做数据目录挂载容器删除后数据就全没了。生产环境务必加-v /d/mysql-data:/var/lib/mysql把数据持久化到宿主机。环境变量 MYSQL_ROOT_PASSWORD 是第一次初始化时生效的如果数据目录已经初始化过了再改这个环境变量也不会改密码。很多人在容器重建后觉得密码没生效原因就在这。镜像首次启动时会执行初始化脚本这个过程大概要 20-60 秒。如果容器启动后立刻去连很可能报 connection refused等一会儿再连就通了不算故障。Windows 上跑 Docker 容器性能和文件挂载效率都比 Linux 原生环境差一点本地开发体验没问题但如果你接触的是正式项目部署目标大概率还是 Linux 服务器这个下面来展开。3. Linux 下装 MySQL先分清你在用什么发行版Linux 下安装 MySQL 的方式和发行版的包管理体系强相关。Debian/Ubuntu 走 aptRHEL/Rocky/CentOS 走 yum/dnf另外还有一种不看发行版、通用性最强的二进制 tar 包安装。三种方式我都实际部署过下面按场景拆开讲。3.1 Debian/Ubuntu 的 apt 路线Ubuntu 上安装 MySQL 是最省事的官方软件源里直接就有。执行这三条命令sudo apt update sudo apt install mysql-server sudo systemctl status mysql这里有一个巨大的坑要提前说Debian 系默认的 mysql-server 包在某些版本里指向的是 MariaDB 的兼容包。具体来说Debian 10 及以后的默认源里apt install mysql-server有可能会装上一个提供 mysql 命令但实际上后端是 MariaDB 的版本。如果你明确要装 Oracle 官方的 MySQL不能用默认源得先把 MySQL 官方的 apt 仓库配进来。官方仓库的配置方法以 Ubuntu 22.04 为例# 下载 MySQL APT 配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb sudo dpkg -i mysql-apt-config_0.8.26-1_all.deb安装过程中会弹出图形化界面让你选择要安装的 MySQL 版本默认是 MySQL 8.0保持默认就行。配置完成后sudo apt update sudo apt install mysql-server用官方仓库装的好处是后续的升级维护都在 apt 体系内apt upgrade就可以一起更新 MySQL。坏处是官方仓库的包更新节奏比默认源慢安全修复可能会有延迟。apt 安装完成后MySQL 服务会自动启动并且 systemd 会注册一个叫 mysql 的服务。root 账号默认是通过 auth_socket 插件认证也就是说你在系统里用 sudo 身份直接可以免密登录 MySQLsudo mysql这是 Debian/Ubuntu 系特有的认证方式其他发行版并不都这样处理。很多人第一次用 Ubuntu 装完 MySQL发现 mysql -uroot -p 输入什么密码都报错其实是 root 账号根本没设置密码走的都是 socket 认证。想改成常规的密码登录执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码;注意这里显式指定了 mysql_native_password 插件。如果你不想改插件也可以保持 caching_sha2_password 默认插件命令改成ALTER USER rootlocalhost IDENTIFIED BY 新密码;3.2 RHEL/Rocky/CentOS 的 yum/dnf 路线Red Hat 系的默认源里是找不到 MySQL 的因为 RHEL 的开发重点是 PostgreSQL 和 MariaDB。在 Rocky Linux 或者 CentOS 上直接yum install mysql-server装到的是 MariaDB。要装 Oracle 官方的 MySQL必须通过 MySQL 官方提供的 yum 仓库。以 Rocky Linux 9 为例完整的安装流程是# 1. 导入官方仓库 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm # 2. 检查仓库是否生效 sudo dnf repolist | grep mysql # 3. 安装 sudo dnf install mysql-community-server这里的 el9 表示 RHEL 9 系版本Rocky Linux 9、Almalinux 9 都适用。如果你是 CentOS 7 或者类似的旧系统要下载 el7 版本注意别下混了——不同系统的仓库包不能混装依赖关系会乱掉。安装完成后启动服务sudo systemctl start mysqld sudo systemctl enable mysqldRHEL 系安装 MySQL 后有一个和 Ubuntu 截然不同的特点安装过程会自动生成一个临时 root 密码写到日志文件 /var/log/mysqld.log 里。你需要从这个日志里找到临时密码然后用它登录再修改密码sudo grep temporary password /var/log/mysqld.log输出类似[Note] A temporary password is generated for rootlocalhost: xxxxxx这个密码只在第一次登录时有效登录后系统会强制你修改密码。另外临时密码生成的规则同样受 validate_password 组件约束直接用短密码是改不掉的ALTER USER rootlocalhost IDENTIFIED BY 强密码-包含大小写数字符号;yum 路线适合不想折腾、快速部署的场景因为仓库里的包的依赖关系官方都已经处理好了libaio、libnuma 这些依赖不需要你自己装。缺点是你对安装内容几乎没有定制空间——目录是定死的数据目录 /var/lib/mysql配置文件 /etc/my.cnf版本也只能跟官方仓库当前版本走。3.3 二进制 tar 包不受包管理器约束的通用做法apt 和 yum 都有依赖发行版的环境约束如果你遇到的是特殊发行版、离线环境、内网服务器或者你就是要固定某一个特定 MySQL 小版本那二进制 tar 包是唯一靠谱的答案。这也是我认为每一个做运维的人都应该掌握的安装方式因为它的逻辑和原理不受系统差异影响。下载地址在 MySQL 官方下载页的 Community Server 里选 Linux - Generic下载类似mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz的文件。注意这里有个坑文件名里的 glibc2.28 是编译时依赖的 glibc 版本如果系统 glibc 版本太低运行时会报找不到版本的错误。查看系统 glibc 版本用ldd --version如果版本低于文件名中的版本就要找对应较低的版本下载。离线环境下下载好 tar 包后安装步骤如下# 1. 创建 mysql 用户和用户组security 要求使用专用账户运行服务 groupadd mysql useradd -r -g mysql -s /bin/false mysql # 2. 解压到 /usr/local 目录 tar xf mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz -C /usr/local/ # 3. 创建软链接方便版本升级 ln -s /usr/local/mysql-8.0.40-linux-glibc2.28-x86_64 /usr/local/mysql # 4. 创建数据目录并授权 mkdir -p /usr/local/mysql/data chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /usr/local/mysql/data然后手动初始化数据目录/usr/local/mysql/bin/mysqld \ --initialize \ --usermysql \ --basedir/usr/local/mysql \ --datadir/usr/local/mysql/data初始化完成后root 的临时密码会在错误日志里。错误日志的位置默认是在数据目录下文件名一般是主机名.err或者是 /var/log/mysql-error.log取决于你启动时是否指定了 log-error 参数。查看方式grep temporary password /usr/local/mysql/data/*.errtar 包装完还没有完——和包管理器安装不同tar 包不会自动注册 systemd 服务。我通常会在 /etc/systemd/system/mysqld.service 下手写一个 service 文件[Unit] DescriptionMySQL Server Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile/usr/local/mysql/data/mysqld.pid ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --daemonize --pid-file/usr/local/mysql/data/mysqld.pid ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s TERM $MAINPID Restarton-failure [Install] WantedBymulti-user.target配置文件 /etc/my.cnf 也需要自己创建哪怕什么都不配置也要建一个空文件否则 mysqld 会按照编译时的默认路径去找配置容易出歧义。我的最小配置文件[mysqld] basedir/usr/local/mysql datadir/usr/local/mysql/data port3306 socket/tmp/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci [client] socket/tmp/mysql.sock default-character-setutf8mb4最后加载并启动服务systemctl daemon-reload systemctl start mysqld systemctl enable mysqldtar 包方式看起来步骤多但可控性是最强的目录位置、配置文件、启动参数完全掌握在自己手里。如果装过源码编译版本会发现 tar 包其实就是“编译好的源码”省去了编译时间但保留了定制化安装的灵活性。4. 装完没有用初始化、服务与安全配置才是重点很多人觉得“安装完成”就等于“数据库能用了”实际差着十万八千里。无论你用上面哪种方式装好 MySQL都逃不过接下来的这一套收尾动作。4.1 初始化密码和 root 权限处理前面几部分已经穿插说了各种方式下的初始密码状态。这里做一个完整的汇总表方便排查安装方式初始 root 状态获取方式Windows MSI安装向导中设置自己设置的Windows ZIP由 --initialize 或 --initialize-insecure 决定随机密码看 data 目录下 .err 日志insecure 则空密码Ubuntu aptauth_socket 认证sudo mysql 直接免密登录RHEL yum随机密码grep temporary password /var/log/mysqld.log二进制 tar随机密码grep temporary password data 目录下 *.err 文件拿到初始权限后的第一件事不是建库建表而是处理 root 账号的登录限制问题。MySQL 默认的 root 账号只允许 localhost 登录这是合理的安全策略。但在实际工作中开发环境经常需要远程用 root 连接这时候就需要新建一个可以远程登录的账号而不是直接改 root改 root 的 host 为 % 虽然可行但会削弱本机安全边界不推荐CREATE USER root% IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; FLUSH PRIVILEGES;注意建账号时不要把用户名也起成 root完全可以建一个专门的管理员账号例如 admin权限根据需要授予这样后续回收权限时更灵活。4.2 服务管理和开机自启Windows 下 MSI 安装时已经注册了服务ZIP 版手动注册服务后同样会自动启动。Linux 下用 systemctl 管理服务是主流systemctl status mysqld # 查看服务状态 systemctl restart mysqld # 重启服务 systemctl enable mysqld # 开机自启 systemctl disable mysqld # 取消开机自启Ubuntu apt 装的服务名是 mysql 而不是 mysqld这是一个很容易踩坑的细节。你执行 systemctl status mysqld 会得到 “Unit mysqld.service could not be found” 的错误别慌换成 mysql 就行了。本质原因就是发行版打包时把服务名定义成了 mysql服务本身还是同一个进程。什么情况下需要手动重启 MySQL常见于修改了配置文件之后。MySQL 的配置参数分两类一类是动态参数可以在线用 SET GLOBAL 修改而无需重启另一类是静态参数必须写入配置文件并重启进程才能生效比如端口号、数据目录、字符集这些。你在 my.ini 或 my.cnf 里改了端口后不重启它是不生效的。重启前建议先验证配置是否合法mysqld --validate-config这个命令会检查配置文件的语法和参数值有问题会直接报错。生产环境改配置后先跑一遍再重启能避免一旦配置错误导致服务起不来、业务中断的情况。4.3 远程访问与防火墙如果你的 MySQL 不仅要本机访问还要被局域网内其他机器连除了授权远程账号还要处理两个层面。第一层是 MySQL 的监听地址默认配置下 MySQL 8.0 在 Linux 上监听 127.0.0.1也就是只允许本机连接。要接受远程连接需要修改配置中的 bind-address[mysqld] bind-address 0.0.0.0第二层是防火墙。Linux 下常见的是 firewalld 和 ufw。RHEL 系默认用 firewalldsudo firewall-cmd --permanent --add-port3306/tcp sudo firewall-cmd --reloadUbuntu 默认带 ufwsudo ufw allow 3306/tcp sudo ufw reload提示bind-address 配置为 0.0.0.0 意味着所有网络接口都可以访问 MySQL。如果服务器有公网 IP 且没有安全组规则保护3306 端口会很快被扫描和爆破强烈建议用防火墙限制来源 IP或者直接用 SSH 隧道访问数据库不要把 MySQL 端口直接暴露到外网。Windows 上的防火墙相关操作一般是在“高级安全 Windows Defender 防火墙”里放行 3306 入站规则MSI 安装向导通常会自动创建这条规则ZIP 版就得手动加了。5. 安装方式选型建议和踩坑记录5.1 选型矩阵不同的场景选不同的路没有一种安装方式是普适最优的每种方式都有它最适合的场景。我的选型经验大致是这样场景推荐方式理由Windows 开发机MSI 或 ZIPMSI 省心ZIP 适合想了解底层逻辑的人Windows 服务器临时部署ZIP 绿色版免安装、易卸载、可指定任意目录Ubuntu 开发/测试服务器apt 官方仓库安装快、依赖自动处理、随系统升级RHEL 系生产服务器yum/dnf 官方仓库标准化程度高、方便统一管理离线环境/内网/固定版本二进制 tar 包不受外网限制版本精确可控快速搭建测试环境Docker一条命令起停用完就删不污染宿主机如果你还在犹豫我的个人建议是开发机用 MSI 或者 apt 怎么省心怎么来生产机优先考虑 tar 包或者官方仓库核心诉求是把安装过程“代码化、可复制”避免人手装出来的环境一个和一个不一样。5.2 常见安装问题排查安装过程中我踩过的坑和帮别人排查过的问题挑几个有代表性的列出来问题一mysqld 启动报错 error while loading shared libraries: libaio.so.1这个常见于二进制 tar 包安装方式。报错原因很简单mysqld 运行依赖 libaio 库但系统只安装了基础依赖没有装 libaio。RHEL 系执行sudo dnf install libaio libnumaUbuntu 系执行sudo apt install libaio1 libnuma1然后重新启动服务。问题二mysql: command not found执行 mysql 命令但系统提示找不到。要么是安装时没创建 /usr/bin/mysql 或 /usr/local/bin/mysql 的软链接要么是 PATH 环境变量没包含 MySQL 的 bin 目录。tar 包安装后执行ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql就能解决。问题三ERROR 1045 (28000): Access denied for user rootlocalhost登录认证失败。先确认你是不是用了正确的密码和认证方式。Ubuntu apt 安装后 root 走 auth_socket 认证你在任何终端直接 mysql -uroot -p 输密码都会失败正确姿势是 sudo mysql 或者 sudo mysql -uroot -p。问题四Cant connect to local MySQL server through socket /tmp/mysql.sock (2)这句话的意思是客户端在 /tmp/mysql.sock 没找到 socket 文件。服务没启动是常见原因也可能是因为 socket 路径配置和服务端不一致。客户端和服务端的 socket 路径必须相同建议把 [client] 和 [mysqld] 里的 socket 配置都显式写出来别靠默认值碰运气。问题五Windows 下注册服务失败提示 Install/Remove of the Service Denied大概率是 CMD 没有以管理员身份运行。Windows 的服务注册需要管理员权限普通权限执行 mysqld --install 必然失败。右键 CMD 图标选择“以管理员身份运行”重新执行注册命令即可。5.3 一次生产环境安装的完整复盘最后分享一段真实经历。之前帮一个客户在离线内网环境部署一套系统服务器是 Rocky Linux 9外网完全隔离手里只有一个 MySQL 8.0.30 的 tar 包。当时就是因为没有预判到 glibc 版本问题安装后发现其他所有依赖都满足唯独 mysqld 起来就报错排查了很久。当时我写了一个简单的安装脚本省掉了不少重复劳动。思路是先检查系统编译依赖和 libaio再创建用户、解压、初始化、写 systemd 服务、启动、修改 root 密码。这个脚本保留了完整注释方便后面复用#!/bin/bash # RHEL 9 离线环境 tar 包安装 MySQL 8.0.x 脚本 set -e MYSQL_BASE/usr/local/mysql DATA_DIR${MYSQL_BASE}/data MYSQL_TARmysql-8.0.30-linux-glibc2.12-x86_64.tar.xz # 1. 检查 libaio 依赖 if ! ldconfig -p | grep -q libaio; then echo 缺少 libaio 依赖请先安装 libaio exit 1 fi # 2. 创建专用用户 if ! id mysql /dev/null; then groupadd mysql useradd -r -g mysql -s /bin/false mysql fi # 3. 解压安装 tar xf $MYSQL_TAR -C /usr/local/ if [ ! -L $MYSQL_BASE ]; then ln -s /usr/local/mysql-8.0.30-linux-glibc2.12-x86_64 $MYSQL_BASE fi # 4. 初始化数据目录首次执行 if [ ! -d $DATA_DIR ]; then mkdir -p $DATA_DIR chown -R mysql:mysql $MYSQL_BASE $MYSQL_BASE/bin/mysqld --initialize --usermysql \ --basedir$MYSQL_BASE --datadir$DATA_DIR echo 初始化完成临时密码查看grep temporary password $DATA_DIR/*.err fi # 5. 注册 systemd 服务 if [ ! -f /etc/systemd/system/mysqld.service ]; then cat /etc/systemd/system/mysqld.service EOF [Unit] DescriptionMySQL Server Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile$DATA_DIR/mysqld.pid ExecStart$MYSQL_BASE/bin/mysqld --defaults-file/etc/my.cnf --daemonize --pid-file$DATA_DIR/mysqld.pid ExecReload/bin/kill -s HUP \$MAINPID ExecStop/bin/kill -s TERM \$MAINPID Restarton-failure [Install] WantedBymulti-user.target EOF systemctl daemon-reload fi # 6. 启动并设置自启 systemctl start mysqld systemctl enable mysqld这段脚本现在是我处理内网 MySQL 部署的默认模板换来换去不同的客户环境唯一需要改的就是 tar 包的版本号和 glibc 后缀。建议你在网上看到类似安装教程的时候不要只复制命令试着把整条链路串成脚本写下来这样部署过一次之后下次就再也不用手动敲命令了。安装 MySQL 这件事本身并不难难点在于理解每种方式背后做了什么、没做什么。我见过太多人把包管理器装完的 MySQL 当成“装好了”等到需要精确控制数据目录、调整配置文件时才意识到之前少做了很多步骤。建议初学者至少亲手走一遍 ZIP 或 tar 包安装流程亲手初始化一次数据目录、注册一次系统服务把过程跑通之后再回头看其他方式就会明白每条命令存在的意义。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进