安全等保要求云服务器有堡垒机,防火墙,有漏洞感知,有安全防护,入口需要有负载,服务器需要有冗余,数据库需要主备…… 同时还要保留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.

为什么 show tables显示 show tables_mysql

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,

然后重启,填完回家。