在 Linux 系统中,MySQL(或其分支 MariaDB)的基础配置是保障数据库稳定运行、性能优化和安全访问的关键。以下从配置文件定位、核心参数解析、用户权限管理、日志配置、服务管理等维度展开说明,并提供具体操作示例。
一、配置文件定位
MySQL 的配置文件采用分层加载机制,主配置文件通常包含全局参数,还可通过 include或 include-dir指令引入其他子配置文件。不同 Linux 发行版和 MySQL 版本的配置文件路径略有差异:
二、核心配置参数解析
修改配置文件前建议备份原文件(如 cp /etc/my.cnf /etc/my.cnf.bak),避免配置错误导致服务异常。以下是最常用的核心参数:
1. 基础运行参数
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 # Ubuntu2. 慢查询日志
•启用与分析:
1.确认 slow_query_log=ON且 long_query_time合理(如 2 秒);
2.分析慢查询日志(推荐使用 pt-query-digest工具):
pt-query-digest /var/log/mysql/slow.log > slow_report.txt3. 二进制日志(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 mysql2. 配置生效方式
•无需重启:部分参数(如 slow_query_log、max_connections)可通过 SET GLOBAL动态调整(但重启后会失效):
SET GLOBAL max_connections = 2000; -- 临时调整最大连接数•必须重启:核心参数(如 datadir、innodb_buffer_pool_size)需修改配置文件后重启服务生效。
六、常见问题排查
1. 无法远程连接 MySQL
•检查 bind-address:确认 my.cnf中 bind-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 # Ubuntu2. MySQL 启动失败
•查看错误日志:通过 log_error路径定位具体错误(如端口被占用、数据目录权限不足)。
•端口被占用:使用 netstat -tlnp | grep 3306检查是否有其他进程占用 3306 端口。
•数据目录权限:确保 MySQL 进程用户(如 mysql)对 datadir有读写权限:
chown -R mysql:mysql /var/lib/mysql3. 慢查询日志未记录
•确认参数生效:通过 SHOW VARIABLES LIKE 'slow_query_log%';检查 slow_query_log是否为 ON。
•检查日志路径权限:确保 MySQL 进程对 slow_query_log_file路径有写权限。