show databases; (errno: 13 - Permission denied) MySQL填坑记

本文详细记录了在配置本地容灾服务器过程中遇到的MySQL数据库权限错误问题,包括调整数据目录、解决Can't open the mysql.plugin table及Permission denied错误,以及如何通过禁用SELinux和修改apparmor配置来解决这些问题。

安全等保要求云服务器有堡垒机,防火墙,有漏洞感知,有安全防护,入口需要有负载,服务器需要有冗余,数据库需要主备…… 同时还要保留5年的所有日志(真叫人头大)。

一系列扫描,修复漏洞Fixed,然后告知在本地在弄一个容灾以及备份机。

嗯,以上是背景,有很多同学过来已经不耐烦了,妈蛋!老子遇见的是 show databases; (errno: 13 - Permission denied) 这个糟心的错误。

恩是的,这个BUG困扰了我一下午。那就梳理一下问题的几个关键点:

首先是起因:本地容灾服务器安装好了各种环境,MySQL数据库版本也统一为5.6,为了以后的日志保存500年,所以讲默认村主路径做了调整,由原来的/var/lib/mysql 调整到/data/mysql 下。然后就是修改mysql.cnf中[mysqld]下的datadir以及socket保存路径。然后就是一通操作 cp -rp /var/lib/mysql/*  /data/mysql   然后确认就是权限,文件夹下的用户属性,用户组属性。这些相比大家都应该踩过了。

然后启动mysql,接下来可能会遇到两个问题:

1.Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

2.启动成功,登录mysql后使用show databases;的时候 出现errno: 13 - Permission denied,同时你使用 use mysql;切换数据库竟然正常。(这时候你应该有些波澜了)。

解决:首先一遍一遍的确认配置文件,文件夹权限,启动用户,然后每次启动都会都是一样的错误(假如时间超过1小时工程师会崩溃的)

然后就是把你的错误日志一遍一遍的扔进百度,得到的答案永远都是让你确认权限,文件夹属性(不知道他们真的解决了还是抄无脑转载的),然后你开始怀念Google在的日子(怀念一下被GFW封杀的ssh Proxy网站和那上万的会员。)

在无奈之后还是转向了Google,终于找到几点痕迹。

万恶的SELinux和同样坑爹的apparmor

关闭SELinux  使用 setenforce 0  然后永久关闭,修改/etc/selinux/config文件中设置SELINUX=disabled 重启。

如果是 apparmor 修改/etc/apparmor.d/usr.sbin.mysqld文件里面新增:

#这里面写新的datadir目录,写2行,一行r,一行rwk。
/data/mysql/ r,
/data/mysql/** rwk,

然后重启,填完回家。

<think> 我们正在讨论的是MySQL中`SHOW DATABASES;`命令的结果问题。 根据引用[1]中的示例,当执行`SHOW DATABASES;`时,通常会返回一个数据库列表。如果这个命令没有返回任何结果(即没有显示任何数据库),那么这通常意味着当前MySQL服务器上没有用户有权限访问的数据库(除了系统数据库之外)或者确实没有任何数据库存在。 但是,需要注意的是,`SHOW DATABASES;`命令显示的是当前用户有权限查看的数据库。因此,如果当前用户权限受限,即使存在其他数据库,也不会显示出来。 另外,MySQL在安装后通常会创建一些系统数据库(如`information_schema`, `mysql`, `performance_schema`, `sys`)。如果这些系统数据库都没有显示,那么可能是因为当前用户没有权限查看它们。 所以,总结如下: 1. 如果执行`SHOW DATABASES;`后没有返回任何结果,可能的原因有: a) MySQL服务器上确实没有创建任何数据库(包括系统数据库可能被误删,但这种情况极少见)。 b) 当前连接的用户没有查看任何数据库的权限(包括系统数据库的权限)。 2. 为了确认是哪种情况,我们可以尝试使用具有更高权限的用户(如root用户)连接,然后再次执行`SHOW DATABASES;`。 3. 如果使用root用户也没有显示任何数据库,那么可能是MySQL服务器上确实没有数据库(但通常至少会有系统数据库),这种情况可能需要检查MySQL的安装是否完整。 4. 如果使用root用户可以显示数据库,而普通用户不能,那么就是权限问题。 因此,无结果并不一定表示没有数据库,也可能是权限不足。 为了进一步诊断,我们可以检查当前用户权限: - 使用命令:`SHOW GRANTS;` 来查看当前用户的权限。 操作步骤示例: ``` mysql> SHOW GRANTS; +---------------------------------------------------+ | Grants for user@localhost | +---------------------------------------------------+ | GRANT USAGE ON *.* TO 'user'@'localhost' | | GRANT SELECT ON `testdb`.* TO 'user'@'localhost' | +---------------------------------------------------+ ``` 如果权限中不包括对数据库的`SHOW DATABASES`权限(或者没有全局的`SHOW DATABASES`权限),那么可能无法看到数据库列表。 另外,MySQL有一个系统变量`show_database_priv`,但更直接的是检查用户是否有`SHOW DATABASES`的权限。在MySQL中,`SHOW DATABASES`权限是全局权限,只有具有该权限的用户才能查看所有数据库(除了自己有权限的数据库外,系统数据库通常对大部分用户可见,但如果没有全局权限,则只能看到自己有权限的数据库)。 注意:在MySQL中,默认情况下,普通用户可能只能看到他们有权限的数据库(即使用`SHOW DATABASES`只显示他们能访问的数据库)。但是,如果用户没有任何数据库的权限,那么`SHOW DATABASES`将不会显示任何结果。 所以,结论是:输入`SHOW DATABASES`后无结果,可能是确实没有数据库(但系统数据库通常存在,所以这种情况少见),但更可能是当前用户没有查看数据库的权限。 建议的解决方案: 1. 使用root用户登录,检查数据库是否存在。 2. 如果数据库存在,那么需要给当前用户授予相应的权限。例如: ```sql GRANT SHOW DATABASES ON *.* TO 'your_user'@'host'; ``` 或者更具体的数据库权限,如: ```sql GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'host'; ``` 然后刷新权限: ```sql FLUSH PRIVILEGES; ``` 注意:授权命令需要根据实际情况调整。 引用说明:上面的引用[1]展示了`SHOW DATABASES`正常返回多个数据库的情况,包括系统数据库和用户数据库。因此,如果无返回,与引用所示情况不符,说明有异常。 </think>在MySQL中输入`SHOW DATABASES;`后无结果显示,**通常表示当前用户没有访问任何数据库的权限**,而不是表示服务器上没有数据库存在。以下是详细分析: ### 原因解析 1. **权限问题(最常见)** 当前登录用户可能没有被授予查看数据库的权限。即使服务器存在数据库(如系统库),无权限用户执行`SHOW DATABASES;`也会返回空结果[^1]。 2. **特殊权限配置** 若MySQL配置中设置了 `--skip-show-database` 启动参数,普通用户将无法查看数据库列表(仅`SHOW DATABASES`权限的用户可见)。 3. **空数据库服务器(罕见)** 极端情况下,全新安装的MySQL服务器未被初始化,或所有数据库被手动删除,但此情况极少见(系统默认会创建 `information_schema` 等系统库)。 ### 诊断步骤 ```sql -- 检查当前用户权限 SHOW GRANTS FOR CURRENT_USER(); -- 尝试查看系统库(需要权限) USE information_schema; SHOW TABLES; ``` 若返回 `ERROR 1044 (42000): Access denied`,说明权限不足。 ### 解决方案 1. **使用管理员账户检查数据库** 用root用户登录验证是否存在数据库: ```bash mysql -u root -p ``` ```sql SHOW DATABASES; -- 查看所有数据库 SELECT user, host FROM mysql.user; -- 检查用户列表 ``` 2. **授予用户权限** 管理员执行: ```sql -- 授予全局权限 GRANT SHOW DATABASES ON *.* TO '用户名'@'主机'; FLUSH PRIVILEGES; ``` 3. **检查启动参数** 查看MySQL配置(如 `/etc/mysql/my.cnf`): ```ini [mysqld] # 确保未包含以下参数 # skip-show-database ``` > ⚠️ 注意:空结果**不等于**无数据库。例如root用户执行`SHOW DATABASES;`应至少返回 `information_schema`, `mysql`, `performance_schema`, `sys` 等系统库[^1]。 ### 验证数据库是否存在 ```sql -- 直接查询系统表(需权限) SELECT schema_name FROM information_schema.schemata; ``` 此命令绕过`SHOW DATABASES`的权限限制,直接读取元数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值