my.cnf详解

文章目录

一、常见配置

适用于大多数场景,包含 基础连接、存储引擎、日志、字符集等关键配置,可直接复制使用

b 复制代码
[mysqld]
# 基础配置
datadir = /var/lib/mysql  # MySQL 数据存储目录(容器内默认路径,需与卷挂载一致)
socket = /var/run/mysqld/mysqld.sock  # 套接字文件路径
pid-file = /var/run/mysqld/mysqld.pid  # PID 文件路径

# 字符集配置(避免中文乱码)
character-set-server = utf8mb4  # 支持所有 Unicode 字符(含 emoji)
collation-server = utf8mb4_unicode_ci  # 对应字符集的排序规则
init_connect = 'SET NAMES utf8mb4'  # 初始化连接时设置字符集

# 连接配置
max_connections = 1000  # 最大连接数(根据业务需求调整,默认151)
wait_timeout = 600  # 连接空闲超时时间(秒,默认28800)
interactive_timeout = 600  # 交互式连接超时时间(秒,默认28800)

# 存储引擎与表配置
default-storage-engine = InnoDB  # 默认存储引擎(推荐 InnoDB 支持事务)
innodb_file_per_table = 1  # 每张表独立存储为一个文件(便于管理和备份)
innodb_buffer_pool_size = 1G  # InnoDB 缓冲池大小(建议设为容器内存的 50%-70%,如 2G 内存设 1G)
innodb_log_file_size = 256M  # InnoDB 日志文件大小(默认48M,调大减少日志切换频率)
innodb_log_buffer_size = 64M  # InnoDB 日志缓冲区大小(默认16M)
innodb_flush_log_at_trx_commit = 1  # 事务提交时立即写入磁盘(1=安全,0=性能优先,2=折中)

# 日志配置(便于问题排查)
slow_query_log = 1  # 开启慢查询日志(默认0关闭)
slow_query_log_file = /var/log/mysql/slow.log  # 慢查询日志路径
long_query_time = 2  # 慢查询阈值(秒,超过该时间记录日志)
log_error = /var/log/mysql/error.log  # 错误日志路径(必须配置,排查启动故障)
general_log = 0  # 关闭通用查询日志(默认0,开启会占用大量磁盘)

# 性能优化配置
query_cache_type = 0  # 关闭查询缓存(MySQL 8.0 已移除,5.7 建议关闭)
query_cache_size = 0  # 查询缓存大小(0=禁用)
tmp_table_size = 64M  # 临时表最大大小(默认16M,避免临时表过大导致磁盘写入)
max_heap_table_size = 64M  # 内存表最大大小(默认16M,与 tmp_table_size 保持一致)

# 安全配置
skip-name-resolve  # 禁用 DNS 反向解析(加快连接速度,避免解析失败问题)
max_allowed_packet = 64M  # 允许最大数据包大小(默认4M,需根据业务调整,如上传大文件)

[mysql]
default-character-set = utf8mb4  # MySQL 客户端默认字符集

[mysqld_safe]
log-error = /var/log/mysql/error.log  # 安全模式下错误日志路径
socket = /var/run/mysqld/mysqld.sock  # 安全模式下套接字路径

二、最小配置

b 复制代码
[mysqld]
# 数据存储目录(Docker 容器内默认路径,必须正确)
datadir = /var/lib/mysql

# 套接字文件路径(用于本地连接)
socket = /var/run/mysqld/mysqld.sock

# PID 文件路径(记录 MySQL 进程 ID)
pid-file = /var/run/mysqld/mysqld.pid

# 字符集配置(避免中文乱码,推荐 utf8mb4)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

三、主从配置

为了突出问题的要点,本例在最小配置的基础上修改。

(1)主库

b 复制代码
[mysqld]
# 数据存储目录
datadir = /var/lib/mysql
# 套接字文件路径
socket = /var/run/mysqld/mysqld.sock
# PID 文件路径
pid-file = /var/run/mysqld/mysqld.pid
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# ----------------- 新增配置 -----------------
# 服务器唯一ID (1-4294967295 之间的整数)
server-id = 1

