记录Mac下MySQL的坑

安装方法

两种方法各有各的坑,再加上MySQL5.7之后的问题,我一度想要重新做系统了。

由于我的MySQL经过了反复的Homebrew和DMG安装,中间出现了一些问题,我也不确定单纯的Homebrew是否会出现以下问题。

Homebrew安装

懒人最喜欢的自然就是打开iTerm2,直接

brew install mysql

直接搞定!(并没有……

DMG安装

下载好镜像,挂载、安装,系统会给你一个初始随机密码,如果记不住,可以看右侧的通知:

通知记录

初始化

Homebrew提示使用mysql_install_dbmysql_secure_installation来进行安装。网上的方法多是:

unset TMPDIR
mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

需要注意的是,Homebrew安装的东西多在/usr/local/Cellar下,如果你在安装之后发现mysql_install_db或者mysqladmin等无法找到,可以自己做链接,或者将/usr/local/Cellar/mysql/bin//usr/local/Cellar/mysql/support-files/加入到当前PATH中。

与此相对的是DMG安装在/usr/local/mysql/下,对应目录结构一致。

启动

这个时候启动MySQL

mysql.server start

启动的时候,有可能会出现以下问题:

The server quit without updating PID file (/usr/local/var/mysql/「你的mac名称」.pid).

经过查看,权限需要改变为_mysql:_mysql

sudo chown -R _mysql:_mysql /usr/local/var/mysql

连接

这个时候如果直接连接,八成会出现这个错误

ERROR 2002 (HY000): Can not connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

其实,主要是因为默认使用mysql -uroot -p的时候,连接使用localhost而这需要在配置文件中指定socket(坑1)。直接加上-h 127.0.0.1就可以连接,当然,也可以配置之后再连接。

配置

MySQL默认的配置读取顺序如下:

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/local/etc/my.cnf
  4. ~/.my.cnf

就不要去cp什么my-default.cnf了,基本是个空文件,参考这里,或以下:

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
init-connect ='SET NAMES utf8'
max_allowed_packet = 64M
bind-address = 127.0.0.1
port = 3306
socket = /tmp/mysql.sock
innodb_file_per_table=1

[mysqld_safe]
timezone = '+0:00'

其中,你能看到有socket = /tmp/mysql.sock,有了它就可以直接localhost而不用127.0.0.1了。

当然,即便如此之后依然会有2002错误,解决办法就是把MySQL目录下的mysql.sock链接一个到tmp这里来,或者这里直接指向安装目录下的mysql.sock

自启动

Homebrew安装的MySQL直接使用以下命令就可以将其设置为自启动

brew services start mysql

登录

这个时候,你连接会发现……root没有密码!当然执行了mysql_secure_installation应该会重置密码,但是直接改怎么办?

停止MySQL,以安全模式启动

mysql.server stop
mysqld_safe --skip-grant-tables

这个时候登录可以不需要密码,再修改密码即可。

用户密码坑

这个坑是两种安装方法都会遇到的,因为MySQL自5.7版本之后,mysql数据库下的user表中,原来的字段password已经改变为authentication_string,更新密码这样:

use mysql;
update `user` set authentication_string=password('123456') where User='root';
flush privileges;

然后停止掉mysqld_safe,重新启动登录。执行任何命令都会提示

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

这个时候需要显式的更新密码:

set password for root@localhost=password('123456');

就可以愉快的玩耍了。