Mysql Errors

Mysql Errors

1 ERROR 1044

1.1 42000

  • 错误信息

    MariaDB [mysql]>  grant select on information_schema.* to 'test'@'%';
    ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
    
  • 原因

    information_schema是一个视图库,里面所有对象都是以视图的形式存在的,而且是在实例启动时自动加载和创建的。 Mariadb 不允许 对该库进行任何的操作。

  • 解决

    对于information_schema库的问题,我们可以针对其源表进行授权 。informat_schema库的源表是 mysql库。只要 让test用户拥有查询mysql库的权限,自然就可以查询information_schema库了。

    grant select on mysql.* to 'test'@'%';
    

2 ERROR 1045

2.1 28000

2.1.1 无登录权限

  • 错误信息

    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    

    在有些情况下,mysql 使用root 用户登录时,会出现这种情况。具体原因不明。咱不会读源码, 不然这个问题一定给它搞清楚。蛋疼。

  • 解决方法 解决这个问题的方法,不同的版本中操作方法也不一样。主要是通过修改mysql.user 中保存的密码 , 但是不同的版本还会有些小的区别,早期版本,只要更新mysql.user表就可以,但是mysql 5.6 / 5.7,除了手动更新mysql.user,还要另外执行一个操作。下面是主要操作流程:

    # 修改参数实现免认证登录数据库
    将/etc/my.cnf 中的[mysqld] 下面加上一行skip-grant-tables,保存退出编译文件。
    
    # 重启mysql,不同版本的操作系统中命令不一样,此处以CentOS 7 为例
    systemctl restart mysqld
    
    # 手动更新mysql.user.authentication_string 或者 mysql.user.password 字段
    update mysql.user set authentication_string=password('您的密码') where user='root';
    flush privileges;
    
    # 5.5 之前的版本中,到这一步,再重启Mysql,就可以了。但是5.6、5.7以后还要额外操作:
    # 关闭mysql
    systemctl stop mysqld
    
    # 取消免密登录,修改/etc/my.cnf 将skip-grant-tables 参数注释或者删除。
    
    # 编译文件initfile.txt,在文件中添加如下一句SQL:
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('密码');
    
    # 启动mysql 指定--init-file参数,参数值即在上一步中编译的文件名,在启动时执行脚本中的命令
    # 如果不通过这种方式,会遇到
    mysqld --init-file=initfile.txt
    
    # 重启mysql
    systemctl restart mysqld
    
    

2.1.2 无文件访问权限

  • 错误信息
MySQL [ypsx_order0]> select * into outfile '/tmp/a.xls' from order0;
ERROR 1045 (28000): Access denied for user 'order_read'@'%' (using password: YES)

当将一张表中的数据通过 select outfile 方式将数据备份至文件系统时出现。

  • 分析原因

其实这个问题也并没有跳出圈外。仍旧是权限问题,只不过是是否有访问文件的权限。 Mysql.user表中列出了一个用户所可以拥有的所有权限,其中包含一个 File_Priv 字段,这个字段代表用户是否有写文件的权限。只有拥有这个权限,才有可能进行下一 步–> 写文件,当然写文件前还要判断Mysql用户是否有文件路径有写权限等。

  • 解决方法

    update mysql.user set File_priv=’Y’ where user=’xxxx’;
    

