Ubuntu MariaDB常见问题及解决
小樊
36
2025-12-30 08:38:04
Ubuntu MariaDB常见问题与排查清单
一 服务无法启动
- 快速定位
- 查看服务状态与日志:sudo systemctl status mariadb;sudo tail -n 50 /var/log/mysql/error.log。
- 校验配置语法:sudo mysqld --validate-config(MariaDB 10.4+ 可用)。
- 检查端口占用:ss -lntp | grep 3306;检查磁盘空间:df -h;检查数据/日志目录权限:ls -ld /var/lib/mysql /var/log/mysql。
- 常见修复
- 配置错误:修正 /etc/mysql/mariadb.conf.d/50-server.cnf 的语法或路径错误后重启。
- 权限问题:sudo chown -R mysql:mysql /var/lib/mysql /var/log/mysql。
- 端口冲突:结束占用进程或修改 my.cnf 的 port。
- 资源不足:清理磁盘或扩容;必要时降低内存相关参数后再启动。
二 无法远程连接
- 三步排查
- 服务与端口:sudo systemctl start mariadb;ss -lntp | grep 3306 确认监听。
- 防火墙:Ubuntu 执行 sudo ufw allow 3306/tcp;firewalld 执行 firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload。
- 监听地址:编辑 /etc/mysql/mariadb.conf.d/50-server.cnf,将 bind-address 改为 0.0.0.0(或注释掉该行),重启服务。
- 账号与权限
- 创建并授权远程用户:CREATE USER ‘app’@‘%’ IDENTIFIED BY ‘StrongPass!’; GRANT ALL PRIVILEGES ON db.* TO ‘app’@‘%’; FLUSH PRIVILEGES;(生产环境建议将 % 限制为指定网段)。
- 客户端测试:mysql -h 服务器IP -P 3306 -u app -p。
- 常见错误
- ERROR 2003 (HY000):服务未启动或网络/防火墙阻断。
- ERROR 1698 (28000):root 本地认证方式导致,使用 sudo mysql_secure_installation 或 ALTER USER 设置密码并刷新权限。
三 身份验证与登录问题
- root 免密或 Access denied
- 运行安全脚本:sudo mysql_secure_installation(设置 root 密码、移除匿名用户、禁止 root 远程登录、删除测试库)。
- 重置 root 密码(Ubuntu 22.04 常见):sudo systemctl stop mariadb;sudo mysqld_safe --skip-grant-tables &;mysql -u root;执行 FLUSH PRIVILEGES; ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘NewPass!’; 退出并重启服务。
- 插件或主机限制
- 兼容旧客户端:ALTER USER ‘user’@‘host’ IDENTIFIED WITH mysql_native_password BY ‘password’; FLUSH PRIVILEGES;
- 检查用户主机:SELECT user,host FROM mysql.user; 必要时创建 ‘user’@‘%’ 或限定网段。
四 性能与磁盘空间问题
- 性能优化
- 启用慢查询日志:在 my.cnf 的 [mysqld] 下添加 slow_query_log=1、long_query_time=2、slow_query_log_file=/var/log/mysql/slow.log;重启后用 EXPLAIN 分析查询。
- 索引与语句:为高频条件列建索引;避免 SELECT *;用 JOIN 替代复杂子查询;必要时添加 LIMIT。
- 内存参数:将 innodb_buffer_pool_size 设为物理内存的 50%–70%(如 2G);适当增大 tmp_table_size(如 256M)。
- 磁盘与日志
- 清理二进制日志:PURGE BINARY LOGS BEFORE ‘2025-10-01’; 或设置 expire_logs_days=7 自动过期。
- 大表空间回收:OPTIMIZE TABLE 表名;或导出-删除-导入重建表。
- 持续不足时扩容磁盘或迁移数据目录。
五 数据损坏与字符集乱码
- 表损坏处理
- 检查表:CHECK TABLE 表名;
- MyISAM:REPAIR TABLE 表名; 或用 myisamchk -r /var/lib/mysql/db/table.MYI;
- InnoDB:在 my.cnf 添加 innodb_force_recover=3(1–6 逐步增大),启动后尽快导出数据并重建表;重要数据优先从备份恢复。
- 字符集统一
- 服务端配置(my.cnf):[mysqld] character-set-server=utf8mb4;collation-server=utf8mb4_unicode_ci;[client] default-character-set=utf8mb4;[mysql] default-character-set=utf8mb4;重启服务。
- 表/字段转换:ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 导入指定字符集:mysql -u root -p --default-character-set=utf8mb4 db < data.sql。