MySql问题集锦

背景

以前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
2
3
vim my.cnf
# 找到[mysqld]和[mysql]节点, 在其下添加如下语句
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

2. too many connections异常

mysql的当前连接数超过了允许的最大连接数.

解决方案

  1. 编辑/etc/my.conf文件, 在节点[mysqld]下增加如下内容
    • max_connections = 500
    • max_user_connections = 500
  2. 重启mysql
    • service mysqld restart
  3. 查看当前连接数
    • show processlist;
  4. 查看连接配置是否生效
    • show variables like ‘%connect%’;

3. ERROR 1018 (HY000): Can’t read dir of ‘./user_database/‘ (errno: 13 - Permission denied)

当前操作数据库的用户和创建该数据库的用户不匹配.

解决方案

  1. 切换到目录/var/lib/mysql
  2. 修改对应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>`;

参考资料

转载

本文出自<<arccode>>, 欢迎转载, 转载请注明出处.