温馨提示×

Linux MariaDB故障排查方法有哪些

小樊
44
2025-12-12 11:22:09
栏目: 云计算

Linux MariaDB故障排查方法

一 快速定位与通用流程

  • 使用系统服务日志定位启动失败原因:执行systemctl status mariadb.servicejournalctl -xe,优先关注“Failed/Error/Permission denied/Cannot assign requested address”等关键词。
  • 查看MariaDB应用日志:默认路径常为**/var/log/mariadb/mariadb.log**,使用tail -n 30 /var/log/mariadb/mariadb.logtail -fn 30实时跟踪。
  • 核对配置文件加载顺序与位置:MariaDB会按内置路径读取多个my.cnf,注意是否存在多份配置冲突;必要时用strace /usr/local/mysql/bin/mysqld 2>&1 | tee 1.log观察配置加载过程。
  • 手工前台启动验证:直接运行mysqld前台输出,能更快暴露语法/权限/目录等错误。
  • 依赖与库检查:用ldd /usr/local/mysql/bin/mysqld确认动态库(如libaio.so.1、libnuma.so.1)是否缺失;若缺失安装对应包(如libaio、numactl)。
  • 环境与资源巡检:确认磁盘空间 df -hinode内存ulimit -nSELinux/防火墙状态。
  • 错误码辅助:用**perror <错误码>**快速解释常见错误含义。

二 常见故障场景与处理要点

  • 服务无法启动(Job failed)

    • 日志目录不存在或无写权限:创建**/var/log/mariadb/并授权mysql:mysql**,如chown -R mysql.mysql /var/log/mariadb
    • 数据目录未初始化或权限错误:确保datadir为空后执行初始化(如mysql_install_db --user=mysql --datadir=/var/lib/mysql),并修正权限chown -R mysql:mysql /var/lib/mysql
    • PID/运行目录不可写:创建**/var/run/mariadb/并授权mysql:mysql**。
    • 端口被占用或重复实例:用ss -lntp | grep 3306ps aux | grep mysqld定位并停止占用进程。
    • 配置错误/多配置文件冲突:统一配置路径与内容,避免重复包含。
    • 依赖库缺失:安装libaio、numactl等缺失库。
    • 磁盘满/InnoDB无法加锁:清理或扩容分区,检查df -hInnoDB: Unable to lock ./ibdata1类报错。
  • 本地连接失败 ERROR 2002 (HY000)

    • 服务未启动:先systemctl start mariadb
    • Socket路径不一致:在客户端显式指定mysql --socket=/var/lib/mysql/mysql.sock;必要时创建软链ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock;用ps -ef | grep mysqlmy.cnf核对socket配置。
  • 远程连接失败 Communications link failure

    • 数据库未启动或端口不通:确认systemctl status mariadbss -lntp | grep 3306,云环境检查安全组/防火墙
    • JDBC/驱动参数:在连接串中显式设置useSSL=false/trueserverTimezone、合理的connectTimeout;高版本驱动建议启用SSL并正确配置证书。
  • 表损坏或异常关机后的恢复

    • MyISAM表损坏:用myisamchk -c -r /var/lib/mysql/mysql/proc.MYI修复索引后重启。
    • 存在未完成事务:启动时使用**–tc-heuristic-recover=ROLLBACK**提交或回滚悬挂事务。
    • Galera集群异常:清理**/var/lib/mysql/grastate.dat或临时将wsrep_cluster_address=“gcomm://”**清空后单机启动,再恢复集群配置。

三 性能与高CPU问题排查

  • 识别负载类型:
    • QPS高且无明显慢SQL:曲线与CPU高度吻合,优化余地小,优先考虑扩容、读写分离、缓存(如Redis/Memcached)、历史数据归档与分库分表。
    • 慢SQL导致:QPS不高但扫描行数大,优化空间大。
  • 定位问题SQL:
    • 实时会话:show processlist / show full processlist,关注状态为Sending data、Copying to tmp table、Sorting result、Using filesort的长时查询;必要时kill [ID]
    • 执行计划:对可疑SQL执行EXPLAIN,检查是否走索引、扫描行数、是否使用临时表/文件排序。
  • 慢查询日志分析:
    • 启用slow_query_log=1、设置long_query_time(如5秒)、log_output=TABLE,FILE,用mysqldumpslow -t 5 -s at /var/log/mysql/slow-query.log汇总分析。
  • 优化手段:添加/改写索引、改写SQL避免全表扫描与文件排序、优化JOIN与子查询、合理设置innodb_buffer_pool_size等内存参数。

四 高频检查清单与命令速查

检查项 关键命令或路径 处理要点
服务状态 systemctl status mariadb.service;journalctl -xe 先看状态与报错摘要,再进入详细日志
应用日志 tail -fn 30 /var/log/mariadb/mariadb.log 关注首次报错行与时间线
端口占用 ss -lntp grep 3306;必要时 kill 旧进程
配置文件 my.cnf;strace mysqld … 避免多份配置冲突;用 strace 跟踪加载
数据目录 ls -ld /var/lib/mysql;chown -R mysql:mysql 权限与属主正确;初始化前确保为空
日志目录 mkdir -p /var/log/mariadb;chown mysql:mysql 目录缺失或不可写会启动失败
运行目录 mkdir -p /var/run/mariadb;chown mysql:mysql PID/套接字写入失败常见原因
依赖库 ldd /usr/local/mysql/bin/mysqld 缺 libaio/numactl 等需补齐
磁盘空间 df -h;du -sh /var/lib/mysql 空间满会导致 InnoDB 加锁/启动失败
本地连接 mysql --socket=…;ps -ef 核对 socket 路径与进程
远程连接 ss -lntp grep 3306;检查云安全组/防火墙
表修复 myisamchk -c -r … MyISAM 索引损坏时修复
异常关机 mysqld --tc-heuristic-recover=ROLLBACK 处理悬挂事务后再正常启动

0