中小型公司直接在生产环境搭建 MySQL,这其实是一个“看似简单、实则深坑无数”的活儿。很多团队觉得 MySQL 开源免费、文档齐全,随便 yum install 或者跑个 Docker 容器就能上生产,结果往往在数据一致性、高可用切换、备份恢复这几个环节栽跟头。
作为过来人,我不讲那些虚头巴脑的理论,只从实战避坑的角度,给你梳理几个核心维度的注意事项。如果你用的是阿里云 RDS、腾讯云 CDB 等云厂商托管版,逻辑是通用的,只是部分运维动作被封装了;如果是自建(On-Premise 或 ECS 自建),那下面这些就是保命符。
1. 架构选型:别把单点当生产
首先得明确一个认知:单机 MySQL 永远不是真正的生产环境。
对于中小公司,业务初期可能流量不大,但“小”不代表“无风险”。一旦主库宕机,业务停摆,损失的是真金白银。
- 最低标配:至少要有主从复制(Master-Slave)。哪怕是从库只做读写分离,也能在主库维护时提供读取服务,或者在主库崩溃时快速提升从库为主库。
- 高可用方案:
- 低成本/轻量级:MHA、Orchestrator + Keepalived。这类工具成熟稳定,社区活跃,适合没有专门 DBA 的团队。
- 云原生推荐:如果用了云服务器,强烈建议直接用云厂商提供的高可用版(通常是一主两备)。虽然多花点钱,但省去了你处理脑裂、故障转移脚本、数据同步延迟排查的巨大精力。
- 避免:不要自己手写复杂的 Shell 脚本来做主从切换,除非你有极其丰富的经验。
2. 参数调优:默认配置全是坑
MySQL 安装后的默认配置文件(my.cnf)是为通用场景设计的,绝对不是为生产优化的。直接上线,轻则性能抖动,重则 OOM(内存溢出)导致进程重启。
- innodb_buffer_pool_size:这是最重要的参数。通常设置为物理内存的 50%-70%。如果服务器有 32G 内存,给 InnoDB 留 16-24G 是合理的。太小导致频繁磁盘 IO,太大导致系统交换分区(Swap)被触发,性能断崖式下跌。
- max_connections:默认通常是 151 或 214。对于 Web 应用,连接池(如 HikariCP, Druid)会复用连接,所以数据库层面的 max_connections 不需要开特别大,但要结合你的应用并发量预估。建议开启
performance_schema监控实际最大连接数,再动态调整。 - 日志设置:
log_bin:必须开启!不开启 binlog 等于没备份,无法做时间点恢复(PITR)。binlog_format:推荐使用ROW模式。相比STATEMENT,它更安全,能避免复杂 SQL 导致的同步不一致问题;相比MIXED,它更可控。expire_logs_days:设置自动清理过期 binlog 的天数(如 7-15 天),防止磁盘写满。
3. 字符集与排序规则:一劳永逸的基础
很多早期项目为了省事,用了默认的 latin1 或者 utf8(注意:MySQL 的 utf8 其实是 utf8mb3,只支持最多 3 字节,存不了 Emoji 表情和生僻字)。
- 强制标准:新建库表统一使用
utf8mb4字符集,排序规则用utf8mb4_0900_ai_ci(MySQL 8.0+)或utf8mb4_general_ci。 - 原因:
utf8mb4是真正的 UTF-8,支持 4 字节字符。现在移动端普及,Emoji 表情无处不在,后期改字符集是一场灾难,且需要锁表,风险极高。
4. 备份策略:最后一道防线
没有备份的系统,等同于裸奔。不要相信“技术不会出错”,要相信“硬件会坏、人会犯蠢、代码会有 Bug”。
- 全量备份:每周一次全量备份。使用
mysqldump或XtraBackup(Percona 出品,推荐,支持热备,不锁表)。 - 增量备份:每天甚至每小时依赖 Binlog 进行增量备份。
- 异地存储:这是关键! 备份文件不能只存在本地磁盘。一定要上传到 OSS(对象存储)、S3 或其他异地服务器。本地磁盘坏了,备份也就没了。
- 定期演练恢复:每季度做一次恢复演练。备份了但不验证能否恢复,等于没备份。很多公司直到真正需要恢复时才去试,结果发现备份文件损坏或版本不兼容,那时候就晚了。
5. 安全加固:别把大门敞开
- 账号权限最小化:
- 严禁使用
root账号连接应用数据库。 - 为每个应用创建独立的数据库账号,并只授予该账号所需的最小权限(SELECT, INSERT, UPDATE, DELETE),禁止 GRANT, DROP, ALTER 等高危权限。
- 限制账号来源 IP,通过防火墙或 MySQL 的
host字段限制只有应用服务器 IP 能访问数据库端口。
- 严禁使用
- 密码复杂度:启用密码强度验证插件,定期轮换密码。
- SSL/TLS 加密:如果跨网段传输(比如应用和数据库不在同一内网),务必开启 SSL 连接,防止中间人抓包窃取数据。
6. 监控与告警:看不见的问题最致命
你不能靠用户投诉才知道数据库挂了。
- 核心指标:
- QPS/TPS(每秒查询/事务数)
- 连接数使用率
- 慢查询数量(Slow Queries)
- InnoDB Buffer Pool 命中率
- 主从延迟(Seconds_Behind_Master)
- 磁盘使用率
- 工具选择:
- 轻量级:Prometheus + Grafana + mysqld_exporter。这是目前业界主流,灵活且免费。
- 云厂商:如果你用阿里云/腾讯云,直接用他们自带的云监控,配置好阈值告警(钉钉、短信、邮件)。
- 慢查询优化:开启
slow_query_log,设定阈值(如 1秒)。定期分析慢查询日志,利用EXPLAIN检查执行计划,添加缺失的索引。索引是 MySQL 性能的命脉。
7. 发布与变更管理
- DDL 操作要谨慎:在大表上加索引、改字段类型,可能会锁表导致业务中断。使用
pt-online-schema-change或gh-ost等在线 DDL 工具,实现无锁变更。 - 灰度发布:应用更新时,先在一台机器上验证,确保新代码对数据库的兼容性,再逐步推广。
总结建议
对于中小型公司,我的建议是:
- 如果预算允许:优先购买云厂商的高可用版 MySQL 实例。让云厂商帮你搞定主从同步、备份、监控、底层硬件维护。你把精力放在业务逻辑和应用层优化上。
- 如果必须自建:
- 选对版本(推荐 MySQL 8.0 LTS 或 5.7 LTS,避开早期不稳定版本)。
- 做好参数调优(尤其是 buffer pool)。
- 建立完善的备份恢复流程(全量+增量+异地+演练)。
- 部署监控系统(Prometheus/Grafana)。
- 严格管控权限和安全。
最后,记住一句话:数据库是系统的核心资产,它的稳定性高于一切功能特性。 不要在数据库上省钱省出大麻烦。
云技术博客