执行MySQL初始化:
mysqld --initialize --datadir=/home/mysql/3307/data --user=mysql
报错,提示不能创建目录:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 17 – File exists)
建立目录再执行初始化命令,提示没有权限:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 13 – Permission denied)
该目录已经属于mysql用户,且有读写执行的权限。设置成0777,依然报错。
相同的命令,曾在CentOS上,自己编译的MySQL用过,不应该是命令的问题。该机器是我的笔记本,安装的是Ubuntu Server 18.04,MySQL是用官方的apt源安装的。经过一番查找,发现是一个叫AppArmor的玩意搞鬼。
Ubuntu有个AppArmor,是一个Linux系统安全应用程序,类似于Selinux,AppArmor默认安全策略定义个别应用程序可以访问系统资源和各自的特权,如果不设置服务的执行程序,即使你改了属主属组并0777权限,也是对服务起不到作用。
解决
编辑AppArmor配置文件:
vi /etc/apparmor.d/usr.sbin.mysqld
找到“Allow data dir access”,把自己要指定的MySQL数据库目录加到列表就可以了。

重启AppArmor服务:systemctl restart apparmor
再执行初始化数据库命令。成功!
注意:对于Mysql 5.7.6以后的5.7系列版本,Mysql使用mysqld –initialize或mysqld –initialize-insecure命令来初始化数据库。前者会生成一个随机密码,在error.log的输出日志查找“A temporary password is generated for”可以看到。后者使用空密码。但是安装Mysql时默认使用的是前一个命令,这个命令也会生成一个随机密码,该密码保存在了Mysql的日志文件中。
关于MySQL 5.7的内容,可以参考我之前写的:
该问提解决来源:https://www.cnblogs.com/linxiyue/p/8229048.html
发表回复