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'@'%';<br>RENAME USER 'root'@'localhost' TO 'adm_2024'@'localhost';<br>FLUSH PRIVILEGES;。新账号密码必须满足:长度 ≥12,含大小写字母+数字+符号,不包含用户名或日期。后续管理统一用该账号 +
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。这需要结合实际并发量和每个连接平均内存占用测算,不能只看文档推荐值。
