安装Mysql8的心酸历程
最近要在Macos上面安装一个MySQL8,本来不出意外的话,应该是一件很简单的事,结果耗费了我大半天的时间,在老家也没网,还是用的手机4G网,不过,好在最终还算安装好了,也算是给了自已一点小小的安慰吧。
brew方式
在Mac上,我安装软件首先是用brew的方式,主要也是不想去处理各种依赖,卸载软件也方便,如果你要升级软件也是很方便的,他基本都是通过软链接的方式,比如我常用的php和go,升级起来就很方便呀,安装完后,软链接更改下就行了,但是如果你不经常更新brew的话,在安装软件的时候他会先更新自身,有时候网速不行,就会很慢的,当然可以关闭自动更新。
我这个问题就是在更新自身时出现的,当更新完自身时,我使用brew install mysql@8
来安装Mysql8时,提示有一个不兼容,大概意思就是brew与我当前的macos不兼容(sierra 10.12),于是我执行brew search mysql@8
,报这个兼容错误,不对呀,我在安装之前,特意执行了search
的,确认能找到这个包,于是我执行brew search mysql
和php
等其它的包搜索,都提示这个,这下好了,软件没装好,倒把brew也玩坏了,在网上找了半天差点,其实也没找到啥重要的信息,就要我打算要重装brew了,无意中找到一个 brew update-reset
,这个执行后,重置了brew,再执行其它的brew命令,这次不报错了,但是我也不敢再使用brew的方式了,没法,我想着那就只能改用dmg方式了。
dmg方式
于是乎,我在Mysql官网下载了macos版本的mysql,从下载到安装是一路顺利的。安装完后,在系统偏好设置中找到Mysql,发现启动状态那里是一个红色的,而不是绿色的,也就是说服务没起来。我想着也是正常的,毕竟我本地已经安装了一个5.7的了,而且安装的时候也没有让我选择端口,我的第一想法是肯定我改一下端口就行了。于是,我在配置文件里面把端口改成3307,再去启动服务还是没起来。参照网上的,在 /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
这个文件中改一些参数,比如路径和端口
<key>ProgramArguments</key>
<array>
<string>/usr/local/mysql-8.0.21-macos10.15-x86_64/bin/mysqld</string>
<string>--defaults-file=/usr/local/etc/my8.0.cnf</string>
<string>--basedir=/usr/local/mysql-8.0.21-macos10.15-x86_64</string>
<string>--datadir=/usr/local/mysql-8.0.21-macos10.15-x86_64/data</string>
<string>--plugin-dir=/usr/local/mysql-8.0.21-macos10.15-x86_64/lib/plugin</string>
<string>--early-plugin-load=keyring_file=keyring_file.so</string>
<string>--keyring-file-data=/usr/local/mysql-8.0.21-macos10.15-x86_64/keyring/keyring</string>
<string>--log-error=/usr/local/mysql-8.0.21-macos10.15-x86_64/data/mysqld.local.err</string>
<string>--pid-file=/usr/local/mysql-8.0.21-macos10.15-x86_64/data/mysqld.local.pid</string>
<string>--user=_mysql</string>
<string>--default_authentication_plugin=mysql_native_password</string>
<string>--port=3307</string>
</array>
可结果还是一样,于是我进入mysql8的安装目录,同时停用我本地的5.7,直接接行mysqld,发现有权限问题,这个目录的用户是_mysql,然后我就更改为另一个用户再启动,这次倒是能启动了,但是我连进去后,发现里面的数据库还是5.7下面的库,我明明指定了8.0自身的data路径,怎么跑到5.7下去了。哎,算了,不想去深究了,看网上说可以用mysql_multi的方式启动多实例,我是不想去折腾了,只能用上最后的方式了,用Docker吧.
Docker方式
Docker用于体验一些新的东西,搞些环境还是挺方便的,而且如果不要了,直接删除镜像或容器就行了。
用Docker安装mysql8很简单,先搜索下
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 10014 [OK]
mariadb MariaDB is a community-developed fork of M... 3666 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 733 [OK]
拉取镜像
$ docker pull mysql:8.0
待拉取完毕后,查看下镜像
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 e1d7dc9731da 3 weeks ago 544MB
使用镜像 在使用前,先建立几个目录,主要是配置和data的映射,如果不用宿主机建立映射,你的容器重启后,数据就没了。
$ mkdir -p ~/Application/Docker/mysql/data ~/Application/Docker/mysql/log ~/Application/Docker/mysql/conf
运行容器:
$cd ~/Application/Docker/mysql/
$ docker run -p 3307:3306 --name mysql8 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
命令说明:
-p 3307:3306:将容器的 3306 端口映射到主机的 3307 端口。
-v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
上面的命令运行后,如果正常的话,就会启动一个容器,使用 docker ps
或 docker container ls
查看,如果找不到的话,那就说明刚才那个run有问题,这种一般是你宿主机的权限问题,更改下权限就行了,如果失败了,需要用docker rm mysql8
删除刚才的容器,不然下次再用run的时候会报已经存在同名的容器了。
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37bcead3d1b1 mysql:8.0 "docker-entrypoint..." 23 hours ago Up 21 hours 33060/tcp, 0.0.0.0:3307->3306/tcp mysql8
上面的容器启动后,可以进入容器内部看看
$ docker exec -it mysql8 /bin/bash
在容器内部,可以使用mysql -u root -p123456
的方式来连接mysql8
通过上面的安装方式,只是说明了安装成功,如果在宿主机环境通过应用程序或者其它Mysql管理工具去连接,你会发现还是报错,主要是密码认证那里,mysql8使用了新的密码算法,于是我们就要更改下算法为 mysql_native_password
进入我们启动的容器内部,然后连接mysql,再分别执行
mysql> grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
mysql> ALTER user 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
mysql> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> FLUSH PRIVILEGES;
执行完成后,这个时候才算真正的安装完成,同时在宿主机也能用3307端口来远程连接了。
倒腾了一大圈,结果还是用Docker的方式来安装的,还别说,用Docker整这些环境虽然也有不少的小问题,但是总体来说,还是挺方便的,看来,以后还是要把Docker多用起来,只要对一些数据作持久化处理,其它的就尽量少管,也是一件很美妙的事呀。