在 Linux 系统中,MySQL(或其分支 MariaDB)的基础配置是保障数据库稳定运行、性能优化和安全访问的关键。以下从​​配置文件定位​​、​​核心参数解析​​、​​用户权限管理​​、​​日志配置​​、​​服务管理​​等维度展开说明,并提供具体操作示例。

​​一、配置文件定位​​

MySQL 的配置文件采用​​分层加载​​机制,主配置文件通常包含全局参数,还可通过 includeinclude-dir指令引入其他子配置文件。不同 Linux 发行版和 MySQL 版本的配置文件路径略有差异:

​​配置文件/目录​​

​​说明​​

​​常见路径​​

主配置文件(my.cnf/my.ini)

全局核心配置,优先级最高

CentOS/RHEL: /etc/my.cnf
Ubuntu/Debian:
/etc/mysql/my.cnf

子配置文件目录

存放分模块配置(如日志、连接池等),主配置文件通过 include-dir引入

CentOS/RHEL: /etc/my.cnf.d/
Ubuntu/Debian:
/etc/mysql/conf.d/

数据目录

存储数据库文件(如表、索引、日志)

默认 /var/lib/mysql/
可通过
datadir参数自定义

临时目录

存储临时文件(如排序、临时表)

默认 /tmp/
可通过
tmpdir参数自定义

错误日志文件

记录 MySQL 启动/运行错误信息

默认 /var/log/mysqld.log(CentOS)
/var/log/mysql/error.log(Ubuntu)

​​二、核心配置参数解析​​

修改配置文件前建议备份原文件(如 cp /etc/my.cnf /etc/my.cnf.bak),避免配置错误导致服务异常。以下是最常用的核心参数:

​​1. 基础运行参数​​

​​参数​​

​​作用​​

​​推荐值/说明​​

port

MySQL 监听的 TCP 端口

默认 3306,生产环境建议保持默认或通过防火墙限制访问。

bind-address

MySQL 监听的 IP 地址(0.0.0.0 表示监听所有网卡)

- 单实例:0.0.0.0(允许远程连接)
- 主从复制:主库需监听从库 IP 或
0.0.0.0

datadir

数据库文件存储路径

默认 /var/lib/mysql/,需确保 MySQL 进程对该目录有读写权限(chown -R mysql:mysql /var/lib/mysql)。

socket

Unix 域套接字文件路径(本地连接使用)

默认 /var/lib/mysql/mysql.sock,需与 mysql.server脚本一致。

pid-file

MySQL 进程 PID 文件路径

默认 /var/run/mysqld/mysqld.pid(CentOS)或 /var/run/mysql/mysql.pid(Ubuntu)。

​​2. 字符集与校对规则​​

MySQL 字符集需统一设置以避免乱码,推荐使用 utf8mb4(支持 Emoji 和生僻字):

[mysqld]
character_set_server = utf8mb4          # 服务器默认字符集
collation_server = utf8mb4_unicode_ci   # 校对规则(不区分大小写)
init_connect = 'SET NAMES utf8mb4'      # 自动为新连接设置字符集(仅对非 root 用户生效)
[client]
default-character-set = utf8mb4         # 客户端默认字符集
[mysql]
default-character-set = utf8mb4         # mysql 命令行客户端字符集

​​3. 连接与线程参数​​

控制 MySQL 能同时处理的连接数和线程性能:

[mysqld]
max_connections = 1000                  # 最大连接数(默认 151,高并发场景需调大)
max_connect_errors = 10000              # 单个 IP 最大连接错误次数(防暴力破解)
thread_cache_size = 100                 # 线程缓存数(减少新建线程开销)
thread_concurrency = 8                  # 线程并发数(建议为 CPU 核心数的 2 倍)
wait_timeout = 86400                    # 非交互连接超时时间(秒,默认 28800=8小时)
interactive_timeout = 86400             # 交互连接超时时间(秒)

​​4. InnoDB 存储引擎参数(核心)​​

InnoDB 是 MySQL 最常用的存储引擎,其参数直接影响性能:

[mysqld]
default-storage-engine = InnoDB         # 默认存储引擎设为 InnoDB
innodb_buffer_pool_size = 4G            # 缓冲池大小(关键参数!建议为物理内存的 50%-70%)
innodb_buffer_pool_instances = 4        # 缓冲池实例数(提升并发访问性能,建议 4-8 个)
innodb_log_file_size = 512M             # 重做日志(redo log)大小(默认 48M,建议 512M-2G)
innodb_log_buffer_size = 64M            # 日志缓冲区大小(默认 16M,大事务需调大)
innodb_flush_log_at_trx_commit = 2      # 事务提交时刷日志策略(1=强一致,2=平衡,0=性能优先)
innodb_file_per_table = ON              # 每个表单独存储为 .ibd 文件(推荐,方便管理)
innodb_flush_method = O_DIRECT          # 绕过 OS 缓存直接写磁盘(提升写入性能,需 SSD 支持)

​​5. 日志参数​​

日志是排查问题和审计的关键,需根据业务需求启用:

[mysqld]
# 错误日志(必启)
log_error = /var/log/mysqld.log         # 错误日志路径(CentOS)
log_error_verbosity = 3                 # 日志详细程度(1=错误,2=警告,3=信息)

# 慢查询日志(优化必备)
slow_query_log = ON                     # 启用慢查询日志
slow_query_log_file = /var/log/mysql/slow.log  # 慢查询日志路径
long_query_time = 2                     # 慢查询阈值(超过 2 秒的语句)
log_queries_not_using_indexes = ON      # 记录未使用索引的查询(辅助优化)

