MySQL好好学七(用户和权限管理)

MySQL好好学七(用户和权限管理)

大纲

  • 用户管理

  • 权限管理

  • MySQL密码修改

用户管理

        MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。

1、创建用户
-- 创建用户1
可以使用 CREATE USER 语句来创建 MySQL 用户,并设置相应的密码。
语法:
CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

参数说明:
用户:指定创建用户账号,格式为 user_name'@'host_name。这里的user_name是用户名,
host_name为主机名,即用户连接 MySQL 时所用主机的名字。如果在创建的过程中,
只给出了用户名,而没指定主机名,那么主机名默认为“%”,表示一组主机,即对所有主机开放权限

IDENTIFIED BY子句:用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。

PASSWORD 'password':
PASSWORD 表示使用哈希值设置密码,该参数可选。如果密码是一个普通的字符串,则不需要使用 PASSWORD 关键字。'password' 表示用户登录时使用的密码,需要用单引号括起来。

使用 CREATE USER 语句时应注意以下几点:
1、CREATE USER 语句可以不指定初始密码。但是从安全的角度来说,不推荐这种做法。
2、使用 CREATE USER 语句必须拥有 mysql 数据库的 INSERT 权限或全局 CREATE USER 权限。
3、使用 CREATE USER 语句创建一个用户后,MySQL 会在 mysql 数据库的 user 表中添加一条新记录。
4、CREATE USER 语句可以同时创建多个用户,多个用户用逗号隔开。

示例1:
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
使用 CREATE USER 创建一个用户,用户名是 test1,密码是 test1,主机名是 localhost。
在实际应用中,我们应避免明文指定密码,可以通过 PASSWORD 关键字使用密码的哈希值设置密码
在 MySQL 中,可以使用 password() 函数获取密码的哈希值:
mysql> SELECT password('test1');
+-------------------------------------------+
| password('test1')                         |
+-------------------------------------------+
| *06C0BF5B64ECE2F648B5F048A71903906BA08E5C |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec) 


示例2:
CREATE USER 'test1'@'localhost'IDENTIFIED BY PASSWORD '*06C0BF5B64ECE2F648B5F048A71903906BA08E5C'; 



-- 创建用户2
可以使用 INSERT 语句将用户的信息添加到 mysql.user 表中,但必须拥有对 mysql.user 表的 INSERT 权限,
使用 INSERT 语句创建用户的代码如下:
INSERT INTO mysql.user(Host, User,  authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');

示例:
mysql> INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('localhost', 'test2', PASSWORD('test2'), '', '', '');
Query OK, 1 row affected, 1 warning (0.02 sec); 

由于 mysql 数据库的 user 表中,ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行
-- 使用 FLUSH 命令让用户生效
FLUSH PRIVILEGES; 
使用以上命令可以让 MySQL 刷新系统权限相关表。执行 FLUSH 命令需要 RELOAD 权限。
注意:user 表中的 User 和 Host 字段区分大小写,创建用户时要指定正确的用户名称或主机名。 


-- 创建用户3
虽然 CREATE USER 和 INSERT INTO 语句都可以创建普通用户,但是这两种方式不便授予用户权限。于是 MySQL 提供了 GRANT 语句。
语法:
GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
参数说明:
priv_type 参数表示新用户的权限;
database.table 参数表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限;
user 参数指定新用户的账号,由用户名和主机名构成;
IDENTIFIED BY 关键字用来设置密码;
password 参数表示新用户的密码。 

示例:
GRANT SELECT ON*.* TO 'test3'@localhost IDENTIFIED BY 'test3'; 
GRANT 语句创建名为 test3 的用户,主机名为 localhost,密码为 test3。该用户对所有数据库的所有表都有 SELECT 权限
其中,“*.*” 表示所有数据库下的所有表。结果显示创建用户成功,且 test3 用户对所有表都有查询(SELECT)权限。

技巧:GRANT 语句是 MySQL 中一个非常重要的语句,它可以用来创建用户、修改用户密码和设置用户权限。教程后面会详细介绍如何使用 GRANT 语句修改密码、更改权限。
2、修改用户
在 MySQL 中,我们可以使用 RENAME USER 语句修改一个或多个已经存在的用户账号
语法:
RENAME USER <旧用户> TO <新用户>
其中:
<旧用户>:系统中已经存在的 MySQL 用户账号。
<新用户>:新的 MySQL 用户账号。 

使用 RENAME USER 语句时应注意以下几点:
RENAME USER 语句用于对原有的 MySQL 用户进行重命名。
若系统中旧账户不存在或者新账户已存在,该语句执行时会出现错误。
使用 RENAME USER 语句,必须拥有 mysql 数据库的 UPDATE 权限或全局 CREATE USER 权限。 


mysql> RENAME USER 'test1'@'localhost'
    -> TO 'testUser1'@'localhost';
Query OK, 0 rows affected (0.03 sec);
使用 RENAME USER 语句将用户名 test1 修改为 testUser1,主机是 localhost
3、 删除用户
-- 删除用户1
在 MySQL 数据库中,可以使用 DROP USER 语句删除用户,也可以直接在 mysql.user 表中删除用户以及相关权限
语法:
DROP USER <用户1> [ , <用户2> ]… 
其中,用户用来指定需要删除的用户账号。

使用 DROP USER 语句应注意以下几点:
DROP USER 语句可用于删除一个或多个用户,并撤销其权限。
使用 DROP USER 语句必须拥有 mysql 数据库的 DELETE 权限或全局 CREATE USER 权限。
在 DROP USER 语句的使用中,若没有明确地给出账户的主机名,则该主机名默认为“%”。 

示例:
mysql> DROP USER 'test1'@'localhost';
Query OK, 0 rows affected (0.00 sec);
DROP USER 语句删除用户'test1@'localhost';


-- 删除用户2
可以使用 DELETE 语句直接删除 mysql.user 表中相应的用户信息,但必须拥有 mysql.user 表的 DELETE 权限
语法:
DELETE FROM mysql.user WHERE Host='hostname' AND User='username'; 
Host 和 User 这两个字段都是 mysql.user 表的主键。因此,需要两个字段的值才能确定一条记录。

示例:
DELETE FROM mysql.user WHERE Host='localhost'AND User='test2';
Query OK, 1 rows affected (0.00 sec);
DELETE 语句删除用户'test2'@'localhost'

权限管理

1、查看用户权限
在 MySQL 中,可以通过查看 mysql.user 表中的数据记录来查看相应的用户权限,
也可以使用 SHOW GRANTS 语句查询用户的权限。
语法1:SELECT * FROM mysql.user;(要执行该语句,必须拥有对 user 表的查询权限)
语法2:SHOW GRANTS FOR 'username'@'hostname';

示例1:
mysql> SHOW GRANTS FOR 'testuser1'@'localhost';
+-----------------------------------------------+
| Grants for testuser1@localhost                |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser1'@'localhost' |
+-----------------------------------------------+
1 row in set (0.00 sec) 
其中,USAGE ON *.*表示该用户对任何数据库和任何表都没有权限。
2、用户授权

授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。

-- 用户授权
语法:
GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]. 

