docker mysql5.6切5.7发生的异常

2020/03/02 posted in  服务端
Tags:  #docker #db

由于某项目需要用到 mysql 5.7的新功能json类型的字段
为了快速搭建,做了不太稳定的做法。
我的myql是映射到本地的 ~/code/mysql

docker pull mysql/5.7

下载好mysql5.7之后,停掉5.6
直接把mysql5.7的数据映射到本地

docker run -it -d --volumes-from codedata --network docker_mynetwork --ip 172.20.0.7 -v /Users/pengyongsheng/code/mysql:/var/lib/mysql -p 3306:3306 --name mysql57 -e MYSQL_USER=root -e MYSQL_PASSWORD=root -e MYSQL_ROOT_PASSWORD=root mysql:5.7

事故

一开始的运行还很正确的,后面出现打开不了tables;
Navicat for mysql 打开只能查看到information_schema数据库,而且只剩下CHARACTER_SETS。

解决方案

  1. 先将本地的~/code/mysql 重命名~/code/mysql2数据文件夹备份一下
    把~/code/mysql清空,删除mysql5.7容器后,重新挂载,这时候产生了新的文件夹数据。
  2. 把备份的好的数据库文件~/code/msyql2里的数据库重新拷贝到~/code/mysql目录下。
    打开查看,其实是能正常查看到数据库了。成功了第一步。

  3. 进一步打开数据库的table , 提示 Table '' doesn't exist 。
    嗯。。遇到了新问题。 经查找资源,innodb的问题。停掉服务后,将mysql2的ibdata1文件夹拷到mysql数据文件夹中。这样,问题得到了解决。

总结

  1. mysql的升级,因为数据会记录版本和服务器的原因,不能直接切换容器,要么在原来的容器上升级mysql server。
  2. 使用Innodb会产生三个文件
    .ibd:包含每个table的数据和索引
    .frm:用来描述table的结构等
    ibdata1:包含所有table的字典和历史操作
    ibdata1文件会记录MySQL中所有InnoDB数据库中table的字典和历史操作,所以要copy ibdata1文件过来。