MySQL 用户管理和权限管理

1、用户管理

# 相关数据库和表
元数据数据库:mysql
系统授权表:db, host, user,columns_priv, tables_priv, procs_priv, proxies_priv
# 用户帐号
'USERNAME'@'HOST'

@'HOST': 主机名: user1@'web1.magedu.org'
IP地址或Network
 通配符: %   _
 示例: test@'172.16.%.%'
       test1@'192.168.1.%'
       test2@'10.0.0.0/255.255.0.0'
# 创建用户
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];

# 示例:
create user test@'10.0.0.0/255.255.255.0' identified by '123456';
create user test2@'10.0.0.%' identified by 123456;

# 新建用户的默认权限:USAGE

# 用户重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;

# 删除用户
DROP USER 'USERNAME'@'HOST'

# 删除默认的空用户

DROP USER ''@'localhost';
# 修改密码
# 新版mysql中用户密码可以保存在mysql.user表的authentication_string字段中
# 如果mysql.user表的authentication_string和password字段都保存密authentication_string优先生效

# 方法1,用户可以也可通过此方式修改自已的密码
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
# MySQL8.0 版本不支持此方法,因为password函数被取消
set password for root@'localhost'='123456' ;
# MySQL8.0版本支持此方法,此方式直接将密码123456加密后存放在mysql.user表的authentication_string字段


# 方法2
ALTER  USER test@'%' IDENTIFIED BY 'centos';
# 通用改密码方法, 用户可以也可通过此方式修改自已的密码,MySQL8 版本修改密码


# 方法3 此方式MySQL8.0不支持,因为password函数被取消
UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
# mariadb 10.3
update mysql.user set authentication_string=password('ubuntu') where
user='mage';
# 此方法需要执行下面指令才能生效:
FLUSH PRIVILEGES;

2、忘记密码解决方法

  • 启动mysqld进程时,为其使用如下选项
    • –skip-grant-tables
    • –skip-networking
  • 使用UPDATE命令修改管理员密码
  • 关闭mysqld进程,移除上述两个选项,重启mysqld
# Mariadb 和MySQL5.6版之前破解root密码
vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking

systemctl restart mysqld|mariadb
mysql

#方法1
#mariadb 旧版和MySQL5.6版之前
MariaDB [(none)]> update mysql.user set password=password('Root123!') where
user='root';
#mariadb 新版
MariaDB [(none)]> update mysql.user set authentication_string=password('Root123!')
where user='root';

#方法2
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> alter user root@'localhost' identified by 'Root123!';

vim /etc/my.cnf
[mysqld]
#skip-grant-tables
#skip-networking

systemctl restart mysqld|mariadb
mysql -uroot -pRoot123!
# MySQL5.7和8.0 破解root密码
vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking  #MySQL8.0不需要

systemctl restart mysqld
mysql

#方法1
mysql> update mysql.user set authentication_string='' where user='root' and
host='localhost';
#方法2
mysql> flush privileges;
#再执行下面任意一个命令
mysql> alter user root@'localhost' identified by 'Root123!';
mysql> set password for root@'localhost'='Root123!';

vim /etc/my.cnf
[mysqld]
#skip-grant-tables
#skip-networking

systemctl restart mysqld
mysql -uroot -pRoot123!
# 此方法适用于包安装方式的MySQL或Mariadb(慎重使用,适合使用在无数据的新库或者数据不重要的测试库)
systemctl stop mysqld

rm -rf /var/lib/mysql/*
systemctl start mysqld

3、权限管理和DCL语句

3.1、权限类别

  • 权限类别:
    • 管理类
    • 程序类
    • 数据库级别
    • 表级别
    • 字段级别
  • 管理类:
    • CREATE USER
    • FILE
    • SUPER
    • SHOW DATABASES
    • RELOAD
    • SHUTDOWN
    • REPLICATION SLAVE
    • REPLICATION CLIENT
    • LOCK TABLES
    • PROCESS
    • CREATE TEMPORARY TABLES
  • 程序类:针对 FUNCTION、PROCEDURE、TRIGGER
    • CREATE
    • ALTER
    • DROP
    • EXCUTE
  • 库和表级别:针对 DATABASE、TABLE
    • ALTER
    • CREATE
    • CREATE VIEW
    • DROP INDEX
    • SHOW VIEW
    • WITH GRANT OPTION:能将自己获得的权限转赠给其他用户
  • 数据操作
    • SELECT
    • INSERT
    • DELETE
    • UPDATE
  • 字段级别
    • SELECT(col1,col2,…)
    • UPDATE(col1,col2,…)
    • INSERT(col1,col2,…)
    • 所有权限
    • ALL PRIVILEGES 或 ALL

3.2、授权(GRANT)

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
# 范例
GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';
GRANT ALL ON wordpress.* TO wordpress@'10.0.0.%' ;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%'  WITH GRANT OPTION;
#创建用户和授权同时执行的方式在MySQL8.0取消了
GRANT ALL ON wordpress.* TO wordpress@'192.168.8.%' IDENTIFIED BY 'magedu';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.8.%' IDENTIFIED BY 'magedu'
WITH GRANT OPTION;

3.3、取消权限(REVOKE)

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON
[object_type] priv_level FROM user [, user] ...
# 范例
REVOKE DELETE ON *.* FROM 'testuser'@'172.16.0.%';

3.4、查看指定用户获得的授权

SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];
  • MariaDB服务进程启动时会读取mysql库中所有授权表至内存
    • GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
    • 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表 mysql> FLUSH PRIVILEGES;

4、MySQL的图形化的远程管理工具

在MySQL数据库中创建用户并授权后,可以使用相关图形化工具进行远程的管理。

  • 常见的图形化管理工具:
    • Navicat
    • SQLyog

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享