云服务器 MySQL 搭建 + 调优全套指南(通用 Linux:CentOS / Ubuntu / Debian,MySQL5.7 / 8.0)

云服务器 MySQL 搭建 + 调优全套指南(通用 Linux:CentOS / Ubuntu / Debian,MySQL5.7 / 8.0)

前提说明:云服务器要先做基础安全:安全组放行3306(不建议对公网全开3306,优先内网连接、SSH隧道),系统磁盘区分系统盘和数据盘,数据库数据目录挂载到数据盘,避免系统盘满库挂掉。
下面分为:部署注意事项、核心配置调优、SQL层面调优、操作系统内核调优、日常监控维护、避坑清单。云服务器怎么选:https://act.tag.org.cn

一、搭建阶段(云服务器特有重点)

  1. 磁盘选型(最重要,很多人踩坑)
    • MySQL 极度依赖随机IO:优先选SSD/ESSD,不要用普通机械云盘;
    • 数据目录 datadir 迁移到独立数据盘,不要放系统盘;
    • 磁盘挂载参数:defaults,noatime,nodiratime,关闭文件访问时间记录,减少IO。
  2. 内存规划公式(核心)

    InnoDB 是MySQL默认存储引擎,绝大多数业务只用InnoDB

    innodb_buffer_pool_size = 服务器可用内存  50% ~ 70%
    
    • 小机器(2G):不要超过 1G;
    • 4G:2G~2.8G;
    • 8G:4G~6G;
    • 16G:8G~12G;
    • 剩余内存留给:系统、连接线程、排序缓冲、临时表、操作系统PageCache。

    ❌ 不要设置超过物理内存,会OOM被云服务器内核杀掉。

  3. 连接规划
    max_connections 不是越大越好,默认151,很多人直接改10000,极易OOM。
    • 小型业务:200~500
    • 中业务:500~1000
    • 高并发需要更多连接 → 优先用连接池(Java HikariCP、PHP Swoole连接池),而不是放大max_connections

QQ20261027-021414

二、my.cnf / my.ini 核心参数调优([mysqld]段)

路径:一般 /etc/my.cnf(CentOS) / /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)
修改后:systemctl restart mysqld,务必先备份原配置

[mysqld]
 基础
user=mysql
datadir=/data/mysql   放到独立数据盘
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
port=3306
default-storage-engine=InnoDB
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

 内存核心(重中之重)
innodb_buffer_pool_size = 4G
 多实例buffer_pool拆分,建议每块不大于1G,4G就设4
innodb_buffer_pool_instances = 4
 buffer pool预热,重启后自动加载热点数据
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup = ON

 IO相关(SSD云盘推荐)
innodb_flush_log_at_trx_commit = 1
 1:最安全,每次事务刷盘;2:折中,每秒刷一次,性能高一点,故障最多丢1秒数据;0:不推荐
sync_binlog = 1
innodb_file_per_table = ON   每张表独立ibd文件,删表释放空间
innodb_flush_method = O_DIRECT   绕过操作系统缓存,防止双缓存占用内存,SSD必开
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
 redo log总大小=2G,不要太大,太大崩溃恢复慢;高并发可到2G单个

 连接、会话缓冲
max_connections = 500
wait_timeout = 600
interactive_timeout = 600
 空闲连接10分钟自动断开,防止僵死连接占满
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
 注意:这几个是【每个连接单独分配】,不要设很大!16M、32M很容易内存爆炸

 临时表
tmp_table_size = 64M
max_heap_table_size = 64M
 超过这个大小,临时表落地磁盘,变慢;两个值保持一致

 慢查询日志(必开,用来抓慢SQL)
slow_query_log = ON
slow_query_log_file = /data/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON

 binlog(主从/数据恢复必备)
log_bin = /data/mysql/binlog/mysql-bin
binlog_format = ROW
expire_logs_days = 7   自动清理7天前binlog,防止磁盘打满
binlog_row_image = minimal   减少binlog体积,MySQL8.0支持

 InnoDB其他
innodb_autoinc_lock_mode = 2   高并发插入自增,MySQL8默认2
innodb_stats_on_metadata = OFF  关闭元信息查询自动统计,show table status快很多

 关闭DNS解析,云服务器内网环境加速
skip-name-resolve

MySQL8.0 注意:部分参数废弃,expire_logs_days 换成 binlog_expire_logs_seconds