参数说明:
1、priv_type 参数表示权限类型;
2、columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
3、database.table 用于指定权限的级别;
4、user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
5、IDENTIFIED BY 参数用来为用户设置密码;
6、password 参数是用户的新密码。

WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
1、GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
2、MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
3、MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
4、MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
5、MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。

MySQL 中可以授予的权限有如下几组:
1、列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
2、表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
3、数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
4、用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
*:表示当前数据库中的所有表。
*.*:表示所有数据库中的所有表。
db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
TO 子句:如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户设置密码。..]
  • 授予数据库权限时,<权限类型>可以指定为以下值:
权限名称对应user表中的字段说明
SELECTSelect_priv表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
INSERTInsert_priv表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
DELETEDelete_priv表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
UPDATEUpdate_priv表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
REFERENCESReferences_priv表示授予用户可以创建指向特定的数据库中的表外键的权限。
CREATECreate_priv表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
ALTERAlter_priv表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
SHOW VIEWShow_view_priv表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
CREATE ROUTINECreate_routine_priv表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
ALTER ROUTINEAlter_routine_priv表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
INDEXIndex_priv表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
DROPDrop_priv表示授予用户可以删除特定数据库中所有表和视图的权限。
CREATE TEMPORARY TABLESCreate_tmp_table_priv表示授予用户可以在特定数据库中创建临时表的权限。
CREATE VIEWCreate_view_priv表示授予用户可以在特定数据库中创建新的视图的权限。
EXECUTE ROUTINEExecute_priv表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
LOCK TABLESLock_tables_priv表示授予用户可以锁定特定数据库的已有数据表的权限。
ALL 或 ALL PRIVILEGES 或 SUPERSuper_priv表示以上所有权限/超级权限
  • 授予表权限时,<权限类型>可以指定为以下值:
