Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > OpenEuler MySQL故障排查

OpenEuler系统MySQL故障排查终极指南实战教程

作者:J超会运

本文介绍了在OpenEuler系统中针对/usr/local/mysql安装路径的MySQL服务进行全面故障排查、根因定位、解决方案及性能优化的方法,感兴趣的朋友跟随小编一起看看吧

适配说明:本教程针对源码安装在 /usr/local/mysql 路径的 MySQL 服务,全程无安装步骤,覆盖 OpenEuler 系统全场景故障排查、根因定位、解决方案及全维度性能优化,适配 x86 / 鲲鹏 ARM 架构,兼容 MySQL 5.7/8.0 主流版本。

一、前置环境信息确认(排查前必做)

所有故障排查的前提是确认基础环境一致性,避免因路径、权限、配置加载顺序错误导致无效排查。

1. 核心目录与路径确认(/usr/local 专属)

表格

配置项标准路径查看命令
基础安装目录 (basedir)/usr/local/mysqlmysqld --verbose --help | grep -A 1 "basedir"
数据目录 (datadir)/usr/local/mysql/datamysqld --verbose --help | grep -A 1 "datadir"
配置文件加载顺序/etc/my.cnf > /etc/mysql/my.cnf > /usr/local/mysql/my.cnf > ~/.my.cnfmysqld --verbose --help | grep -A 2 "Default options"
错误日志路径默认 /usr/local/mysql/data/ 主机名.errmysql -uroot -p -e "show variables like 'log_error';"
Socket 文件路径默认 /tmp/mysql.sockmysql -uroot -p -e "show variables like 'socket';"
PID 文件路径/usr/local/mysql/data/mysqld.pidmysqld --verbose --help | grep -A 1 "pid-file"

2. 基础环境校验

  1. 环境变量配置:确保 MySQL 命令可全局调用
# 临时生效
export PATH=$PATH:/usr/local/mysql/bin
# 永久生效(OpenEuler系统)
echo "export PATH=\$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
# 验证
mysql --version
  1. 运行用户校验:确认 mysql 用户 / 用户组存在,且目录权限正确
# 检查mysql用户
id mysql
# 修复目录所属权(高频故障点)
chown -R mysql:mysql /usr/local/mysql/data
chmod -R 700 /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/logs # 如有独立日志目录
  1. systemd 服务文件校验:源码安装高频故障点,确保服务文件路径正确
# 查看服务文件路径
systemctl cat mysqld.service
# 核心配置校验(必须匹配/usr/local路径)
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535

二、MySQL 故障排查通用标准化流程

90% 的 MySQL 故障可通过该流程快速定位根因,禁止跳步排查,优先定位故障大类,再深入细节。

第一步:故障现象初步分类

先明确故障类型,缩小排查范围:

第二步:优先查看错误日志(核心中的核心)

MySQL 绝大多数故障都会在错误日志中留下明确根因,这是排查的第一优先级

  1. 日志查看命令
# 方式1:根据配置文件路径查看(推荐)
tail -n 100 -f $(mysql -uroot -p -e "show variables like 'log_error';" | grep -v "Variable_name" | awk '{print $2}')
# 方式2:默认路径查看(启动失败无法登录时用)
tail -n 100 -f /usr/local/mysql/data/$(hostname).err
# 方式3:查看systemd系统日志(启动失败无MySQL日志时用)
journalctl -u mysqld.service -f --no-pager
  1. 日志核心排查要点

第三步:系统资源与服务状态排查

  1. 服务状态基础检查
# 查看服务运行状态
systemctl status mysqld.service
# 查看mysqld进程是否存在
ps -ef | grep mysqld | grep -v grep
# 检查端口是否正常监听(默认3306)
ss -tulpn | grep mysqld
netstat -tulpn | grep 3306
  1. 系统资源瓶颈排查
# 1. 磁盘空间检查(高频故障点:datadir分区满、Inode耗尽)
df -h /usr/local/mysql/data
df -i /usr/local/mysql/data
# 2. 内存检查(OOM、内存不足)
free -mh
# 查看是否有OOM杀死进程记录
dmesg | grep -i "oom" | grep -i "kill"
journalctl -k | grep -i oom
# 3. CPU/IO负载检查
top # 按P看CPU排序,按M看内存排序
iostat -x 5 3 # 查看%iowait、%util磁盘IO负载
vmstat 5 3 # 查看系统上下文切换、阻塞进程
  1. 系统安全组件排查(OpenEuler 特有高频故障点)