3 ERROR 1055

  • 错误信息

    [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column
    'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause;
    this is incompatible with sql_mode=only_full_group_by
    
  • 原因分析
    Mysql 中的SQL 语法并是严格按照SQL 95 标准的。在聚合操作时,group by 允许不包含所有select的非聚合 列. mysql 提供了一个参数可以使SQL 严格按照SQL 95标准编写,但是同时此参数是存在缺陷的。一些delete 等非聚合操作,从java 客户端发起时,有可能会引起错误:[err] 1055.
  • 解决方案
    简单的解决方案就是取消此参数设置。参数的设置方法如下:

    # 临时调整
    set @@sql_mode='参数列表,以逗号分隔'
    或者
    set global sql_mode='参数列表,以逗号分隔'
    # 永久调整  修改参数配置文件my.cnf
    sql_mode = '参数列表,不同参数之间以逗号分隔'
    
  • 操作示例
    在Mysql 里大部分的参数是分为全局和会话级别,全局分为临时与永久。一般临时调整就是通过set 命令调整。 全局调整,需要在参数文件中修改, 一般为/etc/my.cnf
    • 临时修改示例

      mysql> 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';
      Query OK, 0 rows affected (0.00 sec)
      mysql> exit
      Bye
      [root@test ~]# mysql -D
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A
      
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 1814164
      Server version: 5.7.17 MySQL Community Server (GPL)
      
      Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
      
      Oracle is a registered trademark of Oracle Corporation and/or its
      affiliates. Other names may be trademarks of their respective
      owners.
      
      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      
      mysql> select @@sql_mode;
      +------------------------------------------------------------------------------------------------------------------------+
      | @@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 row in set (0.00 sec)
      
    • 永久修改示例

      # 修改之前
      sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
      # 修改之后
      sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
      

4 ERROR 1201

  • error code:ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
  • Reason:

      出现这个问题的原因是之前曾做过主从复制!需要reset slave后再change
    
  • Solve:

    reset slave;
    

5 ERROR 1292

5.1 22007

  • 错误信息

    ERROR 1292 (22007): Truncated incorrect DOUBLE value: ''
    
  • 分析

    该错误是由于 MySQL 对字符值是否符合字段要求进行了严格的检查,但是有时候,这个 检查的结果却是错误的。就像下面示例:

    MariaDB [(none)]> update test.test set status=NULL where status=6;
    
    ERROR 1292 (22007): Truncated incorrect DOUBLE value: ''
    
    MariaDB [(none)]> desc test.test;
    +---------------------+--------------+------+-----+---------+----------------+
    | Field               | Type         | Null | Key | Default | Extra          |
    +---------------------+--------------+------+-----+---------+----------------+
    | id                  | bigint(20)   | NO   | PRI | NULL    | auto_increment |
    | status              | varchar(30)  | YES  |     | NULL    |                |
    +---------------------+--------------+------+-----+---------+----------------+
    2 rows in set (0.02 sec)
    

    从上面的查询结果来看,status 字段允许为空, 默认为空。我将该字段值更新为空字段并 没有违反该字段的约束条件。但是,错误就是么离奇的发生了。明明没有问题,却提示为错误 数据。

  • 查看SQL_MODE

      MariaDB [(none)]> show variables like 'sql_mode';
    +---------------+-------------------------------------------------------------------------------------------+
    | Variable_name | Value                                                                                     |
    +---------------+-------------------------------------------------------------------------------------------+
    | sql_mode      | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +---------------+-------------------------------------------------------------------------------------------+
    
  • 解决 主要是把sql_mode中的strict_trans_tables去掉即可。

    set [global | session] variables sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    

6 ERROR 1548

错误信息:

Cannot load from mysql.proc. The table is probably corrupted.

内部表结构不对。需要升级更新:

mysql_upgrade -uroot -p

7 ERROR 1872

7.1 错误信息

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

7.2 分析原因

  1. 配置了参数 log_slave_updates . 配置此参数后, 数据库相应的需要生成中继日志,如果没有配置,则不会生成,也就是说,log_slave_updates 依赖于relay_log。
    因此,在这种情况下,要求 配置relay_log 参数
  2. master.info 文件中的信息有误
  3. slave 信息变动 slave 信息发生变动,使用reset slave. 但是内存中的信息没有被清空。要清空内存与配置中的信息,需要执行reset slave all;
  4. …. 未知.

8 ERROR 2003

  • error code:ERROR 2003 (HY000): Can't connect to MySQL server on 'ip_address' (111)
  • Reason:

9 ERROR 2013

  • error code: mysqldump: Error 2013: Lost connection to MySQL server …..
  • Reason:

    mysqldump来不及接受mysql server端发送过来的数据,Server端的数据就会积压在内存中等待发送,
    这个等待不是无限期的,当Server的等待时间超过net_write_timeout(默认是60秒)时它就失去了耐心,
    mysqldump的连接会被断开,同时抛出错误Got error: 2013: Lost connection.
    
    增加net_write_timeout可以解决上述的问题的。在实践中发现,在增大 net_write_timeout后,
    Server端会消耗更多的内存,有时甚至会导致swap的使用(并不确定是不是修改 net_write_timeout所至)。
    建议在mysqldump之前修改net_write_timeout为一个较大的值(如1800),在 mysqldump结束后,
    在将这个值修改到默认的60。
    
  • solve:

    在sql命令行里面设置临时全局生效用类似如下命令:
    SET GLOBAL net_write_timeout=1800;
    

Author: halberd

Created: 2019-07-18 Thu 18:18

Validate

猜你喜欢

转载自www.cnblogs.com/halberd-lee/p/11209123.html
今日推荐