赞
踩
[参考博客]https://blog.csdn.net/qq_31659985/article/details/80701769
从docker上下载了mysql-5.7的镜像,创建并后台启动mysql-5.7容器(文中的命令均在root下执行的),然后向数据库(mysql-5.6)导入SQL文件,报错如下:
1067 - Invalid default value for 'childdate’
后面发现,在创建表或者导入SQL时,date和timestamp类型字段无法将默认值设置为0000-00-00或0000-00-00 00:00:00。
通过查询,发现这种报错多是mysql升级到5.7而引起的默认值不兼容的问题。时间字段,类型是date或datetime。可能是类型的默认值被限制了,查看 sql_mode。
修改mysql容器配置文件中的sql_mode,此处我们使用docker安装mysql-5.7,挂载外部配置和数据,并修改虚拟机本地配置文件(映射容器中mysql的配置文件)中的sql_mode。
docker run --name mysql-5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
参数说明:
-e: 为当前容器添加一个环境变量
-p: 将容器中mysql端口映射到宿主机指定的端口中
-d: 让MySQL容器在后台启动,不去占用前台的进程
docker ps
docker exec -it mysql-5.7 /bin/bash
cat /etc/mysql/my.cnf
cat /etc/mysql/mysql.conf.d/mysqld.cnf
复制该配置文件内容备用,以作为虚拟机本地配置文件。
mysql -u root -p
回车输入密码,进入mysql控制台
show variables like '%sql_mode';
exit退出mysql控制台,将之前容器中mysql配置文件mysqld.cnf放入虚拟机本地建立的文件目录下,然后在 [mysqld]下面添加 sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,并保存
mysqld.cnf配置文件
然后切换到命令行,输入exit退出容器,停止并删除mysql-5.7容器
docker stop mysql-5.7
docker rm mysql-5.7
mkdir /docker
mkdir /docker/mysql
mkdir /docker/mysql/conf
mkdir /docker/mysql/data
创建mysql.cnf配置文件
touch /docker/mysql/conf/mysqld.cnf
进入mysqld.cnf配置文件进行修改
辅助工具方式 :如Xftp6+Notepad++(FTP插件)等工具,此处不做过多赘述。
(2)创建并启动容器
docker run --name mysql-5.7 --privileged=true -p 3307:3306 -v /docker/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
参数说明:
--privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
-v /docker/mysql/conf/mysql.cnf:mysql.conf.d/mysqld.cnf:映射配置文件
-v /docker/mysql/data:/var/lib/mysql:映射存储数据目录
docker exec -it mysql-5.7 /bin/bash
mysql -u root -p 123456
show variables like '%sql_mode';
可以看到修改成功
13. 可以看到修改成功后,再将准备好的sql导入数据库,没有报错,成功导入。
如果我们直接拉取mysql-5.6版本镜像,并创建容器,此时不会出现该问题。
因为mysql-5.6的配置文件中sql_mode没有进行设置:
5.6可以正常运行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。