phpAdmin和本地mysql数据不同问题的可能成因和可能解决方法
环境
操作系统:OS X
技术栈:XAMPP
问题描述
在自己搭建php服务的时候发现XAMPP技术栈下的phpadmin dashboard中数据和本地terminal启动mysql中的数据不同。show databases给出了不同的结果。
通过ps aux | grep mysql 在 terminall查看后台进程发现有两个不同的mysql进程,但是一个是在XAMPP目录下,一个不是。
问题诊断
由于之前工作原因,电脑上以前装的mysql忘记删了,所以当前电脑上总共有三个mysql,两个不是通过homebrew装的,一个是通过hombrew装的。同时那两个不是通过brew安装的mysql中甚至带my.cfg这个配置文件。通过brew安装的这个不带。我完全记不清那两个老版的mysql是从哪来的了。
检查/usr/local/etc/ 目录下存在my.cfg和my.cfg.default。估计是之前调试什么东西的时候自己还备份了my.cfg。
检查/tmp/ 目录下有个mysq.sock。
打开XAMPP,查看mysql service的config文件。发现它的配置文件中,关于mysql.sock的路径并不是/tmp/my.sock。
mysql本地连接是通过sock完成的所以不同的sock会连到不同的mysql service上,导致phpAdmin和本地mysql(通过控制台启动)看到的数据会不一样。本地mysql对应的mysql.sock应该是默认/tmp/mysq.sock,而XAMPP中phpAdmin访问到的应该是通过XAMPP manager中my.cfg配置文件中对应路径下的mysql.sock。
所以当XAMPP启动时会产生一个mysql的进程,而使用terminal启动mysql时又会产生另一个mysql进程,而且两个进程的用户不同,目录不同。
解决方法
首先把Mysql删干净。可以参考土豆面包的这一篇文章:
https://blog.csdn.net/qq_40177015/article/details/111599464?ops_request_misc=&request_id=&biz_id=102&utm_term=Mac%20彻底删除mysql&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-111599464.nonecase&spm=1018.2226.3001.4187
其次通过brew重装一个mysql.
由于我的XAMPP连接mysql默认使用root,重装完成之后由于只有一个mysql在本地,此时/tmp/下的mysql.sock已经被我删掉了,通过控制台 mysql -u root 不设置密码直接能连到和phpadmin同样的mysql service上。然而由于我自己也没有设置由于重装新生成的my.cfg上,此时在不清楚原因的情况下,问题就这样解决了。
而我的预期是重装之后再修改/usr/local/etc/ 目录下的my.cfg,让这个my.cfg和XAMPP的my.cfg的mysql.sock路径指向同一个mysql.sock。但没有做这一步问题也解决了。
疑点
1.先前通过控制台启动的mysql,中root的是我之前时候设置的密码,phpadmin使用root登陆没有密码。所以我猜这两个root可能是由于环境变量的问题连到不同的mysql上了,我使用terminal, eclipse, idea访问到的mysql service和phpadmin访问到的不是同一个。
2.由于mysql不同用用户登陆进去看到的东西是不一样的,也可能是这个原因。同样是root登陆一个要密码一个不要密码,这里的原因没搞清楚。
3.由于brew安装的软件都在/usr/local/Cellar/目录下,我检查了这个目录下的mysql目录。在/usr/local/Cellar/mysql/8.0.31/bin/ 这个目录下有一个mysql.config文件,目前不清楚mysql.config这个文件有什么功能,它包含一个指向mysq.sock的语句—“socket=‘/tmp/mysql.sock’”。这个/tmp/mysql.sock应该是默认的,下次试试修改这个参数看看会有什么效果。
4./usr/local/opt/这个目录下也有mysql和mysql@8这两个目录,这两个目录下对应位置分别有对应的mysql.config。看到这个我觉得非常蛋疼,因为不知道这个/…/opt/目录下的文件和/…/Cellar/下的文件有什么关系。也不知道mysql.config和my.cfg有什么关系。
可能结论
1.最可能的解释是由于电脑上同时存在之前手装的两个mysql和一个brew装的mysql,混乱的环境变量设置导致不同的程序访问了不同的mysql service。这种情况我认为删干净所有的mysql,使用brew安装唯一指定mysql是一个解决办法。
2.由于知识还是比较有限,对mysql和操作系统的理解也比较浅,不清楚环境变量的混乱具体是怎么混乱,mysql不同的用户登陆为什么会看到不同的数据库内容,还有/…/Cellar/下和/…/opt/下的文件有什么关系以及mysql.config和my.cfg的关系。
后续有时间会把第二点弄清楚。