MySQL8.0.15在Win10上的折腾记

安装和配置MySQL

我在Windows 10上面使用 MySQL Instller 安装的MySQL8.0.15,安装完成后,启动MySQL遇到了不少问题,特此记录踩坑记。

只要你的网络稳定,按照默认安装整个安装过程还算比较顺利。安装过程中需要设置密码,我设置的账号和密码都是 root,所以下面的操作都是基于这个账号和密码进行的。

安装完成后,将mysql serverbin目录加入到系统的path变量中去,如图:

1568529858131

系统环境变量path中加入%MySQL_Home%\bin 即可。

加入成功之后,就可以使用mysql命令了。

题外话,我们在命令行使用的mysql命令其实是对应MySQL Server 8.0\bin\mysql.exe,可以使用where命令看一下其可执行文件的位置,如下:

1
2
$ where mysql
C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe

同理, mysqld命令对应的是mysqld.exe可执行文件。

查看安装的mysql-server版本,可以执行下面的命令:

1
mysql --version

可以得到下面的输出,可以看出当前版本是 8.0.15:

1
C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe Ver 8.0.15 for Win64 on x86_64 (MySQL Community Server - GPL)

我用的命令行终端工具是Git bash(安装Git客户端就自带该工具,个人觉得挺好用的,[嘿哈])。

用管理员身份运行,执行如下命令:

1
mysqld --install

如果不用管理员身份运行终端的话,会报类似下面的错误:

1
Install/Remove of the Service Denied!

运行成功的话,可以看到如下提示:

1
Service successfully installed.

再次启动 mysql80,执行:

1
net start mysql80

注意:这里使用的是mysql80,这个是服务的名称 (安装时候我设置的服务名称) ,不是mysql,下面会讲解为什么这样做,如果你没有这个mysql80服务只需要启动mysql服务即可。

如果出现类似 “MYSQL 服务无法启动” 的提示,可以在Windows的任务管理器中找找是否已经启动了mysqld服务,可以手动关闭后再来启动。

如果始终启动失败,可以执行下面的命令:

1
mysqld --initialize

启动成功后,显示如下:

1
2
MySQL80 服务正在启动 .
MySQL80 服务已经启动成功。

可以使用下面命令查看是否成功启动mysql80服务,如下:

1
netstat -aon|findstr "3306"

看到如下提示表示启动成功,如下:

1
2
3
4
5
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 10344
TCP 0.0.0.0:33060 0.0.0.0:0 LISTENING 10344
TCP [::]:3306 [::]:0 LISTENING 10344
TCP [::]:33060 [::]:0 LISTENING 10344
TCP [::1]:3306 [::1]:56962 TIME_WAIT 0

登录mysql80服务,执行如下命令:

1
2
3
$ mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

很不幸的是,登录失败(ERROR 1045)。

那我们就来解决这个问题,这个版本的MySQL和之前的8.0.x版本解决方案不同,网上找过很多解决方案有修改配置文件的,忙了半天还是没有搞定,最后在StackOverflow上面找到方案,结合个人实践总结了一下,还烦请大家务必往下看。

解决MySQL登录受限

在看下面内容之前,务必完成之前的步骤,否则下面的内容对你来说没有太大价值。

新版本的MySQL加强了安全方便的考虑,所以使用新版本比较费劲,如果你不想折腾,可以安装MySQL的5.x版本。

Step-1:停止MySQL80服务

使用快捷键 win+R 输入 services.msc,打开如下视图并找到MySQL80服务:

1568529858131

停止MySQL80服务,或者在命令行执行net stop mysql80命令。

Step-2:另一种方式启动MySQL80服务

使用管理员身份运行终端1,并执行:

1
mysqld --console --skip-grant-tables --shared-memory

此时可以成功启动mysql80服务,但是在Windows的服务中是看不到的,不用理会。继续。

Step-3:启动另一个终端2

上述步骤启动完成后,再用管理员身份运行另一个Windows的终端2(CMD),用系统自带的或者Git Bash 都可以,但是如果使用 Git Bash 的话,必须在登录mysql的时候使用 winpty(Git Bash自带的工具)命令,否则登录会卡住不动。命令使用如下:

1
winpty mysql -uroot -proot

Step-4:终端登录mysql

执行下面命令登录服务:

1
mysql -u root -p root

如下图可以登录成功,如下截图:

1568529858131

Step-5:置空密码

在上述命令行状态下,执行:

1
2
3
use mysql
update user set authentication_string='' where user='root';

Step-6:退出mysql服务

1
quit

Step-7:关闭mysqld启动的mysql80服务

需要关闭以 -console --skip-grant-tables --shared-memory 启动的mysql80服务,直接在终端1中ctrl+c即可。

Step-8:启动mysql80服务

使用Step-1步骤中的方式打开Windows的服务启动或者在终端1中执行net start mysql80启动mysql80服务。

Step-9: 无密码登录mysql

在步骤Step-5中已将密码置空,现在可以无密码状态登录mysql服务,输入登录命令:

1
mysql -u root -p

登录成功后,修改密码(永远不过期的密码)执行:

1
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd123' PASSWORD EXPIRE NEVER;

我把原来的密码修改为newpwd123,你可以根据自己的爱好设置为其他的密码。

如果在此步骤出现类似下面的错误:

1
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

请执行下面的SQL语句,如下命令:

1
flush privileges;

Step-10:退出mysql,重新登录

退出mysql,然后重新使用修改过的密码登录mysql,完事。

MySQL配置文件?

这也是个神奇的问题,最后在MySQL的官方手册里找到了Answer。

在Windows系统中C盘有个隐藏的文件夹,我们来揭开它的神秘面纱。

打开C盘文件,按照下面1、2、3顺序就可以看到ProgramData文件夹,如下:

1568529858131

进入该文件夹,就可以看到MySQL的配置文件,如下:

1568529858131

上面我们已经说过,启动mysql80服务就默认使用的是该配置文件,可以在Windows服务中点击MySQL80查看其属性,可以看到下面的描述:

1
2
可执行文件的路径:
C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" MySQL80

其中,--defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" 就是指定配置文件路径的。

而在Windows服务中点击MySQL,看到的属性是这样的:

1
2
可执行文件的路径:
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" MySQL

并没有指定配置文件,这也是为什么让大家启动的时候执行 net start mysql80 的原因。

顺便修改一下配置文件,把默认编码改为utf-8,如下配置(记得是在[client]和[mysql]标签下):

1
2
3
4
5
6
7
8
9
10
11
[client]
# pipe=
# socket=MYSQL
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
[mysql]
no-beep
# 设置默认编码
default-character-set=utf8

还有奇葩的错误

会持续记录各种奇葩错误。

1、ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

登录mysql服务,报上面的错误,说明没有启动成功mysql80服务,最大的可能是你修改了配置文件要么是格式错了要么是配置的东西mysql不认。

只能把配置文件修改正确才能启动服务。


我们要学会做自己精神领域内的君王,不要成为别人情绪世界里面的奴隶。

坚持原创技术分享!