温馨提示×

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。

0