# 1. 防火墙检查(远程连接失败核心原因)
# 查看防火墙状态
firewall-cmd --state
# 查看已放行端口
firewall-cmd --list-ports
# 临时放通3306端口
firewall-cmd --add-port=3306/tcp
# 永久放通
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
# 2. SELinux检查(启动失败、权限报错核心原因)
# 查看SELinux状态
getenforce
# 临时关闭(验证是否为SELinux导致)
setenforce 0
# 永久关闭(需重启服务器)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 若不想关闭,添加SELinux规则适配/usr/local路径
semanage fcontext -a -t mysqld_db_t "/usr/local/mysql/data(/.*)?"
restorecon -Rv /usr/local/mysql/data

第四步:配置文件合法性校验

配置文件错误是启动失败、性能异常的 TOP1 原因,尤其是源码安装的路径配置错误。

  1. 配置文件语法校验
# 全量校验配置文件合法性,有错误会直接输出(MySQL 5.7+支持)
mysqld --validate-config --defaults-file=/etc/my.cnf
# 兼容低版本的校验方式
mysqld --verbose --help --defaults-file=/etc/my.cnf > /dev/null
  1. 核心配置项校验重点检查以下参数,确保路径、数值无错误:

第五步:数据库内部状态排查(可正常登录时执行)

若服务可正常登录,通过以下命令定位内部运行异常:

sql

-- 1. 查看当前所有连接,定位长事务、锁等待、异常SQL
show full processlist;

-- 2. 查看InnoDB引擎状态,核心用于死锁、事务、IO异常排查
show engine innodb status;

-- 3. 查看数据库全局配置,确认参数是否生效
show variables like '%参数名%';

-- 4. 查看数据库运行状态指标,定位性能瓶颈
show global status like '%状态名%';

-- 5. 查看锁等待信息(MySQL 8.0)
select * from performance_schema.data_locks;
select * from performance_schema.data_lock_waits;

-- 6. 查看事务信息
select * from information_schema.innodb_trx;

三、高频故障场景专项排查与解决方案

场景 1:MySQL 服务启动失败(最常见)

子场景 1.1 配置文件错误导致启动失败

子场景 1.2 文件权限 / 所属权错误

子场景 1.3 端口被占用

子场景 1.4 磁盘空间 / Inode 耗尽

子场景 1.5 内存不足 / OOM 导致启动失败

子场景 1.6 InnoDB 数据文件损坏

子场景 1.7 systemd 服务文件配置错误

场景 2:MySQL 连接异常(服务正常,无法登录)

子场景 2.1 本地 Socket 连接失败

子场景 2.2 远程连接失败

子场景 2.3 连接数爆满报错 Too many connections

子场景 2.4 密码正确但登录报错 Access denied

场景 3:MySQL 运行卡顿 / 性能异常

子场景 3.1 CPU 使用率飙升

子场景 3.2 磁盘 IO 负载过高

子场景 3.3 死锁与锁等待超时

场景 4:主从同步异常

四、MySQL 全维度性能优化

优化核心原则:先优化业务 SQL 与索引,再优化配置参数,最后优化系统与架构,80% 的性能问题都可通过 SQL 与索引优化解决。

一、SQL 与索引优化(优先级最高)

1. 慢查询日志开启与分析

慢查询是性能问题的核心来源,生产环境必须开启,用于定位耗时 SQL。

# /etc/my.cnf 慢查询配置
slow_query_log = ON
# 日志路径,确保mysql用户有写入权限
slow_query_log_file = /usr/local/mysql/data/slow.log
# 慢查询阈值,单位秒,超过1秒的SQL记录,生产环境可设为0.5
long_query_time = 1
# 记录未使用索引的SQL
log_queries_not_using_indexes = ON
# 限制每分钟未使用索引的SQL记录次数,避免日志暴涨
log_throttle_queries_not_using_indexes = 10

慢日志分析工具

# 1. 自带mysqldumpslow,按执行时间排序,取TOP10慢SQL
mysqldumpslow -s t -t 10 /usr/local/mysql/data/slow.log
# 2. 进阶工具pt-query-digest(percona-toolkit),生成详细分析报告
pt-query-digest /usr/local/mysql/data/slow.log > slow_report.log

2. 执行计划 explain 分析

通过 explain 分析 SQL 执行计划,定位索引失效、全表扫描等问题,核心用法:

explain select * from 表名 where 条件;

