Mysql 报错合集

错误:
    [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column list which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
问题描述:
    在把MySQL升级到5.7或者更高的版本,一些以前看上去不会出错的group by 操作在这个版本以后就会出现语法报错的情况,在这个模式下,使用分组查询时,出现在select字段后面的只能是group by后面的分组字段,或使用聚合函数包裹着的字段。对于语义限制都比较严谨的多家数据库,如SQLServer、Oracled等,都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会报错的,所以从MySQL 5.7版本开始修正了这个语义,也就是ONLY_FULL_GROUP_BY语义。
解决:
    set @@GLOBAL.sql_mode='';
    set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义
补充:
    any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
    在select时对不确定的字段添加any_value()即可,例:select id,any_value(code) form table
错误:
    You can't specify target table '<table>' for update in FROM clause
说明:
    在同一语句中,不能先select出同一表中的某些值,再update这个表
案例:
    # 会员动态轮播至少显示5篇,因为过期不足5篇时,恢复最近的过期文章补足5篇
    UPDATE cms_article_list
    SET is_valid = 1
    	WHERE (
    		-> SELECT num from (
    			SELECT count(*) as num FROM cms_article_list 
    				WHERE UNIX_TIMESTAMP()-180*24*60*60 < article_create_time 
    					AND restore != 1 
    					AND article_type = 0
    					AND article_status = 1
    					AND column_id = 19
    					AND article_thumb != ''
    		-> ) AS nt
    	) = 0
    		AND restore != 1 
    		AND article_type = 0
    		AND article_status = 1
    		AND column_id = 19
    		AND article_thumb != ''
    ORDER BY article_id DESC
    LIMIT 5;
解决:需要添加 -> 标注的代码
    也就是说将select出的结果再通过中间表(要为中间表取个别名否则报错)select一遍
    这个问题只出现于mysql,mssql和oracle不会出现
错误:
    Table 'performance_schema.session_variables' doesn't exist
说明:
    MySQL 5.5新增一个存储引擎:命名PERFORMANCE_SCHEMA ,主要用于收集数据库服务器性能参数。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表
    performance_schema提供以下功能:
    1.提供进程等待的详细信息,包括锁、互斥变量、文件信息;
    2.保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;
    3.对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)
解决:
    mysql_upgrade -uroot -p
    service mysql restart
错误:
    Native table 'performance_schema'.'session_variables' has the wrong structure
说明:
    --从mysql5.7.6开始information_schema.global_status已经开始被舍弃,
    为了兼容性,此时需要打开 show_compatibility_56
解决:
    set @@global.show_compatibility_56=ON;
错误:
    Access denied for user ''@'localhost' to database 'mysql'
说明:
    因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿名登录的
解决:
    使用 mysql -p 127.0.0.1 -uroot 登陆
    delete from user where USER='';
    FLUSH PRIVILEGES;
补充:
    修改密码
    update user set password=PASSWORD("自定义用户密码") where User='root';
错误:
    Can't connect to MySQL server on 'X.X.X.X'  (110)
解决:
    netstat -petulan 查看 端口情况 发现mysql监听在tcp6上
    在etc/my.cnf中mysqld下面添加bind-address=0.0.0.0 
    重新启动mysql服务 systemctl restart mysql
    正常监听tcp地址
    最后发现是/etc/sysconfig/iptables 文件中有这一条数据
    -A INPUT -p tcp -m tcp --dport 3306 -j DROP
    改成
    -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
    重启一下
    systemctl restart iptables
    就好了
    关键是关闭防火墙居然没有用???
错误:
    Can't lock file (errno: 165 - Table is read only)
解决:
    修改配置文件:
    ./mysqladmin flush-tables
    ./mysqladmin flush-logs   //清洗掉日志
    ./mysqlcheck -A // 优化表
    
    修改:my.ini
    innodb_force_recovery=0 启动时 不做日志处理
    重新启动mysql
    
    DB 在innodb_force_recovery大于0时阻止INSERT,UPDATE或DELETE操作。
    对于MySQL5.6.15,将innodb_force_recovery设为4或更高会让InnoDB处于只读模式
    
    问题:
       1、innodb 引擎故障
       2、服务器不正常重启,导致数据没有日志文件完整性错误;
       3、系统启动后就回去读日志试图恢复,然后就锁死了表;
    注意:
       1、尽量不要用kill 方式关闭mysql
       2、可以用这个命令关闭: ./mysqladmin -shutdow  或者 service mysqld restart/stop/start

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值