权限名称对应user表中的字段说明
SELECTSelect_priv授予用户可以使用 SELECT 语句进行访问特定表的权限
INSERTInsert_priv授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限
DELETEDelete_priv授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限
DROPDrop_priv授予用户可以删除数据表的权限
UPDATEUpdate_priv授予用户可以使用 UPDATE 语句更新特定数据表的权限
ALTERAlter_priv授予用户可以使用 ALTER TABLE 语句修改数据表的权限
REFERENCESReferences_priv授予用户可以创建一个外键来参照特定数据表的权限
CREATECreate_priv授予用户可以使用特定的名字创建一个数据表的权限
INDEXIndex_priv授予用户可以在表上定义索引的权限
ALL 或 ALL PRIVILEGES 或 SUPERSuper_priv所有的权限名
  • 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list

  • 最有效率的权限是用户权限。

    授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:

    • CREATE USER:表示授予用户可以创建和删除新用户的权限。
    • SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。

        数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的权限太多,应该尽快使用 REVOKE 语句将权限收回。此处特别注意,最好不要授予普通用户 SUPER 权限,GRANT 权限。

3、删除用户权限

        在 MySQL 中,可以使用 REVOKE 语句删除某个用户的某些权限(此用户不会被删除),在一定程度上可以保证系统的安全性。例如,如果数据库管理员觉得某个用户不应该拥有 DELETE 权限,那么就可以删除 DELETE 权限。

-- 删除用户权限1
语法:
REVOKE priv_type [(column_list)]...
ON database.table
FROM user [, user]...  

REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:
priv_type 参数表示权限的类型;
column_list 参数表示权限作用于哪些列上,没有该参数时作用于整个表上;
user 参数由用户名和主机名构成,格式为“username'@'hostname'”。 

-- 删除用户权限2
语法:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... 
删除用户权限需要注意以下几点:
REVOKE 语法和 GRANT 语句的语法格式相似,但具有相反的效果。
要使用 REVOKE 语句,必须拥有 MySQL 数据库的全局 CREATE USER 权限或 UPDATE 权限 

示例:(使用 REVOKE 语句取消用户 testUser 的插入权限)
mysql> REVOKE INSERT ON *.*
    -> FROM 'testUser'@'localhost';
Query OK, 0 rows affected (0.01 sec)

MySQL密码修改

1、修改普通用户密码
-- 登录语法:
mysql -h hostname|hostlP -p port -u username -p DatabaseName -e "SQL语句"
对上述参数说明如下:
-h:指定连接 MySQL 服务器的地址。可以用两种方式表示,hostname 为主机名,hostIP 为主机 IP 地址。
-p:指定连接 MySQL 服务器的端口号,port 为连接的端口号。MySQL 的默认端口号是 3306,因此如果不指定该参数,默认使用 3306 连接 MySQL 服务器。
-u:指定连接 MySQL 服务器的用户名,username 为用户名。
-p:提示输入密码,即提示 Enter password。
DatabaseName:指定连接到 MySQL 服务器后,登录到哪一个数据库中。如果没有指定,默认为 mysql 数据库。
-e:指定需要执行的 SQL 语句,登录 MySQL 服务器后执行这个 SQL 语句,然后退出 MySQL 服务器。 

示例:
C:\Users\11645>mysql -h localhost -u root -p test
Enter password: ****  
使用 root 用户登录到自己计算机的 mysql 数据库,同时查询 student 表的表结构:
C:\Users\11645>mysql -h localhost -u root -p test -e"DESC student"
Enter password: **** 
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(4)      | YES  |     | NULL    |       |
| stuno | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
示例 :mysql -h localhost -u root -proot


-- 退出MySQL服务器
quit;

-- 修改密码1
在 MySQL 中,只有 root 用户可以通过更新 MySQL 数据库来更改密码
语法1:
SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');
其中,username 参数是普通用户的用户名,hostname 参数是普通用户的主机名,newpwd 是要更改的新密码。

注意:新密码必须使用 PASSWORD() 函数来加密,如果不使用 PASSWORD() 加密,也会执行成功,但是用户会无法登录 

示例1:
root 用户登录 MySQL 服务器后,再使用 SET 语句将 testuser 用户的密码修改为“newpwd”:
mysql> SET PASSWORD FOR 'testuser'@'localhost' = PASSWORD("newpwd");
Query OK, 0 rows affected, 1 warning (0.01 sec) ;

示例2:
使用 testuser 用户登录 MySQL 服务器,再使用 SET 语句将密码更改为“newpwd1”: 
ysql> SET PASSWORD = PASSWORD('newpwd1');
Query OK, 0 rows affected, 1 warning (0.00 sec); 

-- 修改密码2
使用 root 用户登录 MySQL 服务器后,可以使用 UPDATE 语句修改 MySQL 数据库的 user 表的 authentication_string 字段,从而修改普通用户的密码:
UPDATE MySQL.user SET authentication_string = PASSWORD("newpwd") WHERE User = "username" AND Host = "hostname";

注意,执行 UPDATE 语句后,需要执行 FLUSH PRIVILEGES 语句重新加载用户权限 


