文章目录

  • 1、原题
  • 1.1、英文原题
  • 1.2、中文翻译
  • 1.3、答案
  • 2、题目解析
  • 2.1、题干解析
  • 2.2、选项解析
  • 3、知识点
  • 3.1、知识点1:密码过期(PASSWORD EXPIRE)
  • 3.1.1、MySQL5.7的密码过期政策
  • 3.1.2、MySQL5.7对用户密码过期的处理方式
  • 4、实验
  • 4.1、实验1
  • 4.1.1、实验目的
  • 4.1.2、实验前准备
  • 4.1.3、实验步骤
  • 4.1.4、实验结论
  • 5、总结


1、原题

1.1、英文原题

mysql的ocp试题 mysqlocp考试题库_ocp

1.2、中文翻译

您已使用以下语句创建了一个新用户:CREATE USER ‘erika’@'localhost’IDENTIFIED BY ‘first#1Pass’PASSWORD EXPIRE:结果是什么?
A、您收到一个语法错误,表明您无法设置密码并在同时。
B、当’erika’@‘localhost’尝试使用MySQL命令行客户端登录时,用户将允许登录,但在用户更改密码
C、当’erika’@‘localhost’尝试使用MySQL命令行客户端登录时,用户将拥有在看到mysql提示之前更改密码。
D、当’erika’@'localhost’尝试使用MySQL命令行客户端登录时,用户将不会允许登录,因为密码已过期。

1.3、答案

B

2、题目解析

2.1、题干解析

本题主要考察MySQL将用户设置为PASSWORD EXPIRE的后果。

2.2、选项解析

3、知识点

3.1、知识点1:密码过期(PASSWORD EXPIRE)

3.1.1、MySQL5.7的密码过期政策

要手动过期一个账户密码,请如下使用ALTER USER语句,该操作在相应的mysql.user系统表行中标记密码过期:

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;

可以通过系统变量default_password_lifetime为MySQL所有用户设置密码自动过期策略。该变量默认值是0(在5.7.11之前,默认的default_password_lifetime值是360),这将禁用密码自动过期。如果default_password_lifetime的值设置位一个正整数N,它表示密码必须每隔N天更换。
当客户端成功连接时,服务器会确定账户密码是否已经过期。首先服务器检查密码是否已被手动过期。其次,服务器会根据密码自动过期策略,检查密码年龄是否大于其允许的寿命。无论是手动还是自动,一旦服务器认为该密码已经过期,服务器会限制对其允许的操作,直到用户建立一个新的账户密码。

官方参考文档

3.1.2、MySQL5.7对用户密码过期的处理方式

对于每个使用密码过期的账户的连接,服务器要么断开客户端的连接,要么将客户端限制在 “沙盒模式”,在这种模式下,服务器只允许客户端执行重置过期密码所需的操作。服务器采取哪种行动取决于客户和服务器的设置,默认情况下回使用沙盒模式。

  1. 如果服务器将客户端限制为沙盒模式,客户端可以用ALTER USER或SET PASSWORD重置账户密码。在这之后,服务器会恢复该会话的正常访问,以及使用该账户的后续连接。对于会话中不允许的任何操作,服务器会返回一个ER_MUST_CHANGE_PASSWORD错误。
  2. 对于mysql客户端的非交互式调用(例如,在批处理模式),如果密码过期,服务器通常会断开客户端的连接。要允许非交互式mysql调用保持连接,以便可以更改密码(使用沙盒模式中允许的语句),请在mysql命令中添加–connect-expired-password选项。

官方参考文档

4、实验

4.1、实验1

4.1.1、实验目的

验证用户被设置为EXPIRE以后的情况

4.1.2、实验前准备

一个MySQL5.7数据库实例。

4.1.3、实验步骤

1、使用ROOT用户或其他管理权限用户,打开会话1,创建一个测试库和测试表,并插入一条测试数据:

mysql> CREATE DATABASE db_test1;
mysql> CREATE TABLE table_test1(id INT);
mysql> INSERT INTO db_test1.table_test1 SELECT 1;
mysql> SELECT * FROM db_test1.table_test1;
+------+
| id   |
+------+
|    1 |
+------+

2、创建两个用户,分别都授予SELECT测试库所有表的权限,区别在于用户二被设置了PASSWORD EXPIRE、

mysql> CREATE USER 'usr_test1'@'%' IDENTIFIED BY '000000';
mysql> GRANT SELECT ON db_test1.* TO 'usr_test1'@'%';
mysql> CREATE USER 'usr_test2'@'%' IDENTIFIED BY '000000' PASSWORD EXPIRE;
mysql> GRANT SELECT ON db_test1.* TO 'usr_test2'@'%';

3、用第一个用户usr_test1(未被设置PASSWORD EXPIRE),打开一个新的登录会话,发觉可以登录成功

shell> mysql -h127.0.0.1 -uusr_test1 -p

4、用第一个用户查看当前用户是否是usr_test1,并查询测试表,发觉没问题:

mysql> SELECT CURRENT_USER();
+---------------------+
| CURRENT_USER()      |
+---------------------+
| usr_test1@localhost |
+---------------------+
mysql> SELECT * FROM db_test1.table_test1;
+------+
| id   |
+------+
|    1 |
+------+

5、用第二个用户usr_test2(被设置了PASSWORD EXPIRE),打开一个新的登录会话,发觉是可以登录成功的。

shell> mysql -h127.0.0.1 -uusr_test2 -p
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.40-log

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

6、但是在第二个用户的会话里不能做任何操作,无论是查询当前用户还是查询测试表,被要求先ALTER USER来重置密码:

mysql> SELECT CURRENT_USER();
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> SELECT * FROM db_test1.table_test1;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

7、修复这个问题也很简单,使用ALTER USER <user_name> IDENTIFIED BY '<new_password>'即可,如下所示:

mysql> ALTER USER usr_test2@'%' IDENTIFIED BY '111111';
Query OK, 0 rows affected (0.00 sec)

8、然后发觉第二个用户也可以正常查询当前用户和测试表了:

mysql>  SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| usr_test2@%    |
+----------------+
mysql> SELECT * FROM db_test1.table_test1;
+------+
| id   |
+------+
|    1 |
+------+

4.1.4、实验结论

MySQL5.7中 一旦用户密码过期以后,可以登录,但无法执行除了修改密码以外的增删改查等操作。修复这个问题,只需修改用户密码即可。

5、总结

同实验1结论,略。