关于MySql异常 Access denied for user 'xx'@'yy'的复盘

本文转载自:http://static.helloworld114.com/pages/exception/5.html

中文解释

用户访问被拒绝

变种形式

1、#mysql -u root -p

Enter password: ************

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

注意:'root'@'localhost'默认是无限制的,这里出现拒绝访问很可能是root密码输入错误

 

2、#mysql -h 192.168.1.1 -u root

ERROR 1045 (28000): Access denied for user 'root'@'192.168.1.1' (using password: NO)

 

3、#mysql -h 192.168.1.201 -u 用户名 -p

Enter password: ************

ERROR 1130 (HY000): Host 'xx' is not allowed to connect to this MySQL server

 

4、#jdbc或者odbc连接异常

Access denied for user 'xx'@'你的客户端ip地址' to database 'yy'

变种可能还有其他的形式,这里不一一列举了,总之,出现这种用户拒绝访问的问题,都可以按照这个思路进行分析。

原因分析

MYSQL是一个多用户的数据库,MYSQL的用户可以分为两大类:

(1)超级管理员用户(root),拥有全部权限

(2)普通用户,由root创建,普通用户只拥有root所分配的权限

上面出现的用户无法访问数据库,无非是用户的权限不足,或者权限设置不当导致的。下面我们列出一份运行正常的数据库创建和权限分配流程,大家可以对照一下,很容易就可以找到自己的问题所在:

1、root用户登录到数据库管理命令行操作界面

#mysql -u root –p(密码登录)

或者

#mysql -u root(无密码登录)

2、创建一个测试数据库mytest

create database mytest character set 'utf8' collate 'utf8_general_ci';

//验证数据库是否已经存在

show databases;

3、创建一个可以操作mytest数据库的用户test

grant all privileges on mytest.* to 'test'@'%'  identified by 'test'  with grant option ;

//验证权限信息是否已经存在

show grants for test;

4、刷新权限,立即生效

flush privileges;

5、设置与数据库对应的编码,解决中文乱码问题

SET character_set_client='utf8'; 

SET character_set_connection='utf8'; 

SET character_set_results='utf8';

SET character_set_server='utf8';

//设置后需要重新进入mysql命令工具才能解决中文乱码

6、重新连接验证

数据库连接url:jdbc:mysql://ip:3306/mytest?useUnicode=true&characterEncoding=utf8

  • test/test
  • ok,更多关于权限控制的细节,可以参考下面的参考资料。

参考资料

用户创建

CREATE USER ‘用户名称’

CREATE USER ‘用户名称’ [@’主机名称’]

CREATE USER ‘用户名称’ [@’主机名称’] [INDENTIFIED BY ‘用户密码’]

//验证用户创建是否成功:

mysql> SELECT user ,host FROM mysql.user;

 

修改用户密码

1、ROOT用户、普通用户修改自己的密码

SET PASSWORD=PASSWORD('新密码');

2、ROOT 用户为其他用户修改密码:

SET PASSWORD FOR '用户名称' @'主机名称' =password('新密码');

注意:PASSWORD函数,用于把密码明文进行加密,所得到的密码为原密码的哈希值。

 

用户授权

GRANT是用来给用户授权的,但是也可以用来创建用户,GRANT在给用户进行授权的时候,如果用户是不存在的,那么GRANT会自动创建这个用户,然后再给这个用户进行授权。

grant 权限 on 数据库.表 to '用户名'@'登录主机'  [INDENTIFIED BY '用户密码'];

可用的权限如下:

select,update,delete,insert(表数据)、

create,alert,drop(表结构)、references(外键)、

create temporary tables(创建临时表)、index(操作索引)、

create view,show view(视图)、

create routine,alert routine,execute(存储过程)、

all,all privileges(所有权限)

数据库:数据库名或者*(所有数据库)

表:表名或者*(某数据库下所有表),*.*表示所有数据库的所有表

主机:主机名或者%(任何其他主机)

例:grant selec,insert,update,delete on *.* to 'jifei'@'%';

GRANT SELECT ON *.* TO 'user4' @'localhost' IDENTIFIED BY '123333';

为用户授予指定数据库、指定表、指定列的权限:

GRANT UPDATE(cid,cname) ON mysqlpart2.custom TO 'user3'@'localhost';

 

撤销权限 

REVOKE 权限 ON 数据库.表 FROM  '用户名'@'登录主机; 

说明:赋权与撤销权限的区别,就是REVOKE是将to改为from 

例:revoke all on *.* from  ‘jifei’  @’%’; 

REVOKE UPDATE(cid,cname) ON mysqlpart2.custom FROM 'user3'@'localhost';

 

查看权限 

SHOW GRANTS;//自己

SHOW GRANTS FOR  用户名称@主机名称;

 

CREATE USER 与 GRANT 两种方式创建用户的区别

(1)CREATE USER 创建用户的优点:语法简单

(2)CREATE USER 创建用户的不足:用户无权限

(3)GRANT 创建用户的优势:创建的用户有权限

(4)GRANT 创建用户的不足:语法较CREATE USER 繁琐

 

关于直接操作后台表与使用命令行操作的说明

用户创建或者修改权限可以通过操作后台表进行,但是这样一来容易让问题变得复杂所以不推荐使用这种方式来创建用户。个人觉得掌握命令行这种方式已经可以很好的完成需要的工作了。


本文转载自:http://static.helloworld114.com/pages/exception/5.html

你可能感兴趣的:(异常方案)