生产环境MySQL必须禁用skip-grant-tables、绑定内网IP、重命名root账号、合理设置innodb_buffer_pool_size和max_connections。

MySQL 生产环境必须禁用 skip-grant-tables
跳过权限验证看似方便初始化,但等于把数据库裸奔在公网。只要配置文件里出现这行,重启后所有账号(包括空密码)都能直接登录,mysqld 启动日志里会明确警告 WARNING: --skip-grant-tables specified。生产环境上线前务必 grep 检查:
grep -r "skip-grant-tables" /etc/my.cnf* /usr/my.cnf,删掉、注释掉,再执行
mysql -u root -p 验证是否真正启用了权限系统。
bind-address 必须显式设为内网 IP 或 127.0.0.1
默认值 0.0.0.0 是高危配置,尤其在云主机或 Docker 环境中极易暴露到公网。若应用与 MySQL 同机部署,直接设 bind-address = 127.0.0.1;若需跨机器访问,只写具体内网 IP,例如 bind-address = 192.168.10.5。切勿使用 localhost(它会触发 socket 连接,绕过 TCP 层限制)。检查方式:
mysql -e "SHOW VARIABLES LIKE 'bind_address';",输出必须是明确的 IPv4 地址,不是
* 或空值。
root 账号必须删除或重命名,且禁止远程登录
MySQL 安装后默认存在 'root'@'localhost' 和 'root'@'127.0.0.1' 两个账号,部分版本甚至带 'root'@'%'。立即执行:
DROP USER 'root'@'%';。新账号密码必须满足:长度 ≥12,含大小写字母+数字+符号,不包含用户名或日期。后续管理统一用该账号 +
RENAME USER 'root'@'localhost' TO 'adm_2024'@'localhost';
FLUSH PRIVILEGES;
mysql -u adm_2024 -p -S /var/run/mysqld/mysqld.sock 本地 socket 连接。innodb_buffer_pool_size 至少设为物理内存的 50%~75%
这个参数直接影响查询性能和磁盘 IO 压力。设太小会导致频繁刷脏页、Buffer Pool 命中率暴跌;设太大可能挤占系统缓存,引发 OOM。常见错误是沿用开发机的 128M 或 256M。正确做法:
- 查总内存:
free -h - 查当前值:
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" - 线上 16G 内存机器建议设为
10G(即10737418240字节),写入/etc/my.cnf的[mysqld]段 - 修改后必须重启
systemctl restart mysqld,仅 reload 不生效
Innodb_buffer_pool_reads(每秒物理读)是否持续 > 5,过高说明 Buffer Pool 不足。生产环境最常被忽略的是 max_connections 与应用连接池的匹配——设太高撑爆内存,设太低导致应用报 Too many connections。这需要结合实际并发量和每个连接平均内存占用测算,不能只看文档推荐值。










