Ubuntu系统中,MariaDB的权限问题主要涉及数据目录权限、用户权限配置、认证插件兼容等方面,以下是具体解决步骤:
MariaDB的正常运行依赖正确的文件系统权限。默认情况下,数据目录(/var/lib/mysql) 和 配置文件目录(/etc/mysql) 必须属于mysql用户和组,否则会导致服务启动失败或无法访问。
sudo chown -R mysql:mysql /var/lib/mysql # 将数据目录所有者设为mysql用户/组
sudo chmod -R 755 /var/lib/mysql # 设置目录权限为755(所有者可读写执行,其他用户可读执行)
sudo chown -R root:root /etc/mysql # 配置文件所有者应为root
sudo chmod -R 755 /etc/mysql # 配置文件权限设为755
完成修改后,重启MariaDB服务使变更生效:
sudo systemctl restart mariadb
权限问题的核心是用户权限配置不当,需通过以下命令规范操作:
sudo mysql -u root -p
localhost表示本地连接,%表示允许远程连接)和密码:CREATE USER 'username'@'localhost' IDENTIFIED BY 'strong_password';
ALL PRIVILEGES,建议按最小权限原则):
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
%主机):GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'localhost';
FLUSH PRIVILEGES;
REVOKE命令(需指定精确的权限和对象):REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'localhost';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'username'@'localhost';
DROP USER 'username'@'localhost';
新版本MariaDB(如10.4+)默认使用unix_socket认证插件,仅允许本地系统用户通过socket连接,若需用密码登录,需修改认证方式:
sudo systemctl stop mariadb
sudo mysqld_safe --skip-grant-tables &
USE mysql;
UPDATE mysql.user SET plugin='mysql_native_password', authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
sudo systemctl restart mariadb
此时,可使用新密码通过密码认证登录:
mysql -u root -p
若需从远程主机连接MariaDB,需完成以下步骤:
/etc/mysql/mariadb.conf.d/50-server.cnf,注释bind-address行(允许所有IP连接):sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
找到bind-address = 127.0.0.1,改为#bind-address = 127.0.0.1,保存退出。sudo systemctl restart mariadb
192.168.1.%网段访问mydatabase数据库):CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'remote_password';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'remote_user'@'192.168.1.%';
FLUSH PRIVILEGES;
sudo ufw allow 3306/tcp
sudo tail -n 50 /var/log/mysql/error.log
sudo setsebool -P mysql_connect_any 1
sudo chcon -Rv --type=httpd_sys_rw_content_t /var/lib/mysql
通过以上步骤,可覆盖Ubuntu MariaDB常见的权限问题。操作前请备份重要数据,避免误操作导致数据丢失。