首页 / MySQL 入门教程 / MySQL 配置与日常运维

MySQL 入门教程

MySQL 配置与日常运维

本教程共 46 篇 · 第 46 篇 · 更新于 2026-07-30 · 约 13 分钟阅读

MySQLMySQL 入门教程配置运维my.cnfinnodb_buffer_pool_size日志二进制日志服务管理

46. MySQL 配置与日常运维

本节目标:理解 MySQL 配置文件的加载顺序与核心参数,掌握服务启停与状态查看命令,了解错误日志/慢查询日志/二进制日志的作用与配置,知道版本升级的基本流程和常见问题排查思路。

46.1 配置文件

MySQL 启动时读取配置文件(option file),常见位置:

配置文件路径

系统路径
Linux/etc/my.cnf/etc/mysql/my.cnf/usr/etc/my.cnf~/.my.cnf
WindowsC:\Windows\my.iniC:\Windows\my.cnfC:\my.iniC:\my.cnf%PROGRAMDATA%\MySQL\MySQL Server X.X\my.ini

后加载的覆盖先加载的。推荐用 /etc/my.cnf(Linux)或 %PROGRAMDATA% 下的 my.ini(Windows)。

配置文件结构

[mysqld]    # 服务端配置
port = 3306
datadir = /var/lib/mysql
character_set_server = utf8mb4

[client]    # 客户端配置(mysql 命令行、mysqldump 等)
port = 3306
socket = /var/lib/mysql/mysql.sock

[mysql]     # 仅 mysql 命令行客户端
default-character-set = utf8mb4

46.2 核心参数

内存相关

[mysqld]
# InnoDB 缓冲池,最重要的内存参数,建议设为物理内存的 50%-75%
innodb_buffer_pool_size = 4G

# 每个连接的缓冲区(按需分配,非一次性)
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M

# 内存临时表上限
tmp_table_size = 64M
max_heap_table_size = 64M
Tip

innodb_buffer_pool_size 是 MySQL 性能调优第一参数。它缓存数据和索引页,减少磁盘 IO。设太小频繁磁盘读写,设太大挤占操作系统内存。

连接相关

[mysqld]
# 最大连接数,默认 151,高并发场景需要调大
max_connections = 1000

# 连接空闲超时(秒),默认 8 小时
wait_timeout = 1800
interactive_timeout = 1800

# 最大错误连接次数,超过临时封禁主机
max_connect_errors = 10000

# 允许的最大数据包大小
max_allowed_packet = 128M

InnoDB 相关

[mysqld]
# 每个表独立表空间文件(推荐 ON)
innodb_file_per_table = 1

#  redo log 大小
innodb_log_file_size = 1G

# 刷盘策略,O_DIRECT 避免双缓冲
innodb_flush_method = O_DIRECT

# 每次事务提交写 redo log(最安全)
innodb_flush_log_at_trx_commit = 1
innodb_flush_log_at_trx_commit行为安全性性能
1每次提交写磁盘最高最低
0每秒写一次低(宕机丢 1 秒)
2每次提交写 OS 缓存,每秒刷盘
Warning

生产环境建议保持 =1,保证不丢数据。可以接受少量性能损失换数据安全时用 =2

46.3 日志管理

MySQL 有多种日志,各司其职:

日志作用是否默认开启
错误日志(Error Log)启动/运行/停止时的错误信息
慢查询日志(Slow Query Log)记录执行超阈值的 SQL
二进制日志(Binary Log / binlog)记录数据变更,用于复制和恢复8.0+ 默认开启
通用查询日志(General Query Log)记录所有 SQL 语句否(性能影响大,慎用)
中继日志(Relay Log)主从复制时从库的待执行日志主从时才有

错误日志

-- 查看错误日志位置
SHOW VARIABLES LIKE 'log_error';

启动失败、崩溃、死锁等关键信息都在这里,排查问题时首先看。

慢查询日志

-- 开启
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;  -- 超过 1 秒记录
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- 记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = ON;

分析工具:mysqldumpslowpt-query-digest