-- 修改密码3
除了前面介绍的方法,还可以在全局级别使用 GRANT USAGE 语句指定某个账户的密码而不影响账户当前的权限。需要注意的是,使用 GRANT 语句修改密码,必须拥有 GRANT 权限
语法:
GRANT USAGE ON *.* TO 'user'@’hostname’ IDENTIFIED BY 'newpwd'; 
其中,username 参数是普通用户的用户名,hostname 参数是普通用户的主机名,newpwd 是要更改的新密码

示例:
使用 root 用户登录 MySQL 服务器,再使用 GRANT 语句将 testuser 用户的密码修改为“newpwd3”
mysql> GRANT USAGE ON *.* TO 'testuser'@'localhost' IDENTIFIED BY 'newpwd3';
Query OK, 0 rows affected, 1 warning (0.05 sec)
2、修改root用户密码

在 MySQL 中,root 用户拥有很高的权限,因此必须保证 root 用户密码的安全。修改 root 用户密码的方式有很多种。

-- 修改root用户密码1
root 用户可以使用 mysqladmin 命令来修改密码.
语法:
mysqladmin -u username -h hostname -p password "newpwd";

参数说明:
usermame 指需要修改密码的用户名称,在这里指定为 root 用户;
hostname 指需要修改密码的用户主机名,该参数可以不写,默认是 localhost;
password 为关键字,而不是指旧密码;
newpwd 为新设置的密码,必须用双引号括起来。如果使用单引号会引发错误,可能会造成修改后的密码不是你想要的。 

示例:
C:\Users\leovo>mysqladmin -u root -p password "rootpwd"
Enter password: ****
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. 


-- 修改root用户密码2
因为所有账户信息都保存在 user 表中,因此可以直接通过修改 user 表来改变 root 用户的密码
语法:
UPDATE mysql.user set authentication_string = PASSWORD ("rootpwd) WHERE User = "root" and Host="localhost";

示例:
mysql> UPDATE mysql.user set authentication_string = password ("rootpwd2")
    -> WHERE User = "root" and Host = "localhost";
Query OK, 1 row affected, 0 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings:0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.06 sec) 


-- 修改root用户密码3
SET PASSWORD 语句可以用来重新设置其他用户的登录密码或者自己使用的账户的密码:
语法:SET PASSWORD = PASSWORD ("rootpwd"); 

使用 root 用户登录到 MySQL 服务器后,SQL 语句和运行结果如下所示:
MySQL> SET PASSWORD = password ("rootpwd3");
Query OK, 0 rows affected (0.00 sec) 
3、忘记root密码后如何重置
MySQL忘记root密码后如何重置?
在 MySQL 中,可以通过以下步骤来重置 root 用户的密码:

1、首先,需要登录到 MySQL 服务器。这可以通过命令行或者图形界面工具(如 phpMyAdmin)进行操作。确保使用管理员账号登录。

2、打开命令提示符或者终端,并输入以下命令连接到 MySQL 服务器:mysql -u root -p。然后按 Enter 键。

3、系统会提示输入当前的 root 密码。由于我们已经忘记了该密码,所以无法直接输入正确的密码。但是,我们可以通过其他方式获取新的密码。

4、关闭 MySQL 服务器。可以使用 sudo service mysql stop (Linux) 或者 net stop mysql (Windows) 命令来完成此操作。

5、打开配置文件 my.cnf(位于 /etc/my.cnf 或者 /etc/mysql/my.cnf),添加 --skip-grant-tables 参数到 [mysqld] 部分。保存更改并关闭文件。

6、再次启动 MySQL 服务器。同样地,可以使用 sudo service mysql start (Linux) 或者 net start mysql (Windows) 命令来启动。

7、现在,我们可以不需要密码就能够登录到 MySQL 服务器。在命令提示符或者终端上运行 mysql -u root 命令,将会自动登录到 MySQL 控制台。

8、在 MySQL 控制台中,选择要修改密码的数据库。默认情况下,为空白数据库。

9、运行以下 SQL 语句来更新 root 用户的密码:UPDATE user SET Password=PASSWORD('new_password') WHERE User='root';。将 'new_password' 替换为你想设定的新密码。

10、最后,运行 FLUSH PRIVILEGES; 命令来刷新权限表。

11、关闭 MySQL 服务器。

12、返回之前编辑的配置文件 my.cnf,删除 --skip-grant-tables 参数,并保存更改。

13、再次启动 MySQL 服务器。

13、现在,你应该可以使用新密码登录到 MySQL 服务器了。

14、注意事项:

在第 5 步时,必须小心处理配置文件,因为错误的更改可能导致 MySQL 服务器无法启动。

在第 9 步时,建议使用复杂、安全性高的密码,包含字母、数字和特殊字符等元素。
end
  • 作者:旭仔(联系作者)
  • 发表时间:2024-03-03 19:41
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论