docker compose 安装mysql后group by使用不了,提示'this is incompatible with sql_mode=only_full_group_by'
本人出现问题的mysql版本是8.x,但是所有出现这种问题的mysql一下的解决方法是通用的
问题出现的原因:
默认情况下,MySQL镜像中的sql_mode含有only_full_group_by,如果MySQL启用了only_full_group_by SQL模式的话,MySQL将拒绝选择列表,即不能使用group by
查看SQL模式可用下面这条SQL:
select @@global.sql_mode
注意:网上有方法说是直接在连接工具里执行以下SQL进行设,只能暂时的临时修改,mysql重启后就得重新进行配置,弄得人很不舒服
set @@global.sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;
于是咱们就将mysql的cnf配置文件在docker-compose文件映射上去
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
如果是个新容器有概率会启动成功,但是如果你是个旧容器,这个时候大概率会映射配置失败一下信息(但是会启动成功),容器内mysql的警告信息如下:
[Warning] World-writable config file ‘/etc/mysql/conf.d/mysql.cnf’ is ignored.
原因是:Mysql 的配置文件因为读写权限不安全(竟然是完全的读-写-执行权限)被 Mysql 的安全机制忽了,进而导致我的配置设置没生效。
在docker-compose文件中添加如下:
command: > bash -c "chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld"
完整的docker-compose文件:
# 可参考: https://hub.docker.com/_/mysql version: '3' services: mysql: image: mysql:8.0 # 原镜像`mysql:8.0` container_name: mysql # 容器名为'mysql8.0' restart: always # 指定容器退出后的重启策略为始终重启 command: > bash -c "chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld" volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录 - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf - ./data:/var/lib/mysql environment: # 设置环境变量,相当于docker run命令中的-e TZ: Asia/Shanghai LANG: en_US.UTF-8 MYSQL_ROOT_PASSWORD: root # 设置root用户密码 ports: # 映射端口 - "3306:3306"
完整的mysql.cnf:
# 服务端参数配置 [mysqld] user=mysql # MySQL启动用户,如果是已经使用过且有自己的数据库,需要把当前注释掉,否则会启动失败 default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎 character-set-server=utf8mb4 # 设置mysql服务端默认字符集 collation-server = utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应 pid-file = /var/lib/mysql/mysqld.pid # pid文件所在目录 socket = /var/lib/mysql/mysqld.sock # 用于本地连接的socket套接字 datadir = /var/lib/mysql # 数据文件存放的目录 log-error = /var/lib/mysql/error.log #bind-address = 127.0.0.1 # MySQL绑定IP expire_logs_days=7 # 定义清除过期日志的时间(这里设置为7天) # 设置client连接mysql时的字符集,防止乱码 init_connect='SET NAMES utf8mb4' # 是否对sql语句大小写敏感,1表示不敏感 lower_case_table_names = 1 # 执行sql的模式,规定了sql的安全等级, 暂时屏蔽,my.cnf文件中配置报错 sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能) transaction_isolation = READ-COMMITTED # TIMESTAMP如果没有显示声明NOT NULL,允许NULL值 explicit_defaults_for_timestamp = true #它控制着mysqld进程能使用的最大文件描述(FD)符数量。 #需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量 open_files_limit = 65535 # 允许最大连接数 max_connections=200 #最大错误连接数 max_connect_errors = 600 [client] default-character-set=utf8mb4 # 设置mysql客户端默认字符集
附·参考资料: