MySQL数据库(八)_用户管理

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

MySQL用户和权限管理

  1. 元数据数据库:mysql
  2. 系统授权表:
    db, host, user
    columns_priv, tables_priv, procs_priv, proxies_priv
  3. 用户账号:
    ‘USERNAME’@‘HOST’
    @‘HOST’:
  4. 主机名
    IP地址或Network
    通配符: % _
    示例:172.16.%.%
  5. 查看系统账户
MariaDB [(none)]> SELECT user,host,password from mysql.user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          |
| root | localhost.localdomain |          |
| root | 127.0.0.1             |          |
| root | ::1                   |          |
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+

用户管理

  1. 创建用户:CREATE USER
    默认权限:USAGE
#CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
CREATE USER 'chen'@'%' IDENTIFIED BY 'centos';
  1. 用户重命名:RENAME USER
#RENAME USER old_user_name TO new_user_name;
RENAME USER chen to wang ;
  1. 删除用户:
DROP USER 'USERNAME'@'HOST'

#删除默认的空用户
DROP USER ''@'localhost';

#示例:
DROP USER wang;
  1. 修改密码:
#方法1
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');

#方法2
UPDATE mysql.user SET password=PASSWORD('password') WHERE *;
FLUSH PRIVILEGES;

#方法3
mysqladmin -u root -poldpass password 'newpass'

#示例:
SET PASSWORD FOR chen = PASSWORD('chen');
  • 忘记管理员密码的解决办法:

    1. 启动mysqld进程前,添加这2条配置
    vim /etc/my.cnf
        skip-grant-tables   #忽略授权表
        skip-networking     #禁止网络连接
    
    #启动服务
    service mysqld restart
    
    1. 使用UPDATE命令修改管理员密码
    mysql> UPDATE mysql.user SET password=password('你的密码') where user='root';
    
    1. 关闭mysqld进程,移除上述两个选项,重启mysqld
  • 关闭名字解析

vim /etc/my.cnf
    skip_name_resolve=on

授权

MySQL权限管理

权限类别:管理类、程序类、数据库级别、表级别、字段级别

管理类 程序类 库和表级别 数据操作 字段级别 所有权限
CREATE TEMPORARY TABLES FUNCTION DATABASE SELECT SELECT(col1,col2,…) ALL
CREATE USER PROCEDURE TABLE INSERT UPDATE(col1,col2,…)
FILE TRIGGER ALTER DELETE INSERT(col1,col2,…)
SUPER CREATE CREATE UPDATE
SHOW DATABASES ALTER CREATE VIEW
RELOAD DROP DROP
SHUTDOWN EXCUTE INDEX
REPLICATION SLAVE SHOW VIEW
REPLICATION CLIENT GRANT OPTION

能将自己获得的权限转赠给其他用户

LOCK TABLES
PROCESS

GRANT

参考:https://dev.mysql.com/doc/refman/5.7/en/grant.html

  1. 查看权限
MariaDB [test2]> show grants for chen\G
*************************** 1. row ***************************
Grants for chen@%: GRANT USAGE ON *.* TO 'chen'@'%' IDENTIFIED BY PASSWORD '*128977E278358FF80A246B5046F51043A2B1FCED'
1 row in set (0.000 sec)

我们可以看到,刚创建的用户有USAGE权限,而这个其实是没有什么权限的,因此表示该用户在所有表上没有权限。

  1. 格式
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
priv_type: ALL [PRIVILEGES]
object_type:TABLE | FUNCTION | PROCEDURE
priv_level: *(所有库) | *.* | db_name.* | db_name.tbl_name | tbl_name(当前库的表) | db_name.routine_name(指定库的函数,存储过程,触发器)
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
  1. 授权示例:
#GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';

GRANT ALL ON hellodb.* TO test@'192.168.99.%' identified by 'centos'
  1. 回收授权
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...

示例:

REVOKE DELETE ON testdb.* FROM 'testuser'@'172.16.0.%';
  1. 查看指定用户获得的授权
#查看帮助
Help SHOW GRANTS
#查看指定权限
SHOW GRANTS FOR 'user'@'host';
#查看当前用户权限
SHOW GRANTS FOR CURRENT_USER;

注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存
(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
(2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;


其它章节
MySQL数据库(一)_基础概念
MySQL数据库(二)_SQL基础与数据类型
MySQL数据库(三)_SQL语句之DDL
MySQL数据库(四)_SQL语句之DML
MySQL数据库(五)_SQL语句之DQL
MySQL数据库(六)_SQL语句之JOIN
MySQL数据库(七)_视图、函数、储存过程及触发器
MySQL数据库(八)_用户管理
MySQL数据库(九)_存储引擎
MySQL数据库(十)_服务器配置
MySQL数据库(十一)_查询缓存
MySQL数据库(十二)_索引
MySQL数据库(十三)_事务与锁

猜你喜欢

转载自blog.csdn.net/weixin_42758707/article/details/95064890