Ubuntu MariaDB常见问题及解决方案汇总
sudo systemctl status mariadb查看服务运行状态,若未启动会显示错误信息。sudo tail -n 50 /var/log/mysql/error.log获取详细错误原因(如配置文件语法错误、权限问题等)。/var/lib/mysql)属于mysql用户和组,执行sudo chown -R mysql:mysql /var/lib/mysql;并设置正确权限sudo chmod -R 755 /var/lib/mysql。/etc/mysql/mariadb.conf.d/*.cnf配置文件(如50-server.cnf),确认无语法错误(如错误的bind-address、socket路径),修改后重启服务sudo systemctl restart mariadb。df -h查看磁盘空间,若空间不足,清理/tmp、/var/log等目录或扩容磁盘。sudo aa-disable /etc/apparmor.d/usr.sbin.mysqld,然后重启服务。sudo systemctl status mariadb),未启动则执行sudo systemctl start mariadb。sudo ufw allow 3306/tcp。mysql -u root -p),检查用户的主机限制(SELECT user, host FROM mysql.user;)。若用户仅允许localhost访问,需授权远程访问:GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;(%表示允许所有主机)。/etc/mysql/mariadb.conf.d/50-server.cnf,将bind-address从127.0.0.1改为0.0.0.0(允许远程连接),保存后重启服务sudo systemctl restart mariadb。sudo systemctl stop mariadb。sudo mysqld_safe --skip-grant-tables &(跳过权限检查)。mysql -u root),执行以下命令(MariaDB 10.4及以上版本):FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
退出安全模式(exit),重启服务sudo systemctl start mariadb。/etc/mysql/mariadb.conf.d/50-server.cnf,将bind-address设置为0.0.0.0(允许所有IP访问),保存后重启服务sudo systemctl restart mariadb。sudo ufw allow 3306/tcp。CREATE USER 'username'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'username'@'%'; FLUSH PRIVILEGES;。CHARACTER SET参数,如LOAD DATA INFILE '/data/file.txt' INTO TABLE table_name CHARACTER SET 'utf8mb4';;导出时确保文件编码与数据库一致(如utf8mb4)。ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;修改数据库编码,或ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;修改表编码。/etc/mysql/mariadb.conf.d/50-server.cnf,调整关键参数:
innodb_buffer_pool_size:设置为物理内存的50%-80%(如4GB内存设为4G),用于缓存数据和索引;max_connections:根据应用需求调整(如500),避免过多连接导致资源耗尽;query_cache_size:若应用有大量重复查询,可启用(如64M),但MariaDB 10.6+已移除查询缓存,建议使用Redis替代;innodb_log_file_size:增大重做日志文件大小(如256M),减少日志切换频率,提高写入性能。CREATE INDEX idx_column ON table_name(column_name););避免过度索引(过多索引会增加写操作开销);使用复合索引(针对多列查询)。EXPLAIN分析查询计划(如EXPLAIN SELECT * FROM table_name WHERE condition;),找出性能瓶颈(如全表扫描);避免SELECT *(只选择需要的列);使用JOIN代替子查询(提高查询效率);优化分页查询(如使用LIMIT 1000, 20代替OFFSET 1000)。OPTIMIZE TABLE整理表碎片(如OPTIMIZE TABLE large_table;);定期清理慢查询日志(/var/log/mysql/slow-queries.log)和错误日志。