三、操作系统层面调优(云服务器Linux,非常容易忽略)

  1. 内核参数 /etc/sysctl.conf
 增大文件句柄,MySQL连接多会打开大量文件
fs.file-max = 655350
 减少swap使用,MySQL服务器强烈建议swappiness=1
vm.swappiness = 1
 脏页刷写调整
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
 网络参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

生效:sysctl -p

  1. 资源限制 /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535

作用:放开mysql用户打开文件数限制,不然报 Too many open files

  1. 关闭swap(推荐数据库服务器)
    云服务器内存不足时swap会疯狂读写,数据库直接卡死。
    临时关闭:swapoff -a
    永久注释 /etc/fstab 的swap行。

四、SQL & 索引层面调优(80%性能瓶颈在这里,配置只是辅助)

  1. 强制所有大SQL看执行计划:explain select ...
    • type 最好 ref / range;避免 ALL 全表扫描
    • key 要有索引,Extra 避免 Using filesort、Using temporary
  2. 索引原则
    • 联合索引:最左前缀原则;不要建立大量冗余索引
    • 索引字段尽量小,字符串长字段用前缀索引
    • 禁止在索引列做函数计算:where DATE(create_time)='xxx' 会失效
  3. 规范写法
    • 禁止 select
    • 分页大偏移:limit 100000,10 极慢,改成主键ID书签分页
    • 批量插入用 insert into values (),(),(),不要循环单条insert
    • 大事务拆分,不要一次性更新几万行,锁表、redo log压力巨大
  4. 锁相关
    • InnoDB行锁依赖索引,不走索引会退化成表锁
    • 业务尽量短事务:少在事务里面做sleep、http调用

五、云服务器专属优化点

  1. 快照/备份策略
    • 不要业务高峰打云盘快照;快照会短暂拉高IO
    • 数据库逻辑备份:mysqldump 或者 mydumper,大库优先物理备份(xtrabackup)
  2. 云盘性能限制
    很多云盘有IOPS、带宽配额,高峰期打满后会限流,表现为数据库突然变卡,看云监控的磁盘IOPS、磁盘等待 %util
  3. 内网访问优先
    应用服务器和MySQL放同一个VPC内网,不走公网,延迟低、安全;公网3306尽量不放行,需要远程管理用SSH隧道。
  4. 弹性伸缩思路
    • 读多写少:主从分离,读请求走从库
    • 单库压力太大:分库分表

六、监控 & 诊断命令(日常排查)

 看实时线程、连接、锁
mysql -uroot -p
show processlist;
show engine innodb status;

 看buffer pool命中率(核心指标)
show status like 'Innodb_buffer_pool_read%';
 命中率公式:(1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) 100%
 理想 >99%,低于95%说明buffer pool太小或者热点数据太多

 看慢查询
tail -f /data/mysql/slow.log
 工具:pt-query-digest 分析慢日志(percona-toolkit)

 系统层面看IO瓶颈
iostat -x 1
top
htop

七、常见坑清单

  1. innodb_buffer_pool_size 设置太大,吃掉系统内存,触发OOM杀MySQL
  2. sort_buffer_size / join_buffer_size 设置几十M,每个连接都分配,瞬间内存爆炸
  3. max_connections盲目拉到几千,连接数上来直接OOM
  4. 数据放在系统盘,日志、binlog疯狂写入,系统盘爆满数据库宕机
  5. 机械盘跑MySQL,IO天生瓶颈,怎么调参数都没用
  6. 忘记开binlog或者没设置自动清理,binlog占满磁盘
  7. 公网直接暴露3306,被扫库、拖库
  8. 长事务不提交,导致undo膨胀、锁等待

八、简单调优流程总结

  1. 选SSD、独立数据盘挂载,挂载参数 noatime
  2. 按内存计算 innodb_buffer_pool_size(50%-70%)
  3. 配置文件:redo log、binlog、慢查询、超时时间
  4. 系统:swappiness=1、调高nofile句柄
  5. 上线后:抓慢SQL、加索引、优化业务SQL
  6. 监控:buffer pool命中率、磁盘IO、连接数、慢查询
    ),我可以直接给你一份适配好、复制即用的 my.cnf 完整配置。
posted @ 2026-10-27 02:15  BLOGAME  阅读(0)  评论(0)    收藏  举报