zoukankan      html  css  js  c++  java
  • MySQL用户与权限管理

    执行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;
  • 相关阅读:
    a sample of if_nametoindex
    ssh 报 You don't exist, go away
    VMware网卡类型说明及修改
    warning: dereferencing typepunned pointer will break strictaliasing rules(20120613 13:11:02)
    关于字节序和比特序 Little Endian Big Endian
    C语言 运行codeblocks 没有反应
    邻接矩阵作为主要存储结构
    菜鸟学习 MFC
    中国特色工作流引擎设计考虑因素
    如何实现通过汉字的拼音或首拼快速检索(含部分源码)
  • 原文地址:https://www.cnblogs.com/qmfsun/p/4846470.html
Copyright © 2011-2022 走看看