# 二进制日志(主从复制/数据恢复必备)
server-id = 1                           # 主从复制唯一 ID(主库 1,从库 2、3...)
log_bin = /var/log/mysql/binlog         # 二进制日志路径(需提前创建目录并授权)
binlog_format = ROW                     # 日志格式(ROW=行级,STATEMENT=语句级,MIXED=混合)
expire_logs_days = 7                    # 二进制日志保留天数(自动清理旧日志)

​​三、用户权限管理​​

MySQL 安装后会生成默认的 root用户(本地或远程登录),需通过权限配置保障安全。

​​1. 初始安全设置(必做)​​

MySQL 8.0+ 推荐使用 mysql_secure_installation初始化安全选项(设置 root 密码、删除匿名用户、禁止 root 远程登录等):

# CentOS/RHEL
mysql_secure_installation

# Ubuntu/Debian(需先启动 MySQL)
sudo mysql_secure_installation

•提示输入当前 root 密码(初始为空,直接回车);

•设置新 root 密码(需符合复杂度要求);

•移除匿名用户(建议选 Y);

•禁止 root 远程登录(根据需求选 Y/N);

•移除测试数据库(选 Y);

•重新加载权限表(选 Y)。

​​2. 创建普通用户并授权​​

通过 mysql客户端登录 root 用户,创建业务用户并分配最小权限(例如仅允许查询 mydb库的 users表):

-- 登录 MySQL
mysql -u root -p

-- 创建用户(% 表示允许远程登录,localhost 仅本地)
CREATE USER 'biz_user'@'%' IDENTIFIED BY 'StrongPassword123!';
CREATE USER 'biz_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT USAGE ON *.* TO 'biz_user'@'%';  -- 刷新权限(可选)

-- 授予查询权限(示例:允许查询 mydb 库的 users 表)
GRANT SELECT ON mydb.users TO 'biz_user'@'%';

-- 授予增删改查权限(示例:允许操作 mydb 库的所有表)
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'biz_user'@'%';

-- 刷新权限(使授权立即生效)
FLUSH PRIVILEGES;

​​3. 查看与回收权限​​

-- 查看用户权限
SHOW GRANTS FOR 'biz_user'@'%';

-- 回收权限(示例:收回 INSERT 权限)
REVOKE INSERT ON mydb.* FROM 'biz_user'@'%';

-- 删除用户
DROP USER 'biz_user'@'%';

​​四、日志配置与管理​​

​​1. 错误日志​​

•​​作用​​:记录 MySQL 启动失败、崩溃、连接异常等信息,是排查问题的首要工具。

查看最新错误​​:

tail -f /var/log/mysqld.log  # CentOS
tail -f /var/log/mysql/error.log  # Ubuntu

​​2. 慢查询日志​​

•​​启用与分析​​:

1.确认 slow_query_log=ONlong_query_time合理(如 2 秒);

2.分析慢查询日志(推荐使用 pt-query-digest工具):

pt-query-digest /var/log/mysql/slow.log > slow_report.txt

​​3. 二进制日志(Binlog)​​

•​​作用​​:记录所有写操作(INSERT/UPDATE/DELETE),用于主从复制和数据恢复。

查看 Binlog 内容​​:

mysqlbinlog /var/log/mysql/binlog.000001  # 查看第一个 Binlog 文件

清理旧日志​​:

手动清理(危险!需确认已备份):

PURGE BINARY LOGS BEFORE '2025-01-01 00:00:00';  -- 清理 2025 年前的日志

自动清理(通过 expire_logs_days参数)。

​​五、服务管理​​

MySQL 服务通过 systemctl(CentOS 7+/Ubuntu 16.04+)或 service命令管理。

​​1. 常用命令​​

# 启动服务
systemctl start mysqld    # CentOS
systemctl start mysql     # Ubuntu

# 停止服务
systemctl stop mysqld
systemctl stop mysql

# 重启服务(修改配置后需重启生效)
systemctl restart mysqld
systemctl restart mysql

# 查看服务状态
systemctl status mysqld
systemctl status mysql

# 开机自启
systemctl enable mysqld
systemctl enable mysql

​​2. 配置生效方式​​

无需重启​​:部分参数(如 slow_query_logmax_connections)可通过 SET GLOBAL动态调整(但重启后会失效):

SET GLOBAL max_connections = 2000;  -- 临时调整最大连接数

•​​必须重启​​:核心参数(如 datadirinnodb_buffer_pool_size)需修改配置文件后重启服务生效。

​​六、常见问题排查​​

​​1. 无法远程连接 MySQL​​

•​​检查 bind-address​:确认 my.cnfbind-address=0.0.0.0(允许所有 IP 连接)。

•​​检查用户权限​​:确保用户有 %主机权限(如 'user'@'%')。

检查防火墙​​:开放 3306 端口(CentOS 使用 firewalld,Ubuntu 使用 ufw):

firewall-cmd --add-port=3306/tcp --permanent  # CentOS
firewall-cmd --reload
ufw allow 3306/tcp                            # Ubuntu

​​2. MySQL 启动失败​​

•​​查看错误日志​​:通过 log_error路径定位具体错误(如端口被占用、数据目录权限不足)。

•​​端口被占用​​:使用 netstat -tlnp | grep 3306检查是否有其他进程占用 3306 端口。

​数据目录权限​​:确保 MySQL 进程用户(如 mysql)对 datadir有读写权限:

chown -R mysql:mysql /var/lib/mysql

​​3. 慢查询日志未记录​​

•​​确认参数生效​​:通过 SHOW VARIABLES LIKE 'slow_query_log%';检查 slow_query_log是否为 ON

​检查日志路径权限​​:确保 MySQL 进程对 slow_query_log_file路径有写权限。