# ----------------- 新增配置 -----------------
# 开启二进制日志(主从复制必需)
log_bin = /var/log/mysql/mysql-bin.log
# 二进制日志索引文件
log_bin_index = /var/log/mysql/mysql-bin.index

注意,一般都没有权限,要到容器内指定权限

docker exec -it <容器id> /bin/bash

在容器内执行以下命令:创建日志目录 + 授权给 mysql 用户

mkdir -p /var/log/mysql # 递归创建目录(包括父目录)

chown -R mysql:mysql /var/log/mysql # 赋予 mysql 用户读写权限

chmod 755 /var/log/mysql # 目录权限设置为 755(只读+执行)

(2)从库

b 复制代码
[mysqld]
# ===================== 基础配置(与主库一致) =====================
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# ===================== 从库核心配置 =====================
# 1. 从库唯一ID(必须与主库、其他从库不同,建议取值范围:100-200)
server-id = 101

# 2. 中继日志配置(从库接收主库二进制日志后,存储为中继日志,再应用到从库)
relay-log = /var/log/mysql/relay-bin  # 中继日志文件名前缀
relay-log-index = /var/log/mysql/relay-bin.index  # 中继日志索引文件
relay-log-info-file = /var/log/mysql/relay-log.info  # 中继日志信息文件(记录复制进度)

# 3. 复制过滤配置(可选,仅同步需要的数据库/表)
# 忽略所有数据库(优先级高于白名单,谨慎使用)
# replicate-ignore-db = mysql
# 仅同步指定数据库(多个数据库用逗号分隔)
# replicate-do-db = test_db1
# replicate-do-db = test_db2
# 仅同步指定表(格式:数据库.表)
# replicate-do-table = test_db1.user
# 忽略指定表
# replicate-ignore-table = test_db1.log

# 4. 从库只读配置(防止从库写入数据,确保主从数据一致性)
read-only = 1  # 开启只读模式(仅允许 SUPER 权限用户写入)
super-read-only = 1  # 严格只读(SUPER 权限用户也无法写入,MySQL 8.0+ 支持)

# 5. 其他优化配置
max_connections = 1000  # 最大连接数(根据从库负载调整)
innodb_buffer_pool_size = 1G  # InnoDB 缓冲池(建议为从库内存的 50%-70%)
log_error = /var/log/mysql/error.log  # 错误日志(排查复制故障必备)

# 6. 主从复制 GTID 模式配置(可选,推荐开启,便于复制管理)
gtid_mode = ON  # 开启 GTID 模式
enforce_gtid_consistency = ON  # 强制 GTID 一致性(防止非 GTID 事务)
相关推荐
AI备忘录12 分钟前
(二十五)华为华三锐捷迈普思科 ERPS 环网保护配置命令(G.8032 五厂商对照)
运维·服务器·网络·网络协议·华为
hwscom16 分钟前
几分钟开防护,SQL和XSS注入全被护卫神挡住
数据库·sql·xss
石小千19 分钟前
Redis开启ACL认证
数据库·redis·缓存
木由里予20 分钟前
NAND 这门生意
运维·服务器·网络·单片机
Dxy123931021623 分钟前
MySQL JSON 生成列索引原理、实战与坑点
mysql·adb·json
东风微鸣25 分钟前
把 Tailscale 接进 Prometheus 监控
java·数据库·prometheus
不会就选b28 分钟前
Linux之ip地址<3>
linux·运维·tcp/ip
wno70428 分钟前
MYSQL 常用合并函数
android·数据库·mysql
东风微鸣30 分钟前
一次断电引发的血案:Ubuntu 26.04 升级中断后的完整救援实录
数据库·ubuntu·postgresql
Kendra9191 小时前
运维监控平台(Prometheus + Grafana)部署与维护
运维·grafana·prometheus