下面给你一套在 CentOS 7 上用 **MySQL 5.7 二进制包(tar.gz)**部署的“企业可运维”方案(含 systemd、自启动、最小可用配置与加固)。先把话讲明白:MySQL 5.7 的最后一个社区版本是 5.7.44,且已进入仅维持级别支持;CentOS 7 已在 2024-06-30 结束生命周期。如果这是生产环境,建议把升级/迁移列入路线图;如果因兼容性必须上 5.7,请按下面做“隔离+最小暴露+可回滚”。(MySQL开发者区)
部署工作流(建议按这个顺序跑)🚀
flowchart TD A[安装依赖] --> B[创建用户/目录] B --> C[解压二进制包并建立软链] C --> D[写 my.cnf] D --> E[初始化数据目录] E --> F[写 systemd 服务并启动] F --> G[设置 root 密码/安全加固] G --> H[验证与基线巡检]关键参数对齐表(先统一口径,后面命令就不会乱)
| 项目 | 推荐值 | 说明 |
|---|---|---|
| 安装目录 | /usr/local/mysql | 统一管理二进制安装路径 |
| 数据目录 | /data/mysql | 数据与程序分离,利于备份与迁移 |
| 配置文件 | /etc/my.cnf | 运维习惯路径 |
| 端口 | 3306 | 如非必要别对公网开放 |
| Socket | /tmp/mysql.sock | 本机运维连接更稳 |
强提醒:把 数据目录(datadir) 和 权限(owner) 配对好,90% 的启动问题都在这两点。
1)安装依赖(MySQL 5.7 二进制运行所需)
yum -y install libaio numactl-libs perl net-tools解释:
libaio:InnoDB 异步 IO 依赖,不装大概率起不来或性能异常。numactl-libs:NUMA 相关库,避免部分机器启动告警/性能抖动。perl:部分工具脚本会用到(例如 mysql_install_db 时代遗留,5.7 偶尔仍依赖环境)。net-tools:便于用netstat排查端口监听(可选但运维很顺手)。
2)创建用户与目录(最小权限模型)
groupadd -r mysql useradd -r -g mysql -s /sbin/nologin mysql mkdir -p /data/mysql /usr/local/mysql chown -R mysql:mysql /data/mysql解释:
-r创建系统账户,避免与业务用户混用。nologin:数据库账户不允许交互登录,减少攻击面。chown只给数据目录授权,符合“程序只读、数据可写”的基本原则。
3)解压二进制包并建立软链(版本可控、可回滚)
假设你已把
mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz放到/usr/local/src/(文件名以你实际为准)。
cd /usr/local/src tar -zxf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.44 ln -sfn /usr/local/mysql-5.7.44 /usr/local/mysql chown -R root:root /usr/local/mysql-5.7.44解释:
真实目录带版本号,升级/回滚就是换软链,变更可控。
程序目录归
root,避免被篡改;数据目录才归mysql。
追加环境变量(让 mysql 命令全局可用):
echo 'export PATH=/usr/local/mysql/bin:$PATH' >/etc/profile.d/mysql.sh source /etc/profile.d/mysql.sh解释:
放到
/etc/profile.d/是企业常见做法,利于一致化配置管理。
4)写入最小可用 my.cnf(稳定优先,少即是多)
cat >/etc/my.cnf <<'EOF' [mysql] default-character-set = utf8mb4 [mysqld] user = mysql basedir = /usr/local/mysql datadir = /data/mysql port = 3306 socket = /tmp/mysql.sock pid-file = /data/mysql/mysql.pid character-set-server = utf8mb4 collation-server = utf8mb4_general_ci skip-name-resolve = 1 # 连接与基础容量(小中型通用起步值) max_connections = 500 table_open_cache = 2000 # InnoDB 基线 innodb_buffer_pool_size = 1G innodb_flush_method = O_DIRECT innodb_file_per_table = 1 # 日志(出事能追、性能可观测) log_error = /data/mysql/error.log slow_query_log = 1 slow_query_log_file = /data/mysql/slow.log long_query_time = 1 EOF解释:
skip-name-resolve=1:避免 DNS 反查带来的连接抖动;配合“账号用 IP 授权”。innodb_buffer_pool_size:建议按内存 60%~70%(专用库)规划;这里给的是“可启动基线”。日志放数据盘:一旦故障,error.log 是第一证据链。
字符集用
utf8mb4:避免表情/扩展字符写入报错(这是最常见踩坑之一)。
5)初始化数据目录(两种方式:带随机密码 / 无密码)
初始化前确保目录干净:
ls -al /data/mysql解释:
你要确认这里不是旧库残留;否则初始化会失败或“看似成功但数据不对”。
方式A:生成随机 root 密码(更安全,推荐)
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql解释:
--initialize会生成临时 root 密码,写入 error.log。上线更符合安全预期。
查看临时密码:
grep -i 'temporary password' /data/mysql/error.log | tail -n 1解释:
这行就是你第一次登录 root 的通行证,拿到后立刻改密码。
方式B:无密码初始化(仅限内网临时环境)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql解释:
这会让 root 初始空密码,部署快但风险高;若你后续忘了加固,就是给自己埋雷。
6)配置 systemd 服务并启动(标准化运维入口)
cat >/etc/systemd/system/mysqld.service <<'EOF' [Unit] Description=MySQL Server 5.7 (Binary) After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf ExecStop=/usr/local/mysql/bin/mysqladmin --socket=/tmp/mysql.sock -uroot shutdown Restart=on-failure LimitNOFILE=100000 [Install] WantedBy=multi-user.target EOF解释:
mysqld_safe:二进制安装常用方式,遇到崩溃更容易保留诊断信息。LimitNOFILE:提高文件句柄上限,避免高并发下出现 “Too many open files”。
启动并设为开机自启:
systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld --no-pager解释:
daemon-reload:让 systemd 识别新服务文件。status:第一时间确认是否“真启动”,不要只看进程。
7)首次登录与安全加固(把风险关在门里)🔒
如果你用的是“随机密码初始化”,先用临时密码登录:
/usr/local/mysql/bin/mysql -uroot -p -S /tmp/mysql.sock解释:
-S指定 socket,避免走 TCP 端口,排障更直接。
进入后立刻改 root 密码(请替换为强密码):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPassw0rd!@#'; FLUSH PRIVILEGES;解释:
这是你必须完成的“交付门槛”。不改密码=不合格上线。
再做两件务实的加固:
1)禁止 root 远程(默认就不该放开)
2)创建业务账号并最小授权:
CREATE USER 'app'@'10.%' IDENTIFIED BY 'AppPassw0rd!@#'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,INDEX,EXECUTE ON yourdb.* TO 'app'@'10.%'; FLUSH PRIVILEGES;解释:
账号按网段授权,结合
skip-name-resolve,稳定且可控。授权只给业务需要的动作,别图省事上来就
ALL PRIVILEGES。
8)验证清单(上线前的“最后一公里”)
mysql --version ss -lntp | grep 3306 || true tail -n 50 /data/mysql/error.log解释:
版本确认:避免“装了但不是你以为的版本”。
端口监听:确认是否对外暴露;不需要公网就别开。
错误日志:任何启动告警都在这里先解释清楚再交付。
你现在的最优下一步
如果你告诉我三点信息:内存大小、磁盘类型(SSD/机械)、预计并发连接数,我可以把innodb_buffer_pool_size / max_connections / table_open_cache这些参数按你的业务模型“定标”,做到既稳又不浪费资源。