核心字段关注重点

表格

字段优化要点
type访问类型,最优到最差:system > const > eq_ref > ref > range > index > ALL,必须避免 ALL(全表扫描)
key实际使用的索引,为 NULL 表示未使用索引,需优化
rows扫描的行数,数值越小越好,代表索引效率越高
Extra避免出现Using filesort(文件排序)、Using temporary(临时表)、Using where无索引匹配

3. 索引优化最佳实践

4. SQL 编写优化规范

二、MySQL 配置参数优化(/etc/my.cnf)

以下为适配 /usr/local/mysql 安装路径、OpenEuler 系统的优化配置,按服务器内存调整核心参数。

1. 基础路径与通用配置

[mysqld]
# 核心路径配置(必须与你的安装路径一致)
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = /usr/local/mysql/data/mysqld.pid
port = 3306
user = mysql
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
lower_case_table_names = 1 # 表名大小写不敏感,OpenEuler系统建议开启
default-time_zone = '+8:00'
# 禁用DNS反向解析,提升连接速度
skip-name-resolve

2. 核心内存优化配置

内存优化核心原则:专用数据库服务器,MySQL 总内存占用不超过系统物理内存的 70%,避免 OOM。

表格

参数优化建议
innodb_buffer_pool_size最核心参数,InnoDB 数据和索引缓存,专用服务器设为物理内存的 50%-70%。例:8G 内存设 4G,16G 设 10G,32G 设 20G
innodb_buffer_pool_instances缓冲池实例数,缓冲池大于 8G 时设为 4-8 个,每个实例至少 1G,减少锁竞争
innodb_log_buffer_sizeredo log 缓冲区,高并发写入场景设为 64M-128M,最大不超过 1G,避免频繁刷磁盘
sort_buffer_size每个会话排序缓冲区,默认 256K,建议不超过 4M,排序多的场景设 1M-2M
join_buffer_size每个会话 join 缓冲区,默认 256K,建议不超过 4M,避免大表 join 内存溢出
read_buffer_size顺序读缓冲区,默认 128K,顺序扫描多的场景设 256K-1M
read_rnd_buffer_size随机读缓冲区,默认 256K,排序多的场景设 512K-1M

3. InnoDB 引擎核心优化

# IO刷新方式,绕过操作系统缓存,直接写入磁盘,SSD场景必选,减少双缓存和swap占用
innodb_flush_method = O_DIRECT
# 事务刷盘策略,见前文IO优化,根据业务场景选择
innodb_flush_log_at_trx_commit = 1
# binlog刷盘策略,与上面参数配合,双1配置最高安全性
sync_binlog = 1
# 每个表独立表空间,必须开启,方便表维护、空间回收,避免ibdata1无限膨胀
innodb_file_per_table = ON
# IO线程数,多核CPU建议设为8-16,提升IO并发能力
innodb_read_io_threads = 16
innodb_write_io_threads = 16
# 脏页最大比例,避免脏页集中刷盘导致IO抖动
innodb_max_dirty_pages_pct = 60
# 行锁等待超时时间,单位秒,业务场景建议5-10秒
innodb_lock_wait_timeout = 10
# 事务隔离级别,互联网业务推荐READ-COMMITTED,减少锁等待,提升并发
transaction_isolation = READ-COMMITTED
# 关闭邻页刷新,SSD场景必关,HDD场景开启
innodb_flush_neighbors = 0
# IO容量设置,根据SSD性能调整,普通SSD设2000,NVMe SSD设4000-8000
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

4. 连接与日志优化

# 最大连接数,根据业务场景设置,建议1000-2000,避免设置过大
max_connections = 2000
# 连接超时时间,自动关闭空闲连接,单位秒
wait_timeout = 600
interactive_timeout = 600
# 最大错误连接数,避免频繁错误连接导致IP封禁
max_connect_errors = 1000
# binlog配置(主从同步、数据恢复必开)
server-id = 1 # 集群内必须唯一
log_bin = /usr/local/mysql/data/mysql-bin
binlog_format = ROW # 行级模式,推荐,主从同步更安全
binlog_row_image = FULL
# binlog自动过期时间,7天,避免磁盘占满(MySQL8.0推荐用秒级配置)
binlog_expire_logs_seconds = 604800
# MySQL5.7用天级配置
# expire_logs_days = 7
# 错误日志配置,排查故障核心,必须开启
log_error = /usr/local/mysql/data/mysql-error.log
log_error_verbosity = 3

