本机默认安装一个mysql56服务器,因为想要验证mysql57一个字符集相关的特性,所以打算在本机再装一个,安装方式采用的是压缩包的方式,非通过mysql-installer-community方式安装。坑太多了,心累的一天!:happy:
bug点陈列
1、MySQL57安装初始化之后,my.inf文件夹指定的目录没有创建,my.inf根本没有起作用。
2、MySQL57密码问题:用初始生成的密码登录,密码输入正确依旧被否认,利用mysql --skip-grant-tables
修改密码多次,依旧登录不上。
问题复现及解决
其实开始安装MySQL57时,my.ini文件没有生效是导致一连串bug的根源。my.ini文件为什么没有生效呢?
复现:
关闭mysql56服务,下载mysql57安装包并解压,新建my.ini文件到mysql57安装目录,目录内容如下:
[mysqld]
#skip-grant-tables
port = 3306
basedir=E:\\mysql-5.7.31-winx64
# 数据库文件存放地址
datadir=E:\\mysql-5.7.31-winx64\\Data
# 最大连接数
max_connections=200
character-set-server=utf8
[mysql]
default-character-set=utf8
之后执行mysql初始化命令,mysql --initialize--insecure
得到一个随机码,这时候我发现E:\\mysql-5.7.31-winx64\\Data
这个目录并没有生成,经查询它默认配置到了MySQL56所在的目录,我一看这不行啊,考虑到如果数据文件越来越大,必须将数据文件转移到其他盘而不是MySQL56所在的C盘。
为什么my.ini文件配置失效?
文件分隔符,其实双反斜杠和单正斜杠都可以经查询,排除。
我没有配置MySQL57目录下/bin的环境变量,并且cmd下操作的命令不是在mysql57安装bin目录下进行的,那么本机就会使用MySQL56的环境变量,那么就相当于将MySQL56初始化了一遍,而不是MySQL57,所以存在两种解决方案:(1)将MySQL57的环境变量添加到系统变量置于MySQL56的环境变量之前。(2)不添加MySQL57环境变量,在MySQL57的bin目录下运行命令。
我采用了(2),my.ini文件作用生效,data目录在MySQL57安装目录成功生成。之后执行安装MySQL57服务,cmd显示服务成功安装,之后启动服务,登录
# mysql57位服务名
mysql --install mysql57
net start mysql
# 删除mysql57服务
sc delete mysql57
当输入用户名密码的时候,输入的密码一定正确,但被否认了,当我只输入用户名,不输入密码的时候直接回车却能够进入数据库,但是只有一个访客权限,数据库只存在information_schema,没有mysql数据库,这显然不是root用户该有的样子。多次输入无解之后,只能通过修改一下密码尝试一下。接着又是一通操作:
# Linux或者win如果忘记密码,都可以使用这种方法,一种是命令行,一种是配置文件方式
# 1.跳过密码之前的配置
# 1.1.配置文件方式
# my.ini或者my.cnf,在[mysqld]添加skip-grant-tables
# 重启服务
# 1.2. 命令行方式(win)
# 关闭服务
# bin目录cmd中执行
mysqld --skip grant tables
# 这时光标卡住,这是正常的反应
# 2.更改密码
# 通过1.1或者1.2任意一种设置,都可以免密进行登录,这里以1.2方式讲解
# bin下新开cmd窗口,输入
mysql -uroot -p #两次回车
# 进入mysql,update pwd
use mysql;
update user set authentication_string =password('new_pwd') where user='root';
flush privileges;
# 退出之后开启服务再次登录
【注】mysql57之后mysql下的user表没有password字段了,也就是说不能set password=xxx,新版本的数据库将利用password函数将字符串(password)加密后设置到authentication_string这个字段中。其实还有多种更改mysql用户密码的方式。
改完密码之后,我尝试着再次登录结果还是无果。
初始登录失败,密码修改之后,还是登录失败!
之后百度了很多帖子,直到遇到了它,总算解决了!
当我查看我的注册表的时候cmd->regedit
,注意到这样的一个值计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mysql57
,Services下存在两个mysql,一个是56,一个是57,博文中介绍的点是要修改ImagePath的值。我观察到我的mysql57中ImagePath的值竟然和mysql56的值相同,这就不应该了,mysql57应该使用它目录下的mysqld、data等等。所以我将值改为了mysql57目录,再次登录,密码正确,成功!
出现以上bug的原因,就是刚开始my.ini文件没有生效,编译安装之后使用的是MySQL56的配置,当再次做其他操作的时候,结果就会出现很多意外的错误。