执行mysql select 查询报错:

SELECT command denied to user 'root'@'localhost' for table "xxx"

问题原因:

权限不足,

解决方法:

还是数据库权限的问题,不知道为啥赋给了所有权限后还是有各种权限问题,看来有空得整理一下mysql所有相关权限的问题了...

下面才是解决这个select权限的方法:

========对于ROOT用户的密码操作(更改用户密码)========

刚刚安装完的Mysql,只一有个root用户,密码为空,而且只能在本机登录!

为root加上密码xxx123:
./bin/mysqladmin
-u root password xxx123
或写成
./bin/mysqladmin
-uroot password xxx123

加下密码之后,在本进行进入mysql:
./bin/mysql
-uroot -p

更改root的密码由xxx123改为yy1234:
./bin/mysqladmin -uroot -pxxx123 password yy1234

=======grant 权限 on 数据库对象 to
用户
==========
MySQL 赋予用户权限命令的简单格式可概括为:
grant 权限 on 数据库对象 to 用户

grant 权限 on 数据库对象 to 用户 identified by
"密码"

========用户及权限管理:最常用操作实例========
(用户名:dba1,密码:dbapasswd,登录IP:192.168.0.10)

//开放管理MySQL中所有数据库的权限
grant all on *.* to
dba1@'192.168.0.10'identified by "dbapasswd";

//开放管理MySQL中具体数据库(testdb)的权限
grant all privileges on
testdb to dba1@'192.168.0.10'identified by "dbapasswd";

grant all on
testdb to dba1@'192.168.0.10'identified by "dbapasswd";

//开放管理MySQL中具体数据库的表(testdb.table1)的权限
grant all on
testdb.teable1 to dba1@'192.168.0.10'identified by "dbapasswd";

//开放管理MySQL中具体数据库的表(testdb.table1)的部分列的权限
grant
select(id, se, rank) on testdb.table1 to ba1@'192.168.0.10'identified by
"dbapasswd";

//开放管理操作指令
grant select, insert, update, delete on
testdb.* to dba1@'192.168.0.10'identified by "dbapasswd";

//回收权限
revoke all on *.* from dba1@localhost;

//查看 MySQL 用户权限

show grants;
show grants for dba1@localhost;

========用户及权限管理:更多更详细实例========

下面用实例来进行说明:

一、grant普通数据用户(test1),查询、插入、更新、删除 数据库(test)中所有表数据的权利。

grant select on test.* to test1@'%';
grant insert on test.* to
test1@'%';
grant update on test.* to test1@'%';
grant delete on test.* to
test1@'%';

或者,用一条 MySQL 命令来替代:
grant select, insert, update, delete on test.* to
test1@'%';

二、grant数据库开发人员(duser),创建表、索引、视图、存储过程、函数。。。等权限。

grant创建、修改、删除 MySQL 数据表结构权限。

grant create on testdb.* to duser@'192.168.0.%';
grant alter on testdb.*
to duser@'192.168.0.%';
grant drop   on testdb.* to
duser@'192.168.0.%';

grant 操作 MySQL 外键权限。

grant references on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 临时表权限。

grant create temporary tables on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 索引权限。

grant index on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 视图、查看视图源代码 权限。

grant create view on testdb.* to duser@'192.168.0.%';
grant show   view
on testdb.* to duser@'192.168.0.%';

grant 操作 MySQL 存储过程、函数 权限。

grant create routine on testdb.* to duser@'192.168.0.%';

grant alter routine on testdb.* to duser@'192.168.0.%';

grant execute        on testdb.* to duser@'192.168.0.%';

三、grant 普通DBA管理某个MySQL数据库(test)的权限。

grant all privileges on test to dba@'localhost'

其中,关键字 “privileges” 可以省略。

四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on *.* to dba@'localhost'

五、MySQL grant 权限,分别可以作用在多个层次上。

1. grant 作用在整个 MySQL 服务器上:

grant select on *.* to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant
all    on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库

2. grant 作用在单个数据库上:

grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。

3. grant 作用在单个数据表上:

grant select, insert, update, delete on testdb.orders to
dba@localhost;

4. grant 作用在表中的列上:

grant select(id, se, rank) on testdb.apache_log to dba@localhost;

5. grant 作用在存储过程、函数上:

grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant
execute on function testdb.fn_add to 'dba'@'localhost'

六、查看 MySQL 用户权限

查看当前用户(自己)权限:

show grants;

查看其他 MySQL 用户权限:

show grants for dba@localhost;

七、撤销已经赋予给 MySQL 用户权限的权限。

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

grant all on *.* to  dba@localhost;
revoke all on *.* from
dba@localhost;

八、MySQL grant、revoke 用户权限注意事项

1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。

2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“

grant select on testdb.* to dba@localhost with grant option;

这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。

补充:

可以用 CREATE USER 或
GRANT 创建用户,后者还同时分配相关权限。而 REVOKE 则用于删除用户权限,DROP USER 删除账户。

$ mysql -u root -p
password: mysql> create database test; # 创建数据库
Query OK, 1 row affected (0.00 sec) mysql> show databases; # 查看数据库是否创建成功
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec) mysql> grant all on test.* to user1@'%' identified by '123456' with grant option; # 创建特权管理用户
Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; # 查看用户创建是否成功
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
5 rows in set (0.00 sec) mysql> show grants for user1; # 查看用户权限
+--------------------------------------------------------------------------------------------------+
| Grants for user1@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6BB...2CA2AD9'                        |
| GRANT ALL PRIVILEGES ON `test`.* TO 'user1'@'%' WITH GRANT OPTION                                |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

GRANT
语法:

GRANT privileges (columns)
  ON what
  TO user IDENTIFIED BY "password"
  WITH GRANT OPTION

权限列表:

  • ALTER: 修改表和索引。

  • CREATE: 创建数据库和表。

  • DELETE: 删除表中已有的记录。

  • DROP: 抛弃(删除)数据库和表。

  • INDEX: 创建或抛弃索引。

  • INSERT: 向表中插入新行。

  • REFERENCE: 未用。

  • SELECT: 检索表中的记录。

  • UPDATE: 修改现存表记录。

  • FILE: 读或写服务器上的文件。

  • PROCESS: 查看服务器中执行的线程信息或杀死线程。

  • RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

  • SHUTDOWN: 关闭服务器。

  • ALL: 所有权限,ALL PRIVILEGES同义词。

  • USAGE: 特殊的 "无权限" 权限。

用户账户包括 "username" 和 "host"
两部分,后者表示该用户被允许从何地接入。user1@'%' 表示任何地址,默认可以省略。还可以是
"user1@192.168.1.%"、"user1@%.abc.com" 等。数据库格式为 db@table,可以是 "test.*" 或
"*.*",前者表示 test 数据库的所有表,后者表示所有数据库的所有表。

子句 "WITH GRANT OPTION"
表示该用户可以为其他用户分配权限。

我们用 root 再创建几个用户,然后由 test 数据库的管理员 user1 为他们分配权限。

mysql> create user user2 identified by '123456', user3 identified by 'abcd';
Query OK, 0 rows affected (0.00 sec) mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user2            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
7 rows in set (0.00 sec)

好了,我们退出改用
user1 登录并针对 test 数据库进行操作。

mysql> quit # 退出
Bye $ mysql -u user1 -p123456 test # 使用新用户登录 mysql> select database(); # 确认当前工作数据库
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec) mysql> select current_user(); # 确认当前工作账户
+----------------+
| current_user() |
+----------------+
| user1@%        |
+----------------+
1 row in set (0.00 sec)

继续,创建一个数据表。

mysql> create table table1 # 创建表
  -> (
  ->  name varchar(50),
  ->  age integer
  -> );
Query OK, 0 rows affected (0.02 sec) mysql> show tables; # 查看表是否创建成功
+----------------+
| Tables_in_test |
+----------------+
| table1         |
+----------------+
1 row in set (0.00 sec) mysql> describe table1; # 查看表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec) mysql> insert into table1 values('Tom', 20); # 插入记录
Query OK, 1 row affected (0.00 sec) mysql> select * from table1; # 查询记录
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
+------+------+
1 row in set (0.00 sec)