三、OpenEuler 系统级内核优化

OpenEuler 针对服务器场景深度优化,通过内核参数调整可大幅提升 MySQL 性能,适配 x86 / 鲲鹏 ARM 架构。

1. 内核参数优化(/etc/sysctl.conf)

编辑/etc/sysctl.conf,添加以下配置,执行sysctl -p立即生效。

# 内存优化
# 尽量不使用swap,数据库专用服务器设为1,避免swap导致性能暴跌
vm.swappiness = 1
# 脏页达到20%时,后台开始异步刷盘
vm.dirty_ratio = 20
# 脏页达到10%时,后台启动刷盘
vm.dirty_background_ratio = 10
# 严格控制内存分配,避免OOM
vm.overcommit_memory = 2
# 允许分配的内存不超过物理内存的80%+swap
vm.overcommit_ratio = 80
# IO优化
# 最大异步IO数量,适配InnoDB
fs.aio-max-nr = 1048576
# 系统级最大文件句柄数
fs.file-max = 2097152
# 网络优化,高并发连接场景
# 监听队列最大长度,默认128,高并发必须调大
net.core.somaxconn = 65535
# SYN队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535
# TIME_WAIT超时时间,默认60,调小减少端口占用
net.ipv4.tcp_fin_timeout = 30
# 允许TIME_WAIT端口复用,高并发必须开启
net.ipv4.tcp_tw_reuse = 1
# 最大TIME_WAIT数量
net.ipv4.tcp_max_tw_buckets = 200000
# 网络设备接收队列最大长度
net.core.netdev_max_backlog = 30000
# 端口范围,扩大可用端口数
net.ipv4.ip_local_port_range = 1024 65535
# 读写缓冲区最大值
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
# 鲲鹏ARM架构专属优化(x86可忽略)
kernel.sched_steal_node_limit=4

2. 文件句柄限制优化

MySQL 需要大量文件句柄,默认 1024 远远不足,编辑/etc/security/limits.conf,添加以下配置,重启服务器生效。

mysql  soft  nofile  65535
mysql  hard  nofile  1048576
mysql  soft  nproc   65535
mysql  hard  nproc   1048576
root   soft  nofile  1048576
root   hard  nofile  1048576

生效后执行ulimit -n,确认输出为 65535 及以上。

3. IO 调度器优化

# 查看当前调度器(sda为你的磁盘名,根据实际修改)
cat /sys/block/sda/queue/scheduler
# 临时修改
echo none > /sys/block/sda/queue/scheduler
# 永久生效:编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中添加elevator=none,更新grub后重启生效

4. CPU 性能优化

关闭 CPU 节能模式,设置为性能模式,避免 CPU 降频导致性能波动。

# 临时设置为性能模式
cpupower frequency-set -g performance
# 永久生效:在BIOS中关闭CPU节能模式,或配置systemd服务开机执行

四、架构级长期优化

  1. 读写分离:主库负责写入,从库负责读取,分担读压力,适配读多写少的业务场景
  2. 分库分表:单表数据量超过 1000 万、单库容量超过 100G 时,实施水平 / 垂直分库分表,降低单表负载
  3. 缓存架构:搭配 Redis 缓存热点数据、高频查询结果,减少 MySQL 数据库访问压力
  4. 高可用架构:部署 MGR(MySQL Group Replication)、Keepalived + 双主架构,避免单点故障,提升服务可用性
  5. 冷热数据分离:历史冷数据归档到单独的库 / 表,热数据保留在主库,大幅提升查询性能

五、日常运维与故障预防

重要注意事项

  1. 所有配置修改、参数优化,必须先在测试环境验证,再上线生产环境,避免配置错误导致服务不可用
  2. 优化参数循序渐进,每次仅修改 1-2 个核心参数,观察性能变化,避免一次性修改大量参数导致无法定位问题
  3. 生产环境任何数据修改、表结构变更、服务重启,必须先备份,制定回滚方案,避免数据丢失
  4. 生产环境禁止开启通用查询日志 general_log,会严重影响数据库性能,仅临时排查问题时使用
  5. 注意 MySQL 版本与 OpenEuler 系统的兼容性,鲲鹏 ARM 架构必须使用对应 ARM 版本的 MySQL 安装包,避免兼容性问题

到此这篇关于OpenEuler系统MySQL故障排查终极指南实战教程的文章就介绍到这了,更多相关OpenEuler MySQL故障排查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文