简介:本资源为MySQL 5.7.22官方Windows 32位安装包(mysql-5.7.22-win32),面向数据库初学者、运维人员及中小型项目开发者,用于快速部署稳定可靠的开源关系型数据库环境。压缩包共365个文件,含83个动态链接库(dll)、32个可执行程序(exe)、101个头文件(h)及25个配置/日志类XML文件,涵盖服务端、客户端、连接器与调试符号(pdb),结构完整,支持开箱即用的本地安装与基础调优。资源大小308.83MB,已获851人学习下载。用户可直接获取经验证的绿色安装介质,包含完整的InnoDB引擎支持、JSON原生函数、SSL/TLS安全传输默认配置、在线备份能力及Group Replication高可用组件;预览中可见ChangeLog、COPYING授权文件及多组bin/def/dic等底层资源,体现其生产就绪特性,适合教学演示、开发测试及轻量级业务系统部署。
1. MySQL 5.7.22 安装包:为什么这个“老版本”在生产环境里反而更稳、更敢用?
你可能刚点开 MySQL 官网,发现最新版已是 8.0.x,甚至 8.4 已发布;但翻看银行核心账务系统、电力 SCADA 平台、制造业 MES 的运维日志,MySQL 5.7.22 出现频率高得反常——不是因为“懒得升级”,而是它卡在一个极难复现的黄金平衡点:InnoDB 默认事务隔离级别仍是 REPEATABLE READ(没引入 8.0 的默认可重复读+间隙锁优化争议),半同步复制插件稳定成熟,SQL Mode 默认宽松(STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION),且不强制要求 OpenSSL 1.1+ 或 systemd 229+。这意味着它能在 CentOS 6.5、RHEL 7.2、甚至某些定制化嵌入式 Linux(如基于 Buildroot 的工控固件)上零修改编译通过。我去年接手一个燃气表远程抄表平台,现场设备跑的是内核 3.10.0-327 的定制发行版,试过 5.7.33 报clock_gettime符号未定义,回退到 5.7.22 后make && make install一次成功。这不是怀旧,是经过十年线上灰度验证的“最小可靠面”:它不炫技,但每行代码都踩过至少三类不同硬件的坑。如果你要部署的是金融级批处理、工业协议网关、或需要长期免维护的边缘节点,5.7.22 不是备选,是起点。
2. 下载与校验:别跳过 checksum,一次错配能让你排查三天
MySQL 官方早已停止对 5.7 系列的常规更新(最后一个安全补丁止于 5.7.44),但归档下载页仍开放。关键在于:必须从官方归档页获取,而非第三方镜像或网盘链接。后者常存在文件截断、gzip 压缩损坏、甚至被注入恶意启动脚本的风险(2022 年某国内镜像曾因同步脚本 bug 导致 tar.gz 尾部缺失 12KB)。
2.1 官方归档页定位与下载命令
访问 https://downloads.mysql.com/archives/community/
在页面中筛选:
- Product: MySQL Community Server
- Version: 5.7.22
- Operating System: 选择你的目标系统(如
Red Hat Enterprise Linux / Oracle Linux或Linux - Generic) - OS Version: 对应你的内核和 glibc 版本(重点!见下文)
提示:不要选
Source Code,除非你确定要手动编译并解决所有依赖(如 Boost 1.59.0、cmake 2.8.12+)。生产环境首选Linux - Generic的二进制包(.tar.gz),它自带预编译的mysqld和所有插件,无需make install。
以Linux - Generic版本为例,下载链接形如:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
使用wget下载并立即校验:
# 创建专用目录,避免污染 mkdir -p /opt/mysql-5.7.22-install && cd /opt/mysql-5.7.22-install # 下载(请替换为实际链接) wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz # 下载对应 SHA256 校验文件(注意:官网提供 .sha256 文件,非 .md5) wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz.sha256 # 校验(输出应为 "OK") sha256sum -c mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz.sha256参数说明:
glibc2.12表示该包编译时链接的 C 库版本。若你的系统glibc --version输出为2.17(如 CentOS 7),完全兼容;但若为2.11(如 CentOS 6),则必须选glibc2.5版本包,否则解压后运行bin/mysqld --version会报GLIBC_2.12 not found。这是新手最常翻车的第一步——别猜,ldd --version和getconf GNU_LIBC_VERSION先跑一遍。
2.2 解压与目录结构认知:为什么不能直接tar -xzf到/usr/local?
# 解压到临时目录(关键:不要用 root 直接解压到系统路径!) tar -xzf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz # 查看解压后顶层目录名(通常为 mysql-5.7.22-linux-glibc2.12-x86_64) ls -l # 创建软链接,指向固定路径(后续所有配置、启停脚本都基于此) ln -sf mysql-5.7.22-linux-glibc2.12-x86_64 mysql为什么强调软链接?
- 避免硬编码路径:
/usr/local/mysql是 MySQL 社区版默认安装路径,但mysql目录本身是符号链接,指向具体版本号目录。未来升级时,只需rm mysql && ln -sf mysql-5.7.33-linux-glibc2.12-x86_64 mysql,所有my.cnf中的basedir=/usr/local/mysql依然有效。 - 目录结构关键子目录:
bin/:mysqld(服务进程)、mysql(客户端)、mysqld_safe(守护脚本)support-files/:mysql.server(SysV init 脚本)、my-default.cnf(模板配置)data/: 默认数据目录(首次初始化后生成)share/: 字符集、错误消息、SQL 初始化脚本
注意:
support-files/mysql.server是 SysV init 脚本,适用于 CentOS 6/7(systemd 兼容模式);若在纯 systemd 环境(如 CentOS 8+),需额外编写.service文件,但 5.7.22 官方未提供,需手写(见第 4 章)。
3. 初始化与首次启动:--initialize-insecure是把双刃剑
MySQL 5.7 引入了--initialize(生成随机 root 密码)和--initialize-insecure(空密码)两种初始化方式。在离线内网、测试环境或需要自动化部署的场景,--initialize-insecure是唯一可行选择——因为随机密码会写入错误日志,而日志路径、权限、读取方式在初始化前无法预设,自动化脚本根本拿不到密码。
3.1 创建用户与目录权限:绕不开的 Linux 权限模型
# 创建 mysql 用户(禁止登录,无 shell) useradd -r -s /bin/false mysql # 创建数据目录(务必用 mysql 用户拥有) mkdir -p /data/mysql-5.7.22 chown mysql:mysql /data/mysql-5.7.22 chmod 750 /data/mysql-5.7.22 # 创建日志目录(错误日志、慢查询日志) mkdir -p /var/log/mysql chown mysql:mysql /var/log/mysql chmod 755 /var/log/mysql为什么不用/var/lib/mysql?
- 该路径是 RPM 包默认路径,但二进制包(
.tar.gz)不接管系统包管理器,混用会导致yum update误删数据。 /data分区通常更大,且可独立挂载(如 SSD),符合 IO 密集型数据库最佳实践。
3.2 执行初始化:关键参数与静默陷阱
# 进入 MySQL 安装目录 cd /usr/local/mysql # 执行初始化(指定数据目录、用户、字符集) bin/mysqld \ --initialize-insecure \ --user=mysql \ --datadir=/data/mysql-5.7.22 \ --basedir=/usr/local/mysql \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci \ --log-error=/var/log/mysql/error.log \ --pid-file=/var/run/mysqld/mysqld.pid参数详解与血泪经验:
--initialize-insecure:生成空 root 密码,启动后必须立即执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!';,否则存在严重安全风险。--character-set-server=utf8mb4:必须显式指定!5.7.22 默认仍是latin1,若初始化时不设,后续改字符集需重建所有表,代价巨大。utf8mb4支持完整 Unicode(含 emoji、生僻汉字)。--log-error:错误日志路径必须可写,且目录需存在。若/var/log/mysql不存在,mysqld会静默失败,只在控制台输出Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist—— 这其实是日志写入失败的伪装错误。--pid-file:PID 文件路径需父目录存在且 mysql 用户可写。/var/run/mysqld/通常不存在,需提前创建:mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld。
提示:初始化过程耗时约 10~30 秒(取决于磁盘速度),期间
ps aux | grep mysqld应看到进程,但netstat -tlnp | grep :3306不会显示端口(初始化未完成不监听)。耐心等待进程退出,再检查/var/log/mysql/error.log是否有A temporary password is generated for root@localhost(--initialize模式)或mysqld: ready for connections(--initialize-insecure模式)。
3.3 首次启动与连接验证:用最简命令确认服务存活
# 启动服务(后台运行) bin/mysqld_safe \ --user=mysql \ --datadir=/data/mysql-5.7.22 \ --log-error=/var/log/mysql/error.log \ --pid-file=/var/run/mysqld/mysqld.pid \ --port=3306 \ --socket=/tmp/mysql.sock &验证是否启动成功:
# 检查进程 ps aux | grep mysqld | grep -v grep # 检查端口监听 netstat -tlnp | grep :3306 # 本地连接(空密码) bin/mysql -u root -p -S /tmp/mysql.sock # 输入密码时直接回车若连接成功,立即执行:
-- 设置强密码(必须!) ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssw0rd2024!'; -- 刷新权限 FLUSH PRIVILEGES; -- 创建远程管理用户(如需) CREATE USER 'admin'@'%' IDENTIFIED BY 'AdminPass123!'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;4. 配置文件my.cnf:5.7.22 的 7 个必调参数与避坑清单
MySQL 5.7.22 启动时按顺序读取多个配置文件:/etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc/my.cnf→~/.my.cnf。生产环境唯一推荐路径是/etc/my.cnf,因为它独立于 MySQL 安装目录,升级时不会被覆盖。
4.1 最小可用my.cnf模板(含注释)
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] # 基础路径 basedir = /usr/local/mysql datadir = /data/mysql-5.7.22 pid-file = /var/run/mysqld/mysqld.pid socket = /tmp/mysql.sock port = 3306 # 字符集(必须!) character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake = TRUE # 日志 log-error = /var/log/mysql/error.log slow-query-log = 1 slow-query-log-file = /var/log/mysql/slow.log long_query_time = 2 log-bin = /data/mysql-5.7.22/binlog/mysql-bin server-id = 1 # 性能与安全 max_connections = 500 wait_timeout = 28800 interactive_timeout = 28800 innodb_buffer_pool_size = 2G innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 sql_mode = STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # 网络 bind-address = 0.0.0.0 # 若仅本地访问,改为 bind-address = 127.0.0.1关键参数说明:
innodb_buffer_pool_size:InnoDB 缓存池大小,建议设为物理内存的 50%~75%(但不超过 32G,5.7.22 对大 buffer pool 有锁竞争问题)。innodb_log_file_size:重做日志大小,设为buffer_pool_size的 25% 是经验值(如 2G buffer pool → 512M log file)。修改此值需先停库、删除旧日志、再重启,否则报错InnoDB: Error: log file ./ib_logfile0 is of different size.sql_mode:5.7.22 默认已启用严格模式,但某些旧应用依赖ALLOW_INVALID_DATES,需按需追加。
4.2 避坑:5.7.22 启动失败的 5 个高频原因与修复
| 现象 | 原因 | 解决 |
|---|---|---|
ERROR! The server quit without updating PID file | /var/run/mysqld/目录不存在或权限不对 | mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld |
Can't start server: Bind on TCP/IP port: Address already in use | 3306 端口被占用(如其他 MySQL 实例、MariaDB) | netstat -tlnp | grep :3306找出进程并 kill,或改my.cnf中port |
Table 'mysql.plugin' doesn't exist | 数据目录被错误清空,或初始化未完成就启动 | 删除/data/mysql-5.7.22/*,重新执行--initialize-insecure |
InnoDB: Unable to lock ./ibdata1 error: 11 | 文件系统不支持文件锁(如 NFS、某些虚拟机共享目录) | 绝对禁止将datadir设在 NFS 或 VirtualBox 共享文件夹!必须用本地 ext4/xfs |
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' | socket路径在my.cnf和客户端命令中不一致 | 统一设为/tmp/mysql.sock,或在mysql命令中显式指定-S /tmp/mysql.sock |
注意:
my.cnf修改后,必须重启mysqld生效(kill -15 $(cat /var/run/mysqld/mysqld.pid)+ 重新mysqld_safe),SET GLOBAL命令无法修改datadir、basedir等基础路径参数。
5. systemd 服务管理:让 5.7.22 在 CentOS 7+/Ubuntu 16.04+ 上真正“开机自启”
MySQL 5.7.22 官方.tar.gz包不提供 systemd unit 文件,但support-files/mysql.server脚本可通过chkconfig注册为 SysV 服务。在 systemd 主导的系统上,必须手写.service文件,否则systemctl enable mysql无效,且journalctl -u mysql无法查看日志。
5.1 创建/etc/systemd/system/mysqld.service
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf Restart=on-failure RestartSec=10 OOMScoreAdjust=-800 LimitNOFILE=65535 LimitCORE=infinity # 保护关键目录 ProtectSystem=full ProtectHome=true PrivateTmp=true NoNewPrivileges=true # 日志重定向(关键!让 journalctl 可读) StandardOutput=journal StandardError=journal SyslogIdentifier=mysqld [Install] WantedBy=multi-user.target参数深挖:
Type=simple:mysqld自身是守护进程,无需fork后台化,systemd直接监控主进程。OOMScoreAdjust=-800:大幅降低 OOM Killer 优先级,防止内存不足时 MySQL 被误杀(5.7.22 内存管理较激进)。ProtectSystem=full:挂载/usr,/boot,/etc为只读,防止插件或 UDF 恶意篡改系统文件。StandardOutput=journal:将mysqld的 stdout/stderr 重定向到 journald,journalctl -u mysqld -f实时跟踪。
5.2 启用并验证服务
# 重载 systemd 配置 systemctl daemon-reload # 启用开机自启 systemctl enable mysqld # 启动服务 systemctl start mysqld # 检查状态(应显示 active (running)) systemctl status mysqld # 查看实时日志 journalctl -u mysqld -f验证自启生效:
# 模拟重启 reboot # 登录后检查 systemctl is-active mysqld # 应输出 "active" mysql -u root -p -e "SELECT VERSION();"提示:若
systemctl start mysqld报Failed to start mysqld.service: Unit not found,检查文件名是否为mysqld.service(不是mysql.service),且路径是否为/etc/systemd/system/(非/lib/systemd/system/)。
6. 生产就绪检查与性能基线:跑通这 3 个命令,才算真正落地
安装完成不等于可用。5.7.22 的“生产就绪”必须通过三道硬核验证:连接性、一致性、性能基线。我习惯在部署后立即执行以下检查,10 分钟内定位 90% 的隐性问题。
6.1 连接性验证:覆盖本地、远程、SSL(可选)
# 1. 本地 socket 连接(验证基础) mysql -u root -p -S /tmp/mysql.sock -e "SELECT 'LOCAL SOCKET OK';" # 2. 本地 TCP 连接(验证网络栈) mysql -u root -p -h 127.0.0.1 -P 3306 -e "SELECT 'LOCAL TCP OK';" # 3. 远程连接(从另一台机器执行,验证 bind-address 和防火墙) # mysql -u admin -p -h <your_server_ip> -P 3306 -e "SELECT 'REMOTE OK';" # 4. SSL 连接(若启用,验证证书链) mysql -u root -p --ssl-mode=REQUIRED -h 127.0.0.1 -e "SHOW STATUS LIKE 'Ssl_cipher';"关键指标:
- 所有连接应在 1 秒内返回结果。若超时,检查
firewall-cmd --list-all(CentOS)或ufw status(Ubuntu)是否放行 3306。 SHOW STATUS LIKE 'Ssl_cipher'返回非空值,表示 SSL 握手成功。
6.2 一致性验证:用mysqlcheck扫描所有系统表
# 检查并自动修复所有 mysql 系统库(关键!) mysqlcheck -u root -p --auto-repair --check --optimize mysql # 检查所有用户库(如有) mysqlcheck -u root -p --auto-repair --check --optimize --all-databases为什么必须做?
- 初始化后,
mysql库中的user,db,tables_priv等表可能存在元数据不一致(尤其在异常中断后)。 --auto-repair会尝试修复,但若提示Error : Table 'mysql.user' doesn't exist,说明初始化彻底失败,需重来。
6.3 性能基线:用sysbench跑 1 分钟 OLTP 测试
# 安装 sysbench(CentOS) yum install epel-release -y && yum install sysbench -y # 准备测试数据(10 张表,每张 10000 行) sysbench /usr/share/sysbench/oltp_read_write.lua \ --mysql-host=127.0.0.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password='P@ssw0rd2024!' \ --mysql-db=sbtest \ --tables=10 \ --table-size=10000 \ prepare # 执行 60 秒压力测试 sysbench /usr/share/sysbench/oltp_read_write.lua \ --mysql-host=127.0.0.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password='P@ssw0rd2024!' \ --mysql-db=sbtest \ --tables=10 \ --table-size=10000 \ --threads=8 \ --time=60 \ --report-interval=10 \ run解读结果:
- 关注
transactions:行末的tps(每秒事务数)。在 4 核 8G 虚拟机上,5.7.22 通常应达 300~500 tps。若低于 100,检查iostat -x 1是否await> 50ms(磁盘瓶颈)或vmstat 1是否si/so频繁(内存交换)。 read/write requests应大致均衡(读写混合场景)。若write requests极低,检查innodb_flush_log_at_trx_commit是否被误设为2(牺牲持久性换性能)。
最后,我养成一个雷打不动的习惯:每次部署完 5.7.22,立刻备份my.cnf和/data/mysql-5.7.22/下的ibdata1、ib_logfile*、mysql/目录(不含数据表),存到离线介质。不是怕硬盘坏,是怕某天自己手抖DROP DATABASE—— 那个备份,就是唯一的后悔药。希望帮到你。
本文还有配套的精品资源,点击获取