背景
同时开发多个项目,老项目使用的是mysql5.6,新项目用的mysql5.7版本,通过homebrew安装之后,只能启动其中一个,另一个会失败。
安装
失败原因分析
brew 安装的mysql默认端口号都是3306,数据目录也都是一样的/usr/local/var/mysql,同时启动两个一定会冲突。
所以就要解决方案就是修改他们启动的参数。
mysql默认安装参数
basedir
通过brew安装的软件,路径默认都是在/usr/local/Cellar
下边,
我的mysql安装路径是:
- 5.6
/usr/local/Cellar/mysql@5.6/5.6.51
- 5.7
/usr/local/Cellar/mysql@5.7/5.7.37
启动脚本
在mac上,一般通过brew services list
列出所有已安装的软件,通过brew services start mysql@5.6
启动mysql。
在mysql的安装路径下,我们可以找到两个文件
- homebrew.mxcl.mysql@5.6.plist
- homebrew.mysql@5.6.service
这两个文件配置了我们通过brew start mysql时的默认参数,比如homebrew.mxcl.mysql@5.6.plist
中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql@5.6</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql@5.6/bin/mysqld_safe</string>
<string>--datadir=/usr/local/var/mysql56</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/var/mysql56</string>
</dict>
</plist>
可以看到配置了--datadir
参数,也就是mysql数据目录,我们可以通过修改这些参数,达到mysql5.6和5.7使用不同路径的目的
修改5.6和5.7的配置
- 修改
homebrew.mxcl.mysql@5.6.plist
- 添加
<string>--port=3306</string>
- 修改
<string>--datadir=/usr/local/var/mysql56
- 添加
- 修改
homebrew.mysql@5.7.service
- 添加
ExecStart=/usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql56
- 修改
WorkingDirectory=/usr/local/var/mysql56
- 添加
同样的,修改mysql5.7的配置
启动失败问题
修改完之后,尝试启动brew services start mysql@5.6
,不出意外的话,应该会失败。
可以到对应的数据目录查看启动日志,找到失败原因~~
我的日志在/usr/local/var/mysql56/captain.local.err
,报错如下
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
失败原因
由于这个数据目录是我新建的空目录,里边缺少了mysql自带的权限相关的表,所以需要先对mysql做初始化操作。
在mysql5.6和5.7的初始化操作命令是不同的
- 5.6
bin/mysql_install_db --user=mysql --basedir=. --datadir=/usr/local/var/mysql56
- 5.7
bin/mysqld --datadir=/usr/local/var/mysql57/ --initialize --user=mysql
重新启动两个数据库
brew services start mysql@5.6
brew services start mysql@5.7
修改密码
重置完,mysql没有密码,可以连接mysql,进去之后set password for root@localhost=password("abc123")
修改密码