# docker 中下载 mysql (8.3.0)
可以尝试拉取:docker pull mysql:5.7.44
docker pull mysql (会拉取最新稳定版)
#启动并初始化密码
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456! -d mysql
#进入容器
docker exec -it mysql bash
#登录mysql
mysql -u root -p
录入密码:123456!
#进入到mysql内部,修改原密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456!';
#添加远程登录用户
CREATE USER 'humx'@'%' IDENTIFIED WITH mysql_native_password BY '123456!';
GRANT ALL PRIVILEGES ON *.* TO 'humx'@'%';
至此MySQL安装完成,但是本地直接使用mysql命令连接是不行的,应该mysql是安装在容器中,需要通过
navicat等工具远程连接即可;其他版本的安装,指定具体的mysql的镜像版本号就行;
也可以搜索其他版本:docker search mysql
安装完后,想从MySQL5.7 迁移数据 到MySQL8.0 ,会报如下格式错误;
解决方案:这个错误通常出现于数据库表迁移或创建的过程中,是因为 ‘created_at’ 字段的默认值不符合数据库引擎的规定。在 MySQL 5.7 之后,数据库默认配置的 sql_mode 中包含了 NO_ZERO_IN_DATE 和 NO_ZERO_DATE 模式,这会导致对于日期字段的默认值要求更为严格。
select VERSION();
5.7.42-log
# (1)修改sql_mode
show variables like 'sql_mode' ;
test-data:STRICT_TRANS_TABLES
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
#(2)修改出错的表的值对应的默认值
a.针对 created_at,修改后如下:
- `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '日志生成时间',
b.或者 deleted_at,login_time,默认值需要为空的情况,如下:
- `login_time` timestamp NULL DEFAULT NULL COMMENT '登录时间',
c.或者datetime和date类型的
- `expiration_date` date NOT NULL COMMENT '数据有效截止日期',
- `deleted_time` datetime DEFAULT NULL COMMENT '逻辑删除时间',
操作示例:
ALTER TABLE `gkb_admin_log` MODIFY created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '日志生成时间';
ALTER TABLE `gkb_partner` MODIFY service_starttime datetime DEFAULT NULL COMMENT '合同开始时间';