Debian MariaDB故障排查技巧
一 快速定位与日志获取
- 查看服务状态与最近错误:
- 执行:systemctl status mariadb,关注 Active、Main PID、ExecStartPost 等行。
- 执行:journalctl -u mariadb -xe,按时间定位首次报错位置。
- 定位 MariaDB 错误日志:
- 常见路径:/var/log/mariadb/error.log 或 /var/log/mysql/error.log。
- 若自定义了配置,可在 /etc/my.cnf 或 /etc/mysql/my.cnf 的 [mysqld] 段查看 log_error 项。
- 日志快速筛选:
- 查看尾部:tail -n 50 /var/log/mariadb/error.log
- 关键词:grep -i “failed|error|access denied” /var/log/mariadb/error.log
- 时间段:journalctl -u mariadb --since “2025-12-19 10:00:00” --until “2025-12-19 12:00:00”。
二 常见故障与修复
-
无法启动且提示 “ExecStartPost=/etc/mysql/debian-start … code=exited, status=2/203”
- 现象:安装或升级后 debian-start 脚本缺失或被误删,导致启动脚本退出异常。
- 修复:
- 检查是否存在 /etc/mysql/debian-start 或 /etc/mysql/debian-start.dpkg-dist,若存在后者可重命名为前者。
- 若均不存在,从对应版本的 mariadb-server-*.deb 包中提取:
- 下载:apt download mariadb-server-<版本>
- 解压:dpkg-deb --extract mariadb-server-<版本>.deb /tmp/mariadb
- 复制:cp /tmp/mariadb/etc/mysql/debian-start /etc/mysql/
- 重启:systemctl start mariadb。
-
dpkg 配置失败:update-alternatives: alternative path /etc/mysql/mariadb.cnf doesn’t exist
- 现象:安装 mariadb-common 时因缺失配置文件导致 dpkg 中断。
- 修复:
- 建立占位文件:sudo mkdir -p /etc/mysql && sudo touch /etc/mysql/mariadb.cnf
- 继续配置:sudo dpkg --configure -a
- 必要时修复依赖:sudo apt-get install -f
- 仍异常时可选清理重装相关包。
-
目录缺失导致启动失败(如 /var/log/mariadb 不存在)
- 现象:日志目录缺失或权限不当,服务启动自检失败。
- 修复:
- 创建目录并设权:sudo mkdir -p /var/log/mariadb && sudo chown mysql:mysql /var/log/mariadb
- 重启:systemctl restart mariadb。
-
InnoDB 日志损坏或异常导致无法启动
- 现象:错误日志含 InnoDB: Corrupted file-level record / Plugin ‘InnoDB’ init function returned error。
- 修复(只读导出优先):
- 编辑配置 /etc/mysql/mariadb.conf.d/50-server.cnf(或 /etc/my.cnf.d/server.cnf),在 [mysdb] 加入:
- innodb_force_recovery=1(从 1 开始逐步尝试,最高到 6;达到可启动即停)
- 重启后立刻逻辑备份:mysqldump -A --single-transaction --routines --triggers --hex-blob > backup.sql
- 备份完成,移除 innodb_force_recovery 并正常重启;如仍失败,用备份重建实例。
-
套接字连接失败 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket
- 现象:服务未运行或 socket 路径不一致。
- 排查:
- 确认运行状态:systemctl is-active mariadb
- 查看 /etc/mysql/my.cnf 中 [mysqld] socket 与客户端 [client] socket 是否一致
- 检查目录与权限:ls -ld /var/run/mysqld && sudo systemctl restart mariadb
- 临时直连测试:mysql -u root -p -h 127.0.0.1 --protocol=tcp(绕开 socket)。
三 安全加固与远程访问
- 首次加固:
- 执行:sudo mysql_secure_installation,设置 root 密码、移除匿名用户、禁止远程 root 登录、删除测试库。
- 启用远程访问(按需):
- 编辑:sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
- 设置:bind-address = 0.0.0.0(或指定内网网段)
- 重启:sudo systemctl restart mariadb
- 授权示例(仅示例,生产环境请使用强密码与最小权限):
- GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ IDENTIFIED BY ‘YourStrongPassword’ WITH GRANT OPTION;
- FLUSH PRIVILEGES;
四 主从复制场景的排查要点
- 提升从库为主库:
- 选择复制最接近主的从库(比较 Exec_Master_Log_Pos 或 relay-log.info 位置)。
- 在候选从库启用二进制日志:server-id=唯一值;log-bin,重启。
- 其他从库执行:STOP SLAVE; RESET SLAVE ALL; 后 CHANGE MASTER TO … 指向新主,最后 START SLAVE; 检查 Slave_IO_Running/Slave_SQL_Running=YES。
- 复制中断跳过错误(谨慎):
- 临时跳过单个事件:STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
- 批量跳过特定错误码:在配置加入 slave_skip_errors=1007(静态变量,需重启)。
五 最小化排查清单
- 服务状态:systemctl status mariadb;实时日志:journalctl -u mariadb -f
- 错误日志:/var/log/mariadb/error.log 或 /var/log/mysql/error.log
- 配置核对:/etc/mysql/my.cnf、/etc/mysql/mariadb.conf.d/*.cnf 的 datadir、socket、log_error、bind-address
- 目录与权限:/var/lib/mysql(属主 mysql:mysql)、/var/run/mysqld、/var/log/mariadb
- 套接字与端口:本地用 mysql -h 127.0.0.1 --protocol=tcp 测试;远程用 telnet 主机 3306
- 强制恢复:仅在备份优先前提下用 innodb_force_recovery=1→6 逐级尝试并尽快导出数据
注意:涉及数据删除、强制恢复与权限变更的操作存在数据丢失与安全风险,务必先做好完整备份,并在非生产环境验证后再实施。