文章目录
一、问题引入
二、问题分析
三、问题解决
四、总结
一、问题引入
今天是学习谷粒商城的第一天,既然是第一天,肯定就是先对项目先有个基本的了解,比如是项目所用到的技术栈,项目整体的架构等,还对分布式的相关概念简单说了一下。
接下来来就是搭建环境了,与以往不同的是,先是从运维搭起,也就是先装虚拟机,然后在虚拟机上装相关软件,比如说Docker、Mysql、Redis。当然雷神他上课不是用到Vmware虚拟机,而是另外一个虚拟机平台,virtualBox,并且使用vagrant快速集成centos,然后使用windows的cmd进行操作。本来还想试一下的,可是因为要安装centos,下载的真的很慢,并且VMware+Xshell也挺好用的,我就在WMware上面另外又搭建了一台Linux系统。然后就是正式配环境了,使用Docker容器技术安装相关软件。
首先就是安装MySql,当我pull下来,然后run之后,并且ps了一下,发现MySql容器已经启动了,然后用Navicate连了一下,发现怎么也连不起来,报错如下:
二、问题分析
说句实话,看到这个我的第一反应是,IP地址是不是写错了或者是虚拟机防火墙开着,不允许外界访问啥的,可是我看IP没错,防火墙也被我关了。是的,我比较菜,之后就想不到什么了,之后使用Docker的ps命令发现MySql已经restart了,所以是启动出了问题,我就开始怀疑是不是我那个run的那一长串是不是写错了,最开始,我在记事本上面手写了一遍,确实最开始的时候,我写的确实有问题,问题出在目录挂载那里,前面写错,没有以/开头,后面也写错了,先mysql,报错如下:
看到最后我知道要使用绝对路径,改了之后确实也启动了,
随即我就使用navicat连,发现连不上,后面就一直restarting:
后面我就傻不拉几的把容器删了重启,还以为自己的那个不对,还改成了和老师一样的写法,就是把我的那个开机自启(restart=always)去掉了,来来回回重复了好几遍,最后我把镜像都删了,重置,最后也是没能解决问题(确实这里是犯傻了,其实我最开始启动了,最开始UP了说明那一长串其实是没问题的,我还一直纠结这个),后面没办法了咯,只能在网上查了咯,搜索的关键字是:Navicat连不上虚拟机里面使用docker安装的MySql,看到的结果有下面这些:
1. MySQL服务是不是正常开启了
到Docker这里就是容器是否启动成功了呗,确实我的容器就没启动成功
2. MySQL未远程授权
确实这也是一个问题,当时根本没在乎这里,没这种意识
3. 虚拟机防火墙的问题,未开放端口啥的
我把防火墙关了,所以问题肯定不是在这
排错方法如下:
首先明确容器就启动失败,得先从容器这里入手:
后面我换了之前学Docker的时候成功的run命令:
结果这样:
我滴个妈呀,这到底咋回事呀,之前都好好的,现在就出一些问题呢,(ps:其实这里报错有显示my.cnf的事,我没太在意,最后问题确实也很这里有关系) 。
反正目前是启动都失败,还不要先管其它的,先把它正常启动再说,后面我找到了一篇博客,解决了我的问题:
他说既然你没启动,那就看容器的日志的报错信息(ps:确实这点我有问题,没有查看容器错误日志的这种意识)。
日志的报错信息如下:
解决办法是:我的宿主机的conf目录,下面得配置my.cnf文件,文件里面写东西,就是在conf目录下,创建一个my.cnf的文件,文件里面写下面这些:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
也就是这篇博文:
(20条消息) docker的mysql容器exited(1)无法正常启动_敲着bug的小熊的博客-CSDN博客
重新启动容器,发现也一直是UP状态了,说明启动成功:
启动是成功了,可是我的navacat依旧是连不上。
然后下面这篇博文就说,要改密码,反正他改了密码就行了:
(20条消息) docker安装mysql后Navicat链接不上的问题_小城南的博客-CSDN博客
后面我就使用exec命令进入到MySQL容器里面。(ps:这里我又傻了一下,进入到容器里面就这个use user了这个使用mysql命令了,其实还没有连接上MySql客户端呢,当然通过这个我也更加理解了一个Docker容器其实相当于就是一台虚拟机,在这里就是装有MySql的一台虚拟机,这里联想到挂载目录,其实也想得明白了,容器中的/var然后再/mysql,不就相当于一台Linux吗)。
好,接下来问题又来了,使用密码登录MySql客户端居然连不上了,这是我在以前从未出现过的问题,报错如下:
我滴个妈,这又是咋回事呀,怎么我是设置了密码启动的,怎么还连接不上了,没办法咯,之前也没遇到过,继续百度咯,后面看到下面这篇博文:
说不需要使用密码,直接回车,然后改一下密码,然后再重新设置密码,最后重新启动MySql,最后再重新登录就行了。
下面是这篇博文地址:
(20条消息) 解决mysql:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)_刀光剑影aaa的博客-CSDN博客 最后我试了试,确实可以直接回车进行登录:
可能是博主多写了把,其实这里是没有password的,修改密码直接是:
update user set authentication_string = '123456' where user = 'root'
修改为然后flush一下:
flush privileges;
那到底怎样解决密码问题呢?后面我又看了另外的一篇博文:
这是修改root密码的方法
下面是这篇博文地址:
(20条消息) MySQL修改root用户密码_mysql修改密码命令_折竹丶的博客-CSDN博客
这篇博文确实挺好的值得推荐,提供了修改root用户密码的方式,还提供了忘记密码和知道密码的两种方式修改密码的方法。
按照他的步骤我确实修改密码成功了,使用新密码登入客户端成功:
好了,按照之前博文所说的,修改密码之后,应该navacat现在应该可以正常连接上了吧,结果却还是连接不上。
后来我又看到一篇博文说要改一下这个,如下图所示,这样改一下密码就行了:
结果都是这个报错;
Operation ALTER USER failed for 'root'@'%'
然后我又继续查看博文,下面的博文解决了我的问题
这是博文地址:(20条消息) ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘_Mr.Java.的博客-CSDN博客
按照他之前所说的,我得先有'root'@'%'后面我使用下面这条语句将其修改成这个:
update user set host ='%' where user='root';
修改之后结果是这样:
还是不行,所以我就只能按照他所说的还是不行的方法:
先置密码为空,然后重新设置密码;
最终使用navicate连接成功!!!
后面我又测试了一下,将其将root用户的host修改为localhost,结果确实连不上,最后还是重新修改成%然后再使用上面两步重置密码解决。
三、问题解决
1. 首先解决MySql容器无法启动的问题:
在宿主机的conf目录下面配置这个:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
2. 客户端使用密码无法登录
使用下面方法重置root账号密码:
3. 如果还有问题,试一下这个
如果尝试这个的时候报了下面这个错:
Operation ALTER USER failed for 'root'@'%'
就先这样让'root'的host为'%':
update user set host ='%' where user='root';
重新尝试上面那个,如果还是有问题,直接下面这样:
四、总结
1. 首先要有查看容器的日志的报错信息的意识,这一点我是没有意识的,后面是通过查看日志,才知道是my.cnf没有配置的问题,配置了MySql容器就可以正常启动了
2. 知道如果客户端使用密码登不进,尝试是否可以直接回车进去,进去之后修改密码
方法是
2.1 先切换到mysql数据库,将密码置为空
2.2 然后设置加密规则,重新设置密码,并进行授权
3. 要有navicat连不上MySql可能是root用户的host是localhost的缘故的这种意识,也就是是否支持远程连接,知道使用 update user set host ='%' where user='root';这条命令进行修改。