解决Docker mysql容器升级到 mysql8遇到的问题

文 / @UTHEME

解决Dockermysql容器升级到mysql8遇到的问题

在使用Docker搭建mysql容器时,我们可能会遇到升级mysql版本的需求。但是有时升级后却无法启动容器,这是为什么呢?

有个用户在升级mysql到8.0.11以后,使用原先创建mysql容器的方式启动容器,结果容器无法启动,报错信息为“/xxxx/xxx/mysqldata下面的插件文件是5.7版本创建的8.0无法启动”。更换回原先的镜像也无法启动,导致目录废掉。这个问题的根本原因是容器的备份问题。

因此,我们在升级mysql容器时,需要注意以下几点:

1. 挂接备份目录

首先,我们需要备份原先的mysql数据目录,可以通过将目录挂载到宿主机上来实现。例如,原先的目录是/xxxx/xxx/mysqldata,那么我们可以在升级前将该目录挂载到宿主机的某个备份目录下,比如/home/backup/mysql。

2. 创建新的容器

升级完成后,我们需要创建一个新的mysql容器,并挂接一个任意目录,例如/home/mysql。与原本创建mysql容器的方式不同的是,这次我们需要使用新的mysql镜像。命令如下:

```
docker run --name=mysql-new -v /home/mysql:/var/lib/mysql -p xxx:3306 -d mysql:8.0.11
```

这样就可以创建一个新的mysql容器,并挂接一个任意目录/home/mysql。

3. 数据备份还原

在完成新容器的创建后,我们需要通过navicat等其他工具将原先的mysql数据备份还原到新的mysql容器中。或者通过命令:

```
docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD" > /some/path/on/your/host/all-databases.sql'
```

备份还原成功后,使用navicate连接mysql时可能会遇到连接失败的问题。这是由于mysql 8.0使用的是caching_sha2_password认证方式,需要修改mysql的my.cnf文件。在my.cnf文件中添加以下内容:

```
default_authentication_plugin=mysql_native_password
```

然后重启mysql服务即可。如果不想重启服务,可以通过登录容器来修改:

```
docker exec -it mysql-new /bin/bash
mysql -uroot -p
use mysql;
select Host,User,plugin from mysql.user;
```

然后使用以下命令将caching_sha2_password修改为mysql_native_password:

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your-password-here';
```

4. 文件拷贝

最后,如果需要将容器中的文件拷贝到宿主机上,可以使用以下命令:

将容器中的my.cnf文件拷贝到宿主机上:

```
docker cp 容器:/etc/mysql/my.cnf /home/xxx/my.cnf
```

将宿主机上的my.cnf文件拷贝到容器中:

```
docker cp /home/xxx/my.cnf 容器:/etc/mysql/
```

总结

面对这种备份问题,在升级容器时,我们需要提前作好数据备份,保存在外部,并在升级容器后重新挂接数据。升级完成后,还需要一步步检查,确认各个组件的兼容性,确保升级操作的成功。

此外,我们还需要给容器中的mysql配置文件添加default_authentication_plugin=mysql_native_password,同时保证程序接口的mysql驱动正确,才能避免无法连接mysql的问题。 如果你在这方面出现了问题,可以参考以上的处理方法,解决Docker mysql容器升级到mysql8遇到的问题。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。