接下来我们为 user2, user3 分配权限。

mysql> grant select on test.* to user2; # 为 user2 分配 SELECT 权限。
Query OK, 0 rows affected (0.00 sec) mysql> grant select on test.* to user3; # 为 user3 分配 SELECT 权限。
Query OK, 0 rows affected (0.00 sec) mysql> grant insert, update on test.* to user2; # 再为 user2 增加 INSERT, UPDATE 权限。
Query OK, 0 rows affected (0.00 sec)

好了,我们退出,切换成
user2 操作看看。

$ mysql -u user2 -p123456

mysql> use test; # 切换工作数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed mysql> select database(); # 验证当前工作数据库
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec) mysql> select user(); # 验证当前账户
+-----------------+
| user()          |
+-----------------+
| user2@localhost |
+-----------------+
1 row in set (0.00 sec) mysql> show grants for user2; # 查看当前用户权限,显然后来添加的 INSERT, UPDATE 被添加了。
+--------------------------------------------------------------------------------------------------+
| Grants for user2@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6BB837....2C9'                        |
| GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'user2'@'%'                                          |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

进行操作测试。

mysql> insert into table1 values("Jack", 21); # INSERT 操作成功
Query OK, 1 row affected (0.00 sec) mysql> update table1 set age=22 where name='Jack'; # UPDATE 操作成功
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0 mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec) mysql> delete from table1 where age=22; # DELETE 操作无权限
ERROR 1142 (42000): DELETE command denied to user 'user2'@'localhost' for table 'table1'

我们切换回
user1 管理账户,移除 user2 的 UPDATE 权限看看。

$ mysql -u user1 -p123456 test

mysql> revoke update on test.* from user2; # 移除 UPDATE 权限
Query OK, 0 rows affected (0.00 sec)

再次切换回
user2。

$ mysql -u user2 -p123456 test

mysql> show grants for user2; # UPDATE 权限被移除
+--------------------------------------------------------------------------------------------------+
| Grants for user2@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6B...2AD9'                            |
| GRANT SELECT, INSERT ON `test`.* TO 'user2'@'%'                                                  |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec) mysql> update table1 set age=23 where name='Jack'; # 不在拥有 UPDATE 权限
ERROR 1142 (42000): UPDATE command denied to user 'user2'@'localhost' for table 'table1'

好了,到此我们基本完成了创建用户和分配权限的操作。接下来,我们回到
root 进行修改用户密码和删除用户操作。

$ mysql -u root -p123456

mysql> set password for user3=password('abcabc'); # 修改用户 user3 密码
Query OK, 0 rows affected (0.00 sec) mysql>flush privileges; # 刷新权限表(通常只在直接修改相关管理数据表后需要该操作)
Query OK, 0 rows affected (0.00 sec) mysql> revoke all on *.* from user2; # 移除 user2 在所有数据库上的权限 
Query OK, 0 rows affected (0.00 sec) mysql> drop user user2; # 删除 user2 账户
Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; # 验证删除结果
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
6 rows in set (0.00 sec)

用户
user2 无法再次使用。

$ mysql -u user2 -p123456 test

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

试试
user3。

$ mysql -u user3 -pabc test # 连接失败!哦,对了,我们修改了密码。
ERROR 1045 (28000): Access denied for user 'user3'@'localhost' (using password: YES) $ mysql -u user3 -pabcabc test # 新密码成功 mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec)

要修改自己的密码直接执行
"set password = password('new_password');" 即可。

------- 摘要
--------------------------------------

创建用户:

GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
CREATE USER user2 IDENTIFIED BY 'password';

分配权限:

GRANT select ON testdb.* TO user2;

查看权限:

SHOW GRANTS FOR user1;

修改密码:

SET PASSWORD FOR user1 = PASSWORD('newpwd');
SET PASSWORD = PASSWORD('newpwd');

移除权限:

REVOKE all ON *.* FROM user1;

删除用户:

DROP USER user1;

数据库列表:

SHOW DATABASES;

数据表列表:

SHOW TABLES;

当前数据库:

SELECT DATABASE();

当前用户:

SELECT USER();

数据表结构:

DESCRIBE table1;

刷新权限:

FLUSH PRIVILEGES;

MySQL用户与权限管理的更多相关文章

  1. Mysql 用户,权限管理的几点理解。

    前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...

  2. mysql 用户及权限管理 小结

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  3. MySQL Study之--MySQL用户及权限管理

    MySQL Study之--MySQL用户及权限管理     MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...

  4. mysql用户和权限管理

    用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...

  5. Mysql 用户和权限管理

    用户和权限管理: 语法 grant 权限 on 数据库.数据表 to '用户' @ '主机名'; 例:给 xiaogang 分配所有的权限 grant all on *.* to 'xiaogang' ...

  6. MariaDB/MySQL用户和权限管理

    本文目录: 1.权限验证 1.1 权限表 1.2 图解认证和权限分配的两个阶段 1.3 权限生效时机 2.用户管理 2.1 创建用户 2.2 create user和alter user 2.3 记录 ...

  7. mysql用户与权限管理笔记

    今天想使用一下李刚那本书上的hibernate的Demo,试出了点问题,过程中就发现mysql的用户管理和权限管理上也有点东西要注意,所以顺便就写一下mysql用户管理和权限管理的笔记. 先说一说my ...

  8. (九)MySQL用户和权限管理

    (1)用户管理 1)登录和退出mysql 例: mysql -h192.168.111.150 -P3306 -uroot -predhat mysql -e 'select user,host,au ...

  9. MySQL 用户与权限管理

    MySQL权限系统的主要功能是证实连接到一台给定主机的用户,而且赋予该用户在数据库上的相关DML,DQL权限.MySQL存取控制包括2个阶段,一是server检查是否同意你连接:二是假定你能连接,se ...

随机推荐

  1. ASP.NET MVC学习笔记-----使用自定义的View Engine

    我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...

  2. jQuery 事件用法详解

    jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...

  3. JS代码的加载

    HTML页面中JS的加载原理:在加载HTML页面的时候,当浏览器遇到内嵌的JS代码时会停止处理页面,先执行JS代码,然后再继续解析和渲染页面.同样的情况也发生在外链的JS文件中,浏览器必须先花时间下载 ...

  4. 后台返回json数据,前台显示代码

    List list = "从DAL获取的数据集合" //取出分页标签html int pageIndex = context.Request["pageIndex&quo ...

  5. 再谈对协变和逆变的理解(Updated)

    去年写过一篇博客谈了下我自己对协变和逆变的理解,现在回头看发现当时还是太过“肤浅”,根本没理解.不久前还写过一篇“黑”Java泛型的博客,猛一回头又是“肤浅”,今天学习Java泛型的时候又看到了协变和 ...

  6. 360双击ctrl搜索可能会与firefox快捷键冲突

    最近使用火狐浏览器时有好几次要在网页上的对话框输入文字时出现问题,按下字母键直接跳出了firefox菜单选项,用鼠标重新定位到输入位置再打还是不行,照样会弹出菜单提示,如下图,这可能是有什么快捷键冲突 ...

  7. CocoStudio基础教程(4)骨骼动画的动态换肤

    1.概述 游戏中人物的状态会发生改变,而这种改变通常要通过局部的变化来表现出来.比如获得一件装备后人物形象的改变,或者战斗中武器.防具的损坏等.这些变化的实现就要通过动态换肤来实现. 2.运行到程序 ...

  8. 如何看K线图基础知识

    在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同而不同,比如你也可以在系统里把它们设为5.15.30.60均线. 你看K线图的上 ...

  9. Junit4.x扩展:运行指定方法

    相信很多道友搞开发的一般都会用到Junit单元测试工具,不知道大家有没有遇到一个这样的问题: 有的单元测试用例有很多@Test方法,甚至有的方法会执行很长时间,只能空等执行.而实际上我们只需要运行其中 ...

  10. [Effective JavaScript 笔记]第5章:数组和字典--个人总结

    前言 这节里其实一直都在讨论对象这个在js中的万能的数据结构.对象可以表式为多种的形式,表示为字典和数组之间的区别.更多的我觉得这章讨论多的是一些对应实现功能的相关操作,有可能出现的bug以及如何避免 ...