二进制日志(binlog)

binlog 记录所有数据变更(INSERT/UPDATE/DELETE/DDL),用于主从复制和时间点恢复。

-- 查看 binlog 状态
SHOW VARIABLES LIKE 'log_bin';

-- 查看所有 binlog 文件
SHOW BINARY LOGS;

-- 查看当前写入的 binlog 文件
SHOW MASTER STATUS;

-- 查看 binlog 内容
SHOW BINLOG EVENTS IN 'binlog.000001' LIMIT 10;
[mysqld]
# binlog 格式:ROW(推荐,安全)、STATEMENT、MIXED
binlog_format = ROW

# binlog 过期天数,默认 30 天
expire_logs_days = 30

# 或按秒(8.0+)
binlog_expire_logs_seconds = 2592000
Note

binlog_format=ROW 记录的是行的变更,最安全但日志量大。STATEMENT 记录 SQL 语句,日志量小但某些函数(如 UUID()、NOW())主从可能不一致。生产推荐 ROW。

46.4 服务管理

Linux(systemd)

systemctl start mysqld      # 启动
systemctl stop mysqld       # 停止
systemctl restart mysqld    # 重启
systemctl status mysqld     # 查看状态
systemctl enable mysqld     # 开机自启
systemctl disable mysqld    # 取消自启

Windows

net start mysql     # 启动
net stop mysql      # 停止

services.msc 图形界面操作。

查看运行状态

-- 查看运行状态(连接数、查询量、流量等)
SHOW GLOBAL STATUS;

-- 查看特定状态
SHOW GLOBAL STATUS LIKE 'Threads_connected';  -- 当前连接数
SHOW GLOBAL STATUS LIKE 'Uptime';             -- 运行时长(秒)
SHOW GLOBAL STATUS LIKE 'Slow_queries';       -- 慢查询总数

-- 查看变量
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'version';

46.5 版本升级注意

升级前

  1. 备份:全量备份 + 确认可恢复。
  2. 阅读 Release Notes:看是否有不兼容变更(breaking changes)。
  3. 测试环境验证:先升级测试库,跑一遍业务 SQL。

升级方式

  • 就地升级(In-place):替换二进制文件后启动,MySQL 自动升级数据字典。8.0+ 支持原子 DDL,升级更安全。
  • 逻辑升级(Logical)mysqldump 导出 → 装新版本 → 导入。适合跨大版本。

升级后

-- 检查表是否兼容
mysqlcheck -u root -p --all-databases --check-upgrade

-- 查看错误日志有无告警
Warning

大版本升级(如 5.7 → 8.0、8.0 → 26.7)不可逆。升级前务必做好备份和回滚预案。

46.6 常见问题排查

现象排查方向
连不上 MySQL服务是否启动、防火墙/安全组端口、max_connections 是否打满、用户 host 是否匹配
查询慢是否走索引(EXPLAIN)、是否有锁等待(SHOW ENGINE INNODB STATUS)、慢查询日志
CPU 高大量慢查询、全表扫描、并发连接过多
磁盘满binlog 未清理、临时文件、undo log 膨胀、数据增长
主从延迟从库 IO/SQL 线程状态、大事务、单线程复制瓶颈

常用排查命令

-- 查看当前连接与状态
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;  -- 显示完整 SQL

-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;

-- 查看 InnoDB 状态(含死锁信息)
SHOW ENGINE INNODB STATUS;

-- 查看最近一次死锁
SHOW ENGINE INNODB STATUS\G  -- 找 LATEST DETECTED DEADLOCK 段

46.7 日常运维清单

作为没有专职 DBA 的团队,建议定期做这些事:

  • 每日:检查错误日志、确认备份是否成功、慢查询日志是否有新出现的慢 SQL
  • 每周:检查磁盘空间使用、连接数趋势、表空洞情况
  • 每月:审查用户权限、binlog 清理策略、索引使用情况
  • 每季度:版本补丁评估、故障演练(恢复备份)
上一篇
数据导入导出与批处理
下一篇
已经是最后一篇啦