Ubuntu 22.04 LEMP环境下MariaDB两种登录命令`sudo mysql`与`sudo mysql -u root -p`的差异及数据库列表显示不一致问题
sudo mysql与sudo mysql -u root -p的差异及数据库列表显示不一致问题 嘿,这个问题我之前也碰到过,核心原因其实是两种登录方式用的认证机制不一样,导致你在MariaDB里的身份权限出现了差异,所以看到的数据库列表不同。我给你一步步拆解和解决:
先搞懂两种登录方式的区别
sudo mysql:这是用Unix Socket认证登录的——简单说就是操作系统的root用户直接和MariaDB做身份绑定,不需要输入密码,靠操作系统的权限直接登录MariaDB的root@localhost账号。sudo mysql -u root -p:这是强制用密码认证登录,你得输入在mysql_secure_installation里设置的root密码,登录的也是root@localhost,但触发的是密码验证逻辑。
为什么数据库列表不一样?
本质是这两种登录方式对应的MariaDB用户权限可能有差异(虽然都是root,但认证方式不同,可能权限被误配置了)。SHOW DATABASES命令只会显示当前用户有权限访问的数据库,所以如果其中一个root身份的权限不全,就会看不到部分数据库。
排查和解决步骤
1. 确认两个登录身份的详细信息
分别在两种登录状态下执行这条SQL,查看用户的认证方式:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
你会发现:
sudo mysql对应的plugin字段是unix_socketsudo mysql -u root -p对应的plugin是mysql_native_password或者caching_sha2_password
2. 对比两个身份的权限
同样在两种登录状态下执行:
SHOW GRANTS;
对比输出的权限列表,如果sudo mysql登录的root缺少ALL PRIVILEGES或者SHOW DATABASES权限,那就是问题所在。
3. 修复权限(关键步骤)
切换到能看到所有数据库的登录方式(也就是sudo mysql -u root -p),执行下面的SQL,给root@localhost赋予完整权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
这条命令会把所有数据库和表的权限都给root@localhost,不管用哪种认证方式登录,权限都会统一。
4. 额外排查:是否存在多个root用户
有时候可能不小心创建了root@127.0.0.1这类不同host的root用户,执行这条SQL看看所有用户:
SELECT user, host FROM mysql.user;
如果有其他root用户,也可以给他们赋予相同的完整权限,避免后续出现类似问题。
5. 极端情况:配置文件差异
如果上面的步骤都没用,那可能是sudo的环境变量导致加载了不同的MariaDB配置文件。可以在两种登录状态下执行:
SHOW VARIABLES LIKE 'datadir';
如果输出的数据目录不一样,说明连接到了不同的MariaDB实例,这时候需要检查sudo的环境变量或者MariaDB的配置文件路径(比如/etc/mysql/my.cnf、/etc/mysql/mariadb.conf.d/下的文件)。
验证修复效果
执行完权限赋予后,再分别用两种方式登录MariaDB,执行SHOW DATABASES;,应该就能看到完整的数据库列表了。
备注:内容来源于stack exchange,提问作者DanRan

