明明一个安装包就能搞定的事为什么还有人装 MySQL 5.7 装到心态爆炸后台几乎每天都能收到这类问题问法还五花八门有的初始化完不知道密码在哪有的服务起来了一登录就报错有的好不容易登进去一查字符集是乱码。今天这篇就把 Windows 和 Linux 两条安装路线的完整流程全拆开讲每一步命令、每一行配置、每个可能踩的坑都写明白。无论你是刚接触数据库的新手还是给公司服务器重新部署环境的老手照着做都能顺利跑起来。我平时帮人远程看问题遇到最多的不是装不上而是装完之后不知道怎么验证、不知道怎么该改哪里。所以这篇不会只给你一堆复制粘贴的命令还会告诉你每一步为什么这么做、出了问题怎么排查。1. 装之前先搞清楚这几件事1.1 为什么还在用 5.7新项目到底选 MySQL 5.7 还是 8.0这个话题几乎隔一阵子就会吵一轮。我自己在项目里接触最多的是 5.7原因很实在存量项目太多、网上资料最全、各种ORM和中间件对 5.7 的兼容性都验证过。很多公司线上核心库跑的就是 5.7运维同事对它的脾气也摸得透平时出点小问题看看日志就知道怎么回事。8.0 当然有它的优势比如窗口函数、CTE、更好的Hash Join性能在某些场景下也确实更强。但从“稳定迁移”的角度看5.7 依然是那个最稳的版本。如果你是自己在本地搭环境练手或者公司项目还在用 5.7那照着这篇装绝对够用。我建议的版本号是 5.7.44这是 5.7 系列中比较新的一个小版本修复了不少历史bug建议直接认准这个版本号下载。1.2 安装方式到底选哪一种很多人上来就问“用 yum 还是 用 apt”其实这个问题得分系统来看。Windows 下面主要就是两种装法下载安装向导一步一步点或者下载 ZIP 压缩包自己解压配置。安装向导适合完全不想碰命令行的人但问题是它装完之后很多细节你看不到之后出问题都不知道去哪找原因。ZIP 包方式看起来麻烦一点但它把 MySQL 的目录结构、配置文件、初始化过程全暴露在你面前出了问题也好排查。我下面主要讲 ZIP 包方式因为理解了这种方式你对 MySQL 运行机制的理解会上一个台阶。Linux 下常见的选择是 yum/apt 在线安装或者下载二进制 tar 包手动部署。在线安装省事但有两个问题第一是版本不一定是最新的 5.7系统自带的源里可能还是 5.6第二是装完之后配置文件的路径分布在好几个目录里找起来麻烦。二进制包方式虽然要多敲几条命令但所有文件都集中在 /usr/local/mysql 下面清爽干净想改配置文件、想卸载都方便。对比维度ZIP包 / 二进制包安装向导 / yum难度偏高需手动初始化较低自动完成可控性所有细节可见黑盒出问题难定位配置文件位置自己指定一目了然分散在不同目录适合场景学习、生产环境部署快速临时安装1.3 环境检查与准备工作装之前花五分钟检查一下系统环境能省掉后面一大堆麻烦。Windows 用户先确认一下自己的系统版本和位数到“设置-系统-关于”里看64位系统就下载64位安装包。确认 C 盘或者你打算安装的盘符有足够的剩余空间MySQL 5.7 安装完大概需要 1GB 左右的空间空出来 2GB 最稳妥。另外建议安装目录不要出现中文和空格别问我为什么遇到过一次装到“C:\数据库\mysql 5.7”目录下面怎么都启动不了的案例我后来让人换个纯英文路径立刻就好了。Linux 用户需要先确认系统的 glibc 版本和架构。如果是从官网下载的 tar 包文件名里会标注 glibc 版本比如当时常见的 5.7.44 对应的文件名里有 glibc2.12。一般 CentOS 7、Ubuntu 16.04 以上的系统都满足条件。再一个就是要确认 /usr/local 目录有写权限没有的话用 sudo 切换。提示不管是 Windows 还是 Linux安装 MySQL 前建议先把系统里已有的旧版本 MySQL 彻底卸载干净包括注册表残留、旧的 data 目录、配置文件这些。残留文件经常导致新版本服务起不来而且报错信息特别难懂。2. Windows 系统下的保姆级安装2.1 安装包下载与目录规划Windows 下从官网下载 ZIP 包路径一般是打开 MySQL 官网下载页面找到 Community Server 版本选择 5.7 系列再根据系统位数选择 ZIP Archive 包下载。如果官网下载速度太慢可以考虑用国内的一些软件源镜像但注意核对版本号和文件校验值安全第一。下载完成后把压缩包解压到一个固定目录我这里统一用C:\mysql-5.7.44-winx64作为示例。解压后你会看到 bin、include、lib、share 等目录但注意默认没有 data 目录这个目录需要初始化的时候自动生成。我建议在解压后的目录下手动创建一个data文件夹的空目录至少在初始化之前心里有个数知道数据文件放哪。解压完成后不要急着双击 mysqld.exeMySQL 在 Windows 上要正常启动必须先有一个配置文件告诉它基础目录和数据目录在哪里。没有配置文件的情况下mysqld 会尝试启动但大概率会因为找不到 data 目录而失败这也是很多新手卡住的第一关。2.2 编写 my.ini 配置文件在C:\mysql-5.7.44-winx64根目录下新建一个文本文文件重命名为my.ini注意后缀名必须精确是 .ini不能是 .txt。用记事本或者 Notepad 打开写入以下内容[mysqld] basedirC:/mysql-5.7.44-winx64 datadirC:/mysql-5.7.44-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_general_ci default-storage-engineINNODB max_connections1000 skip-name-resolve [client] default-character-setutf8mb4这里有几处要专门解释一下不然你光复制完也不知道改哪里。basedir和datadir是两个核心路径前者告诉 MySQL 安装目录在哪后者告诉它数据文件放哪。我见过有人在这里少写一个盘符或者路径写错导致服务启动成功但建库建表全报错。路径里的斜杠可以用正斜杠/也可以用双反斜杠\\两种写法都行但千万别只写一个反斜杠比如C:\mysql这种写法在配置文件解析时容易出问题。port3306是 MySQL 默认端口除非你机器上已经有一个 MySQL 占用了 3306否则不要改。怎么判断 3306 是否被占在命令行敲netstat -ano | findstr 3306如果有输出说明端口被占用你就得换一个端口比如 3307。character-set-serverutf8mb4这个强烈建议加上不然后面建表存中文极易出现乱码。skip-name-resolve是跳过 DNS 反解加上它能加快连接速度特别是远程访问的时候效果明显但代价是 MySQL 授权表里的 host 只能写 IP不能写域名一般业务场景无所谓。2.3 执行初始化与注册 Windows 服务打开命令行用管理员身份运行 cmd先进入 MySQL 的 bin 目录cd /d C:\mysql-5.7.44-winx64\bin接着执行初始化命令mysqld --initialize-insecure这里有两个初始化参数可以选--initialize会生成一个随机的临时 root 密码密码存在 data 目录下的错误日志文件里新手经常会找不到--initialize-insecure会生成一个空密码的 root 用户虽然安全性差一点但对新手非常友好登录后立刻改密码就行。我推荐先用--initialize-insecure先把环境跑通再说。初始化完成后data 目录下会自动生成一堆文件其中有一个xxx.err日志文件。你可以打开它看有没有 ERROR 级别的记录没有的话说明初始化成功。接下来注册成 Windows 服务这样以后可以用net start mysql来启动而且开机可以自动运行mysqld --install MySQL57如果你的 my.ini 文件名字不是默认的或者不在 MySQL 根目录下这里需要显式指定mysqld --install MySQL57 --defaults-fileC:\mysql-5.7.44-winx64\my.ini注册完服务后启动它net start MySQL57看到提示服务已经启动成功这一步就算过了。2.4 连接验证与 Windows 特有坑服务启动后继续在命令行里敲mysql -uroot -p因为初始化用的是--initialize-insecureroot 密码是空的所以提示输入密码时直接按回车。如果能进入mysql提示符说明安装流程已经走通。现在赶紧把密码改了ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;改完密码后建议退出重新登录一次确认新密码生效。Windows 上几个高频坑我集中说一下。第一如果你在 cmd 里执行mysqld --install提示服务已存在多半是之前装过旧版本先执行mysqld --remove MySQL57把旧服务删掉再注册。第二net start 后提示服务无法启动先去 data 目录下的 .err 日志里搜ERROR这是最直接的定位方式。第三MySQL 5.7 默认没有 my.ini 时会用编译时的默认参数会出现数据目录路径跑到别的地方去的奇葩问题所以 my.ini 一定要提前建好。3. Linux 系统下的保姆级安装3.1 二进制包下载与环境准备Linux 环境这里我以 CentOS 7 为例Ubuntu 也大同小异只是个别命令不一样。先到官网下载 MySQL 5.7 的 Linux 二进制包文件名类似mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz。如果你的服务器无法访问外网可以先在本地下载完再上传到服务器用rz命令可以快速上传。上传完成后开始准备环境。先创建 mysql 用户和用户组groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql这个用户专门用来运行 mysqld 进程用-s /sbin/nologin是为了禁止它登录系统安全考虑。接下来解压安装包tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ mv /usr/local/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql建议改名为 mysql这样路径短、好记。然后创建数据目录并赋予权限mkdir -p /usr/local/mysql/data chown -R mysql:mysql /usr/local/mysql注意这里的chown -R是整个目录的权限都交给 mysql 用户数据目录也包含在内。如果不做这一步后面初始化会报权限错误。3.2 编写 my.cnf 配置文件Linux 下 MySQL 的默认配置文件路径是/etc/my.cnf不过 MySQL 会按照固定的顺序读取配置文件包括/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf等等。为了避免歧义我建议直接在/etc/my.cnf新建一个干净的配置[mysqld] basedir/usr/local/mysql datadir/usr/local/mysql/data port3306 socket/tmp/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_general_ci default-storage-engineINNODB max_connections1000 skip-name-resolve [client] default-character-setutf8mb4这里多了一个socket/tmp/mysql.sock这个是 Linux 环境下本地客户端连接 MySQL 用的套接字文件路径可以自己定但要保证 mysql 用户有权限创建。如果你后面用 systemd 来管理socket 路径最好和客户端连接时用的一致否则会出现Cant connect to local MySQL server through socket的报错。写完配置文件后再把数据目录权限重新设置一遍确认 mysql 用户能读写chown -R mysql:mysql /usr/local/mysql3.3 初始化数据库并启动服务配置文件写好后开始初始化。建议先设置一下环境变量方便后面直接敲命令export PATH$PATH:/usr/local/mysql/bin然后执行初始化命令/usr/local/mysql/bin/mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data和 Windows 一样我推荐先使用--initialize-insecure生成空密码 root 用户等登录成功后再改成强密码。初始化完成后查看一下 data 目录下有没有生成auto.cnf和ibdata1等文件有的话说明初始化成功。启动服务有两种方式。一种是在 support-files 目录下面有 mysql.server 脚本/usr/local/mysql/support-files/mysql.server start另一种是配置 systemd 服务以后可以用systemctl start mysqld管理还可以设置开机自启。在/etc/systemd/system/mysqld.service新建文件[Unit] DescriptionMySQL Server 5.7 Afternetwork.target [Service] Typeforking Usermysql Groupmysql ExecStart/usr/local/mysql/support-files/mysql.server start ExecStop/usr/local/mysql/support-files/mysql.server stop PIDFile/usr/local/mysql/data/mysqld.pid PrivateTmptrue [Install] WantedBymulti-user.target保存后执行systemctl daemon-reload systemctl start mysqld systemctl enable mysqld用systemctl status mysqld确认服务状态是 active (running)这一步就算完成了。3.4 登录验证与基础设置启动完成后直接用 mysql 客户端登录mysql -uroot -p空密码直接回车。注意如果提示找不到 mysql 命令说明环境变量没配上可以改用全路径/usr/local/mysql/bin/mysql -uroot -p或者把 export 写进 /etc/profile 里永久生效。登录进去后第一件事就是改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;建议把密码设置得复杂一点至少包含大小写字母、数字和特殊字符。如果是公司服务器这一步如果不做别人连内网扫到 3306 端口就能用空密码登进来风险极大。到这里 MySQL 已经能正常用了。但如果你是在云服务器或者虚拟机里装的还要看看防火墙是否放行了 3306 端口。CentOS 7 用以下命令firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload4. 安装后的安全加固与远程访问4.1 运行安全初始化脚本MySQL 自带一个安全初始化脚本进入 bin 目录执行mysql_secure_installation它会引导你完成几项安全操作设置 root 密码强度、删除匿名用户、禁止 root 远程登录、删除 test 测试库、刷新权限表。如果之前已经手动改过 root 密码脚本会询问是否继续修改选 n 跳过就行。这个脚本有几个问题需要留意。比如它会问是否移除匿名用户一定要选 y。匿名用户不删的话别人可以用任意用户名的空密码连上你的数据库等于裸奔。再比如它会问是否禁止 root 远程登录如果你要远程管理数据库这里可以先选 n后面单独创建专用账号来远程访问这样更安全。脚本跑完之后建议执行一次全量权限刷新FLUSH PRIVILEGES;让所有改动立即生效。4.2 创建专用业务账号日常使用中我强烈不建议直接用 root 账号去连接业务尤其是远程连接。正确的做法是创建专用账号只授予必要的权限。比如创建一个只对某个业务库有全部权限的账号CREATE USER app_userlocalhost IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON app_db.* TO app_userlocalhost; FLUSH PRIVILEGES;app_user是用户名localhost表示只能从本机连接。如果你的代码部署在另一台服务器上需要把localhost换成那台服务器的 IP或者用%表示任意 IP。用%最省事但安全性最低生产环境不要滥用。权限粒度也值得多说一句如果你只是需要一个读写账号就不要给ALL PRIVILEGES可以拆成SELECT, INSERT, UPDATE, DELETE几种权限。最小权限原则在数据库这里尤其重要真出事的时候能少很多麻烦。4.3 开放远程连接权限远程连不上 MySQL我排查了无数回原因通常出在三个地方MySQL 用户表 host 限制、配置文件 bind-address 限制、防火墙拦截。先看用户表的 host 限制。执行SELECT User, Host FROM mysql.user;如果 root 的 Host 是 localhost那远程肯定连不上。解决方式有两种一种是把 root 的 Host 改成%一种是用一条授权命令直接搞定GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 密码 WITH GRANT OPTION; FLUSH PRIVILEGES;但再次强调生产环境不要开 root 的远程权限最多开一个专用管理账号。再看配置文件里的 bind-address。在 my.cnf 的[mysqld]段里如果写了bind-address127.0.0.1表示只监听本机回环地址外部 IP 就无法连接。需要改成0.0.0.0或者直接把这一行注释掉因为默认监听所有网卡。最后检查防火墙。CentOS 7 的命令在上面已经写过Ubuntu 如果用的是 ufw命令是ufw allow 3306/tcp改完这些后重启服务再试远程连接。4.4 设置字符集避免乱码有没有遇到过数据库里存中文查出来是一堆问号这种问题基本全是字符集没配好。MySQL 5.7 默认字符集是 latin1不改成 UTF-8 的话存中文早晚要出事。检查当前字符集SHOW VARIABLES LIKE character_set%;重点看几个值character_set_server是服务器默认字符集character_set_database是默认数据库字符集character_set_client是客户端过来的字符集。理想情况下它们都应该是 utf8mb4。刚才我在 my.ini / my.cnf 里已经写入了以下配置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_general_ci [client] default-character-setutf8mb4这样新建的数据库默认就是 utf8mb4不需要每次建库都手动指定。如果你发现配置文件改了但没生效看看是不是配置文件路径被读取的优先级问题或者连接工具没有设置客户端编码。用 Navicat 连接的话连接属性里也有字符集设置要一并改成 utf8mb4。为什么用 utf8mb4 而不是 utf8MySQL 的 utf8 其实最多只能存 3 个字节的字符遇到 Emoji 表情或者一些特殊字符就会存不进去utf8mb4 是真正的完整的 UTF-8 编码。这个问题在 5.7 版本里尤其常见强烈建议直接统一用 utf8mb4。5. 这些坑我替你们踩过了5.1 服务启动失败的排查思路MySQL 启动失败新手最容易慌但其实排查思路很固定。第一步去看错误日志。Windows 下在 data 目录里找.err结尾的文件Linux 下默认在 datadir 下也可能在系统日志里。打开日志搜索ERROR几乎所有启动失败的原因都会写在这里。日志里最常见的几类错误[ERROR] Cant start server: Bind on TCP/IP port. Got error: 10048这个意思是端口被占用多半是有另一个 MySQL 或者别的程序占了 3306。Windows 下用netstat -ano | findstr 3306看是哪个进程Linux 下用netstat -tlnp | grep 3306。[ERROR] Cant open the mysql.plugin table.这个通常是初始化没有成功data 目录不完整。解决办法是备份数据目录后清空重新执行初始化命令。如果之前已经初始化过一次第二次初始化前必须把 data 目录里的内容删干净否则会报错。还有一个非常隐蔽的问题Linux 下权限不对的时候mysqld 进程会一闪而过日志里没有任何内容。遇到这种情况先确认你的 data 目录属主是不是 mysql 用户ls -ld /usr/local/mysql/data如果是 root 属主执行chown -R mysql:mysql /usr/local/mysql再启动。5.2 忘记密码怎么办这个场景我遇到过太多次。MySQL 5.7 忘记 root 密码可以通过跳过授权表的方式来重置。先停掉 MySQL 服务。Windows 下执行net stop MySQL57Linux 下执行systemctl stop mysqld。然后在配置文件 my.cnf 的[mysqld]段末行加一行skip-grant-tables重启 MySQL 服务。这时候登录不需要密码mysql -uroot -p直接回车就能进。进去后先执行FLUSH PRIVILEGES;这一步很关键因为 skip-grant-tables 模式下不能直接改密码必须先把内存里的授权表加载一遍。然后ALTER USER rootlocalhost IDENTIFIED BY 新密码; FLUSH PRIVILEGES;改完密码后务必将 my.cnf 里的skip-grant-tables注释或删除再重启服务。这一步千万不能忘不然你的 MySQL 等于裸奔任何人不需要密码就能进。5.3 配置文件怎么改都不生效很多人在 my.ini / my.cnf 里改了配置重启服务后一查还是老样子直接懵掉。这个问题的根源一般是配置文件读取顺序或者路径不对。MySQL 读取配置文件的优先级顺序是/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf以及编译时指定的路径。前面的会覆盖后面的也就是说如果同一个参数在多个文件里出现靠前的文件优先级高。你在/usr/local/mysql/etc/my.cnf里改了配置但系统实际读取的是/etc/my.cnf那你的改动自然不生效。验证当前 MySQL 用的是哪个配置文件mysql --help | grep -A 1 Default options这个命令会列出 MySQL 启动时读取的所有配置文件路径和顺序按顺序检查一下自己改的文件是否在列表里。还有一个细节Windows 下 my.ini 如果你用记事本编辑过保存时编码格式建议用 ANSI 或者 UTF-8 无 BOM。如果你存成了 UTF-8 带 BOM 格式MySQL 读配置文件时第一行会带上一个看不见的 BOM 字符轻则配置解析失败重则服务直接起不来。5.4 常见异常速查表现象可能原因解决办法服务启动失败日志报 100483306 端口被占用找到占用进程或修改配置里的端口初始化报错找不到 data 目录basedir / datadir 路径错误检查 my.ini / my.cnf 路径配置登录提示 Access denied密码错误或 user 表 host 不匹配用 skip-grant-tables 重置密码远程连接超时防火墙未放行或 bind-address 限制放行 3306 端口配置 0.0.0.0中文插入后变问号字符集没有设置为 utf8mb4修改 server 和 client 字符集配置root 空密码能登录初始化用了 insecure 且未改密立即 ALTER USER 设置强密码连接报 Cant connect through socketclient 与 server socket 路径不一致统一 my.cnf 里 socket 路径这张表我建议收藏一下遇到问题先对着查一遍大部分情况都能解决。如果不在表里就老老实实去看错误日志日志不会骗人。我个人在实际操作中的一点体会是安装 MySQL 这件事本质上没什么高科技含量环节多、坑多、文档杂所以容易翻车。但只要你养成“看日志”而不是“瞎猜”的习惯大部分问题都能在几分钟内定位。另外装完之后建议随手做个快照或者备份一下配置文件改坏了能立刻恢复。最后再分享一个小技巧装好后先在本地创建一个测试库插入几条中文数据、重启一次 MySQL 服务、远程连接一次。这三步走完你才能真正确定环境是健康的之后再部署业务代码心里也有底。数据库这东西装完不是结束能稳定跑上一个月不出幺蛾子才算真正装好了。
阅读完成 · 觉得有帮助?