ARTICLE DETAIL

资讯详情

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

Linux服务器MySQL 5.7安装实战:YUM/Apt与二进制包全攻略

Linux服务器MySQL 5.7安装实战:YUM/Apt与二进制包全攻略 第一次在服务器上手动安装 MySQL5.7 的时候我整整折腾了一下午。不是下载慢、也不是命令记不住坏就坏在一堆“你以为对了其实没对”的小细节上目录权限没给够、初始化方式选错、临时密码找不到、防火墙把端口堵死……每一步单看都不难串起来就够新手喝一壶。这篇教程我按自己实际走过的路子写目标只有一个让你照着操作不管是用 YUM、Apt 还是通用二进制包都能把 MySQL 5.7 装到能建库、能连接、能正常干活的状态。适合第一次接触 Linux 数据库的同学也适合以前只用过 Windows 版 MySQL、现在被迫切到服务器的开发。我会把每一步为什么要这么做也讲清楚而不是丢一堆命令让你复制。1. 安装前先弄清楚为什么大家都在用5.7你该用哪种方式1.1 5.7到今天依然能打的原因先聊两句版本问题。MySQL 8.0 发布已经好几年了但 5.7 在存量项目里的占有率依然很高。原因不复杂很多公司线上业务跑的就是 5.7配套的监控脚本、主从复制方案、业务代码里的 SQL 写法都是按 5.7 调优过的贸然升 8.0 意味着要重新压测、改驱动、处理认证插件变化成本不小。另外大量旧版本的云数据库实例、教学视频、培训机构课程默认讲的还是 5.7你搜问题的时候资料也最全。所以在 2025 年的今天选择安装 MySQL 5.7一点都不丢人反而是稳妥的选择。如果你是全新项目我建议你评估一下 8.0但如果你今天的目标就是把 5.7 稳稳跑起来那就按本文走。1.2 摸清你的Linux系统3条命令定方向安装之前先花一分钟确认系统环境这会决定你后面用哪种方式装。cat /etc/os-release uname -m free -h第一条看发行版和版本号第二条看 CPU 架构第三条看内存。常见情况是 CentOS 7.x、Ubuntu 18.04/20.04/22.04架构基本都是 x86_64。内存方面MySQL 5.7 跑起来默认配置大概占 300~500MB你至少要给虚拟机或云主机留 1GB 内存不然装完启动就有被系统杀掉的风险后面我会专门讲这个问题。如果是在 Windows 上用虚拟机做练习我建议分配 2 核 4GB磁盘 20GB跑 5.7 绰绰有余。如果用的是 WSL2 或者云服务器上面的命令同样适用。1.3 三种安装方式的取舍我帮你选好MySQL 5.7 在 Linux 上的安装方式主要就三种不用纠结按你实际情况选安装方式适用场景优点缺点YUM/Apt 官方仓库CentOS/Ubuntu 新手机器命令少、自动处理依赖、自带 systemd 服务仓库版本可能受限Ubuntu 20.04 需要额外操作通用二进制包任何 Linux 发行版、离线内网环境不依赖网络源、版本完全可控、行为最透明手动步骤多权限、初始化一个都不能漏源码编译需要自定义编译参数的高级用户可裁剪功能耗时长、依赖多新手强烈不推荐我的建议很直接新手先用官方仓库装一遍把 MySQL 跑通、知道它长什么样再用二进制包装第二遍理解每个配置文件和服务脚本的作用。两遍下来你对 MySQL 的“安装”这件事就基本没有盲区了。本文第二章和第三章会分别把这两条路走完。2. 官方YUM/Apt源安装两条命令起服务适合九成新手2.1 CentOS系添加官方仓库后直接yumCentOS 7 自带的软件源里默认没有 MySQL只有 MariaDB。所以第一步是添加 MySQL 官方仓库。rpm -Uvh https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm装完这个 rpm 之后你的系统里就多了一个/etc/yum.repos.d/mysql-community.repo文件里面定义了 mysql57-community 这个源。接下来直接装服务端yum install -y mysql-community-server这里解释一下很多人会问“为什么装 server 不装 client”因为mysql-community-server这个包把服务端、客户端、common 公共组件都作为依赖一起拉下来了所以只装它就行。安装过程会自动处理依赖你唯一要做的就是把网络保持通畅。装完后先别急着操作启动并设置开机自启systemctl start mysqld systemctl enable mysqld systemctl status mysqld启动这一步如果报了错不要慌99% 是/var/lib/mysql目录权限或 SELinux 的问题第五章我会详细给排查链路。正常情况下启动后你执行systemctl status mysqld能看到active (running)。2.2 Ubuntu/Debian系仓库可能没有5.7我教你绕Ubuntu 18.04 的官方源里直接有 mysql-server-5.7执行apt install mysql-server即可。但 Ubuntu 20.04 和 22.04 的官方源默认是 8.0直接apt install mysql-server装出来的是 8.0不是 5.7。那怎么在 Ubuntu 20.04 上装 5.7我试过两条路第一条是手动下载 MySQL 官方的 deb 仓库包wget https://repo.mysql.com/mysql-apt-config_0.8.24-1_all.deb dpkg -i mysql-apt-config_0.8.24-1_all.deb安装过程中会弹出图形选项框让你选择要启用哪个 MySQL 版本这里手动选中mysql-5.7一路 OK。然后apt update apt install -y mysql-server第二条路更稳直接用第三章的通用二进制包安装。因为 MySQL 官方从 5.7.44 之后就不再更新 5.7 系列而 Ubuntu 20.04 的 apt 依赖库有时会对旧包做兼容性检查图形框选版本这种操作在纯命令行环境里也容易卡住。如果你追求一次成功我建议 Ubuntu 20.04 用户直接跳到第三章。2.3 启动服务后第一件事别急着建库先看临时密码用官方仓库装 MySQL 5.7初始化时默认会生成一个随机临时密码存在日志文件里。很多新手不知道这一点直接用mysql -uroot -p登录回车后报Access denied然后就开始怀疑人生。正确的操作是grep temporary password /var/log/mysqld.log输出大概是这样的2025-01-15T08:32:11.567890Z 1 [Note] A temporary password is generated for rootlocalhost: abc123!#拿这个密码登录mysql -uroot -p登录后会提示密码过期必须先改密码才能做任何操作。执行ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPass!1; FLUSH PRIVILEGES;注意 MySQL 5.7 默认安装了 validate_password 组件对密码强度有要求太简单的密码会直接报错。比如123456这种肯定过不了。如果你是在内网测试环境想关掉这个限制可以UNINSTALL COMPONENT file://component_validate_password;或者修改全局参数validate_password_policy为LOW并把长度下限调低。生产环境不建议这么干测试环境随意。3. 通用二进制包安装不依赖任何源手动党首选3.1 下载时怎么选包看懂文件名再动手如果你在内网环境、云服务器访问不了官方源或者就是想把 MySQL 装到指定目录那通用二进制包是最合适的选择。下载地址是 MySQL 官方下载页选Linux - Generic文件名的格式类似mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz拆开看5.7.44是版本号glibc2.12表示这个包依赖的 glibc 最低版本是 2.12x86_64是架构。CentOS 7 和 Ubuntu 18.04 以上的系统 glibc 版本都高于 2.12所以都能用。这里提醒一下不要下载linux-glibc2.17的包然后拿到 glibc 2.12 的机器上跑会直接报GLIBC_2.17 not found。判断系统 glibc 版本用ldd --version3.2 创建用户、放文件、给权限一步不能少下载并解压tar -xzvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql创建专用的 mysql 用户useradd -r -s /sbin/nologin mysql这里解释一下-r表示创建系统账号-s /sbin/nologin表示禁止这个账号登录 shell。MySQL 服务要以这个低权限账号运行而不是直接用 root这是安全底线。如果哪天被脱库了攻击者拿到的是 mysql 账号权限而不是 root 权限损失会小很多。创建数据目录并给权限mkdir -p /usr/local/mysql/data chown -R mysql:mysql /usr/local/mysql有些教程会让你把整个/usr/local/mysql的所有权给 mysql这样确实省事后续初始化、写日志都不会碰到权限问题。但注意不要让 mysql 用户拥有父目录/usr/local的写权限否则就有权限提升的风险。3.3 最小my.cnf这份配置够你跑起来了MySQL 在二进制包里其实没有默认的my.cnf你需要自己建一个。先建目录mkdir -p /etc/my.cnf.d然后在/etc/my.cnf写最基础的配置[mysqld] user mysql basedir /usr/local/mysql datadir /usr/local/mysql/data socket /tmp/mysql.sock port 3306 server-id 1 log-error /usr/local/mysql/logs/error.log pid-file /usr/local/mysql/run/mysqld.pid这些参数的含义user mysql服务以 mysql 身份运行和你创建的系统账号对应。basedirMySQL 程序所在目录。datadir数据文件存放目录必须存在且属主是 mysql。socket本地连接用的 socket 文件路径PHP 里localhost连 MySQL 走的就是这个文件。log-error错误日志路径。这个目录也要提前建好并给权限别等到报错了才想起来。pid-file进程号文件位置systemd 或启动脚本判断服务状态时会读它。创建日志和 PID 目录mkdir -p /usr/local/mysql/logs /usr/local/mysql/run chown -R mysql:mysql /usr/local/mysql/logs /usr/local/mysql/run3.4 初始化、启动、注册服务手动党三连MySQL 5.7 的初始化用的是mysqld --initialize注意不是mysql_install_db——那个是 5.6 及更早版本的工具5.7 还在用的话大概率会碰到一堆兼容性问题。两种初始化方式# 方式一生成随机临时密码 /usr/local/mysql/bin/mysqld --initialize --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data # 方式二生成空密码开发环境推荐 /usr/local/mysql/bin/mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data方式一的安全性和官方仓库版一致root 初始密码会写在 error log 里方式二会得到一个密码为空的 root方便本地开发。我个人在实际部署时生产环境用方式一测试环境用方式二不用纠结哪种“更正规”。初始化成功后会看到日志末尾有ready for connections字样。如果报错先看是不是/usr/local/mysql/data下有残留文件或者目录属主不对。空目录、属主正确这一步基本一次过。启动服务两种方式任选# 方式A用自带脚本 /usr/local/mysql/support-files/mysql.server start # 方式B直接跑 mysqld_safe /usr/local/mysql/bin/mysqld_safe --usermysql mysqld_safe是守护进程方式MySQL 进程因为异常退出时它还会尝试拉起适合手动测试。想注册成 systemd 服务的话需要自己写一个 service 文件或者把support-files/mysql.server拷到/etc/init.d/mysqld再执行chkconfig --add mysqld。CentOS 7 以上我用 systemd 写 unit 文件Ubuntu 下直接 init.d 脚本也够。3.5 免安装配置填写的常见困惑一次说清很多人搜“mysql5.7免安装配置”其实指的就是把二进制包解压后手动配置不去跑安装程序。和 Windows 绿色版类似Linux 二进制包本质上也是“免安装”关键就三点路径对、属主对、配置文件存在。你在网上看到的所谓“填写配置”通常是指my.cnf里的basedir和datadir路径。很多人填错了datadir导致初始化后找不到数据其实只要记住datadir必须是一个空目录或尚未初始化的目录绝对不能让/usr/local/mysql/data里混进无关文件。另外二进制包里的bin目录要加入环境变量不然每次都要写全路径echo export PATH/usr/local/mysql/bin:$PATH /etc/profile source /etc/profile这样mysql、mysqldump这些命令就能直接用了。4. 装完的刚需三件套改密码、开远程、定字符集4.1 两种初始密码情况分别怎么处理不管你是用 YUM/Apt 源装、还是二进制包装装完后都会面对初始密码问题。分两类如果是--initialize生成的临时密码登录后立刻会遇到“You must reset your password using ALTER USER statement before executing this statement”的提示。解决办法ALTER USER rootlocalhost IDENTIFIED BY YourNewPass!1; FLUSH PRIVILEGES;如果是--initialize-insecure初始化的空密码登录时直接回车即可进去后同样先改密码mysql -uroot --skip-password ALTER USER rootlocalhost IDENTIFIED BY YourNewPass!1;记住一点改完密码后只要以后连接还需要密码就不需要再执行FLUSH PRIVILEGES。这个命令生效的是授权表类的变更而ALTER USER是即时生效的。4.2 业务账号和远程访问别直接放开root很多人装完 MySQL 第一件事就是允许 root 远程登录GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY password;我强烈不建议这么做。root 一旦被爆破整库就没了。正确的姿势是创建一个业务专用账号CREATE USER app_user% IDENTIFIED BY StrongPass!2025; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_user%; FLUSH PRIVILEGES;这样应用连接只影响mydb一个库即使泄露危害也在可控范围内。app_user%里的%表示任意主机如果应用服务器 IP 固定建议写成app_user192.168.1.100权限收得越紧越安全。同时检查 MySQL 是否监听了所有网卡。默认bind-address是*也就是监听所有 IP如果你的机器有公网 IP建议在my.cnf里显式设置bind-address 0.0.0.0如果是仅本机使用就设成127.0.0.1。这里没有绝对的对错取决于你的使用场景但“默认配置监听所有网卡”确实不是一个好习惯。4.3 字符集与时区建库前定好后面才省事MySQL 5.7 默认字符集是latin1如果你不管它后面建出来的表存中文就会变成问号。所以安装完的第一时间就把全局字符集改成utf8mb4。为什么是utf8mb4而不是utf8因为 MySQL 的utf8实际上只是utf8mb3最多存 3 字节字符emoji 和一些生僻汉字是 4 字节存不进去。utf8mb4才是真正的“完整版 UTF-8”。在my.cnf的[mysqld]段加character-set-server utf8mb4 collation-server utf8mb4_general_ci init_connectSET NAMES utf8mb4 skip-character-set-client-handshake再加时区配置。如果你的服务面向国内用户统一用东八区default-time-zone 08:00改完配置重启 MySQLsystemctl restart mysqld登录验证SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE collation_server;看到结果是utf8mb4和utf8mb4_general_ci就说明生效了。已经建好的库和表改起来麻烦所以这些配置一定要在建业务库之前搞定。5. 新手常见坑的排查链路从日志到防火墙逐个过5.1 提示连不上socket/服务起不来权限和日志是关键新手最常碰到的报错是ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)这句话的意思是客户端通过 socket 文件去找 MySQL 服务结果发现服务没起来。所以问题核心不是“连不上”而是“服务没在跑”。那服务为什么没跑按下面的顺序查第一步看错误日志tail -n 100 /var/log/mysqld.log没配日志路径的话常见位置是/var/log/mysqld.log、/usr/local/mysql/logs/error.log、/var/lib/mysql/主机名.err。第二步看关键目录权限ls -ld /var/lib/mysql /usr/local/mysql/data /tmp/var/lib/mysql属主必须是mysql:mysql如果看到root:root执行chown -R mysql:mysql /var/lib/mysql/tmp目录权限通常是 1777也就是所有用户可读写但不许删别人的文件这个是正常的不用担心。第三步才是看端口ss -lntp | grep 3306能看到LISTEN状态说明服务在线连不上就是 socket 路径不一致检查my.cnf里的 socket 路径和客户端请求的路径是否一致。我实际遇到最多的情况就是服务端 socket 写在/var/run/mysqld/mysqld.sock客户端默认去找/tmp/mysql.sock两边对不上。统一路径后问题直接消失。5.2 忘记root密码临时跳过授权表的正确用法这事基本每个人都干过。处理方式是进入“skip-grant-tables”模式跳过权限验证启动后直接无密码登录然后重置密码。设置步骤systemctl stop mysqld编辑my.cnf在[mysqld]段加一行skip-grant-tables启动服务systemctl start mysqld mysql -uroot这时候不需要密码就能登录。执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass!1;完成后记得把skip-grant-tables那一行从配置文件里删掉再重启服务。这一步非常容易忘忘了的话 MySQL 就一直处于“裸奔”状态任何人都能免密登录这和没设密码没有区别。有个细节8.0 里skip-grant-tables下直接ALTER USER会被拒绝5.7 没这个问题但还是建议先FLUSH PRIVILEGES再改密码让权限缓存先恢复。5.3 内存太低被系统杀掉OOM问题的处理运行着的 MySQL 突然消失了ps -ef | grep mysql找不到进程但错误日志里没有任何 MySQL 层面的报错。这种情况八成是 Linux 的 OOM Killer 干的。查看确认dmesg | grep -i -E killed process|out of memory如果能看到 MySQL 进程被 OOM 杀掉解决办法分两种第一种物理机或云主机内存真的不够比如只有 512MB。那就把 MySQL 的内存参数调小重点是innodb_buffer_pool_sizeinnodb_buffer_pool_size 128M5.7 默认的 buffer pool 大小是 128M但加上其他缓存、连接线程、临时表空间整体占用会到 300~500M。内存紧张时还可以关掉 performance_schemaperformance_schema OFF第二种机器内存不小但服务被杀了。检查是不是有其他程序抢占内存或者 swap 设置太小。这类问题我不展开细讲你只要知道方向就行。5.4 防火墙、SELinux和glibc版本最容易忽视的三个拦路虎远程连不上 MySQL本地却能连第一反应查防火墙# CentOS 7 firewall-cmd --list-all firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload # Ubuntu ufw status ufw allow 3306/tcp如果执行完防火墙放行还是连不上CentOS 用户再查一下 SELinuxgetenforce如果状态是EnforcingMySQL 默认被限制只能监听特定端口换端口或自定义数据目录都会被挡。临时放行setenforce 0永久放行要看具体规则最省事但不推荐的做法是改/etc/selinux/config里的SELINUXdisabled然后重启。如果你用的是云服务器还要检查安全组是否放行了 3306 入方向规则。这三层任何一层没打开远程连接都不可能成功。至于 glibc 问题前面 3.1 提到过选择二进制包时要匹配系统 glibc 版本低版本系统装高版本包会直接报version GLIBC_2.17 not found这种情况没有绕过技巧换符合系统版本的包即可。6. 装完后的体检与进一步优化要不要折腾随你6.1 十分钟基础体检ping、状态、慢日志MySQL 能启动、能连接只是“能用”离“好用”还有一段路。我习惯装完后做一轮基础体检mysqladmin -uroot -p ping mysql -uroot -p -e SHOW STATUS LIKE Uptime; mysql -uroot -p -e SHOW VARIABLES LIKE max_connections;ping返回mysqld is alive代表服务正常Uptime看服务稳定运行了多久。顺手看一下max_connections5.7 默认是 151如果应用并发高可以调大到 500~1000但要注意内存。每个连接大约占 2~4MB300 个连接就接近 1GB 内存了别盲目调大。另外把慢查询日志开起来对你排查慢 SQL 很有帮助slow_query_log ON slow_query_log_file /var/log/mysql-slow.log long_query_time 2 log_queries_not_using_indexes ON跑一段时间后看日志里哪些 SQL 超过 2 秒针对性地优化这比临时抱佛脚看性能报告靠谱得多。6.2 想进一步优化先调“三大参数”很多搜索“mysql5.7 配置 jemalloc”的同学其实是想解决内存碎片或性能问题。jemalloc 是一个内存分配器在部分高并发场景下比 glibc 默认的 malloc 表现更稳定MySQL 官方文档里也提到过配合使用的方法。装好 jemalloc 后在my.cnf里指定[mysqld_safe] malloc-lib /usr/lib64/libjemalloc.so.1然后用mysqld_safe方式重启 MySQLLD_PRELOAD或malloc-lib都能把 jemalloc 挂进 MySQL 进程。不过我要提醒一句如果你的并发量不高、内存压力不大jemalloc 带来的收益其实感知不出来。我见过很多人在 8G 内存的机器上折腾 jemalloc最后发现瓶颈是慢 SQL而不是内存分配器。先调对参数再考虑这类偏门优化。真正值得优先调的是这三个innodb_buffer_pool_size设置为物理内存的 50%~70%这是 InnoDB 缓存数据和索引的关键区域。比如 8G 内存的机器设成 4G 到 5G。innodb_log_file_size5.7 默认是 48M在写入频繁的业务下容易导致刷盘频繁建议先调到 256M 观察效果。table_open_cache默认 2000如果表数量多、连接多可以适当调大。改完参数记得重启或用SET GLOBAL动态调整然后观察SHOW ENGINE INNODB STATUS的输出看 buffer pool 命中率。6.3 日常备份与后续升级提前留后路最后说两句备份和升级因为装完 MySQL 之后这两件事早晚要面对。最简单的备份方式是mysqldumpmysqldump -uroot -p --single-transaction --default-character-setutf8mb4 mydb mydb_$(date %F).sql--single-transaction参数对 InnoDB 表很关键能在不锁表的情况下做一致备份备份期间业务照常读写。恢复时mysql -uroot -p mydb mydb_2025-01-15.sql至于升级到 8.0我建议不要急着来。先用mysqldump备份全库导出时注意 5.7 和 8.0 的认证插件差异5.7 是mysql_native_password8.0 默认是caching_sha2_password有些老应用驱动可能不兼容 8.0 的默认认证方式升级前一定要在测试环境完整跑一遍业务回归。如果你也是第一次在 Linux 上装 MySQL我给你的建议是先用官方仓库方式装一遍把服务跑起来、改好密码、设置好字符集这会让你对安装有一个完整的体感等你手熟了再用二进制包方式做一次手动安装把权限、配置、初始化的逻辑彻底搞懂。装数据库这件事没啥玄学就是把每一步都想明白为什么。真的遇到报错先看日志先查权限按步骤排查大多数问题半小时内都能定位到。希望这篇教程能帮你少走一些我当年走过的弯路。
返回列表