背景
以前mysql的相关问题较散, 自此以后小问题均聚合到该文进行记录.
问题
1. v5.7.5后, group by报错问题
问题描述
升级mysql后, 之前的sql语句报错, 报错信息如下:
1 | ERROR 1055 (42000): Expression #1 of SELECT name is not in GROUP BY clause and contains nonaggregated column 'database.user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by |
经查询是由于5.7.5后的版本, sql_mode默认增加了ONLY_FULL_GROUP_BY
, 该模式的作用如下:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。
查询指令
- 查询版本: select version();
- 查询global sql_mode: select @@GLOBAL.sql_mode;
- 查询session sql_mode: select @@SESSION.sql_mode;
解决方案
立即生效, 重启后消失
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
重启后生效
1 | vim my.cnf |
2. too many connections异常
mysql的当前连接数超过了允许的最大连接数.
解决方案
- 编辑
/etc/my.conf
文件, 在节点[mysqld]
下增加如下内容max_connections = 500
max_user_connections = 500
- 重启mysql
- service mysqld restart
- 查看当前连接数
- show processlist;
- 查看连接配置是否生效
- show variables like ‘%connect%’;
3. ERROR 1018 (HY000): Can’t read dir of ‘./user_database/‘ (errno: 13 - Permission denied)
当前操作数据库的用户和创建该数据库的用户不匹配.
解决方案
- 切换到目录
/var/lib/mysql
- 修改对应db的目录(假设mysql由用户
mysql
启动)- 修改目录所属用户:
chown -R mysql user_database
- 修改目录所属组:
chgrp -R mysql user_database
- 修改目录所属用户:
4. 5.7.18以后, 安装mysql后没有默认的my.cnf配置文件
MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
5. Table is marked as crashed and should be repaired
由于频繁操作表,其索引或文件出现异常
解决方案
REPAIR TABLE `<table name>`;