背景是这样的:
有个客户要尝试做 ha ,但是做完 ha 之后发现数据一直没办法同步
经过分析之后觉得可能是因为原来的数据,导致做完 ha 之后数据库进行同步时,发生了主键冲突
比如两个数据库,同样一张表 id 都是 1,没有做 ha 之前没有事情,但是做了 ha 开始数据同步时,发现主键冲突了,这样数据就没办法同步过去了

因为客户那边是测试环境,所以就可以把数据清理了之后重新来
然后我的脑子就抽了,在运行命令 rm -rf /var/lib/mysql/* 时,运行成了 rm -rf /var/lib/mysql ,直接把 mysql 整个目录干掉了

然后我又重新建立了 mysql 目录

mkdir /var/lib/mysql 给这个目录授权

chown mysql:mysql /var/lib/mysql

chmod 750 /var/lib/mysql

然后启动 mysql

mysqld --initialize-insecure

看起来一切正常,但是查看库发现,默认的一些数据库都没有了

databases看不到 mysql非root用户 show mysql找不到数据库_dba


但是查看目录 /var/lib/mysql 目录,它是有 mysql , performance_schema , sys 这些目录的

databases看不到 mysql非root用户 show mysql找不到数据库_mysql_02

按道理来说,有这些目录,在 show databases 时,就应该能看到这些数据库,但是没有
第一反应就是,没有权限,开始给这个文件夹提权
结果还是没用

突然想到,在初始化 mysql 时,我可不可以以特定用户来进行,这样的话是不是默认就能有权限了,原来的初始化命令是 mysqld --initialize-insecure 现在改成 mysqld --initialize-insecure --user=mysql 嗯,问题解决

databases看不到 mysql非root用户 show mysql找不到数据库_dba_03


扩展:
--initialize 代表" 默认安全"安装(即包括生成随机初始 root 密码),在这种情况下,密码被标记为过期,必须选择一个新密码
--initialize-insecure ,不会 root 生成密码
举个例子:在 mysql 完全清理数据之前,如果运行的命令没有加 -insecure ,那原来的 root 密码就会被标记过期,不能用了
如果运行的命令加了 -insecure ,就不会生成密码,此时进入 mysql 的命令 mysql -uroot 回车即可

reference : https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization.html