试题 1:

Choose two.

Your MySQL server was upgraded from an earlier major version. The sales database contains three tables, one of which is the transactions table, which has 4 million rows. You are running low on disk space on the datadir partition and begin to investigate. Examine these commands and output: (见图片)

Which two statements are true?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> show global variables like 'innodb_file%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_file_per_table | ON |
+--------------------------+-------+
1 row in set (0.00 sec)

# ls -l | grep ib
-rw-r-----. 1 mysql mysql 3287 Dec 12 07:54 ib_buffer_pool
-rw-r-----. 1 mysql mysql 125827192912 Dec 12 09:50 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Dec 12 09:50 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Dec 11 14:05 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Dec 12 08:05 ibtmp1
-rw-r-----. 1 mysql mysql 25165824 Dec 12 09:50 mysql.ibd

# ls -l sales/
total 544
-rw-r-----. 1 mysql mysql 47550136 Dec 12 09:50 sales.ibd
-rw-r-----. 1 mysql mysql 114688 Dec 11 14:33 leads.ibd
  • A) The transactions table was created with innodb_file_per_table = OFF. [正确]
  • B) Truncating the sales and leads table will free up disk space. [正确]
  • C) Executing SET GLOBAL innodb_row_format = COMPRESSED and then ALTER TABLE transactions will free up disk space. [错误] 没有这个变量
  • D) Executing ALTER TABLE transactions will enable you to free up disk space. [错误]
  • E) Truncating the transactions table will free up the most disk space. [错误]

题解:

  • A) 正确: innodb_file_per_table 设置为 ON,表示新创建的表(或ALTER过的表)会存储在独立的 .ibd 文件中。然而,ibdata1 文件(系统表空间)异常巨大 (125GB),并且在 sales/ 目录下没有看到 transactions.ibd 文件。这强烈暗示 transactions 表(包含400万行)是在 innodb_file_per_table 设置为 OFF 时创建的,或者被明确指定创建在系统表空间中,因此其数据存储在 ibdata1 文件内。
  • B) 正确: salesleads 表在 sales/ 目录下有对应的 .ibd 文件 (sales.ibd 47MB, leads.ibd 114KB)。这意味着它们是独立表空间。TRUNCATE TABLE 操作会删除表中的所有行并回收对应的 .ibd 文件所占用的磁盘空间(文件大小会变小或被删除,取决于操作系统和文件系统)。因此,清空这两个表会直接释放操作系统层面的磁盘空间。
  • C) 错误: innodb_row_format 不是一个可以通过 SET GLOBAL 设置的全局变量。ROW_FORMAT=COMPRESSEDCREATE TABLEALTER TABLE 语句中的一个表选项。即使执行 ALTER TABLE transactions ROW_FORMAT=COMPRESSED,这个操作本身通常需要临时空间,并且不保证能立即释放磁盘空间,特别是对于存储在 ibdata1 中的表。
  • D) 错误: 对存储在 ibdata1 中的表执行简单的 ALTER TABLE transactions(没有指定移动表空间的操作,如 ENGINE=InnoDB)通常不会收缩 ibdata1 文件并释放磁盘空间。它可能会在 ibdata1 内部重新组织数据,回收一些内部碎片供将来使用,但 ibdata1 文件大小通常不会减小。
  • E) 错误: TRUNCATE TABLE transactions 会删除 ibdata1 文件中属于该表的数据页,使这部分空间在 ibdata1 内部 可重用,但它不会自动收缩 ibdata1 文件的大小,因此不会立即在操作系统层面释放大量磁盘空间。相比之下,选项 B 中的操作会直接缩小或删除 .ibd 文件,释放操作系统空间。

试题 2:

EXPLAIN:

1
2
3
4
5
6
7
8
9
10
11
*************************** 1. row ***************************
EXPLAIN:
-> Sort: <temporary>.Population DESC (actual time=0.306..8.431 rows=125 loops=1)
-> Stream results (actual time=0.145..8.033 rows=125 loops=1)
-> Nested loop inner join (cost=241.12 rows=205) (actual time=0.141..7.787 rows=125 loops=1)
-> Filter: (world.country.Continent = 'Asia') (cost=25.40 rows=34) (actual time=0.064..0.820 rows=51 loops=1)
-> Table scan on country (cost=25.40 rows=239) (actual time=0.059..0.359 rows=239 loops=1)
-> Filter: (world.city.Population > 1000000) (cost=4.53 rows=6) (actual time=0.030..0.131 rows=2 loops=51)
-> Index lookup on city using CountryCode (CountryCode=world.country.`Code`) (cost=4.53 rows=18) (actual time=0.023..0.096 rows=35 loops=51)

1 row in set (0.0094 sec)
  • A) The country table is accessed as the first table, and then joined to the city table. [正确]
  • B) 35 rows from the city table are included in the result. [错误]
  • C) The optimizer estimates that 51 rows in the country table have Continent = ‘ Asia ‘. [错误]
  • D) It takes more than 8 milliseconds to sort the rows. [错误] (根据提供答案标记为错误,但实际输出显示排序耗时超过8ms)
  • E) The query returns exactly 125 rows. [正确]

题解:

  • A) 正确:EXPLAIN 输出的缩进和箭头方向(从下往上看执行顺序)可以看出,首先是 Table scan on country,然后是 Index lookup on city,最后通过 Nested loop inner join 连接。所以 country 表是驱动表(先访问)。
  • B) 错误: Index lookup on city 显示 actual time=... rows=35 loops=51,这意味着对于来自 country 表的 51 个匹配行中的每一个,平均在 city 表中查找到了 35 行(在应用 Population > 1000000 过滤之前)。最终结果集包含 125 行,这是连接和过滤后的总行数,而不是仅来自 city 表的行数。
  • C) 错误: 优化器对 country 表过滤 Continent = 'Asia'估计行数是 rows=34(见 Filter: (world.country.Continent = 'Asia') 行的 rows=34)。而实际匹配的行数是 51(见同一行的 actual time=... rows=51 loops=1)。
  • D) 错误 (根据答案标记): Sort 步骤显示 actual time=0.306..8.431。这个时间范围表示排序操作从开始输出第一行到输出最后一行的持续时间。计算其差值:8.431 - 0.306 = 8.125 毫秒。这个值确实大于 8 毫秒。因此,根据 EXPLAIN ANALYZE 的输出,这个说法似乎是正确的。然而,题目提供的答案标记为错误。可能的原因是题目或答案存在歧义或错误,或者对 actual time 的解释有特定上下文。但在标准解释下,耗时超过了8ms。
  • E) 正确: Sort 步骤是查询计划的最后一步,它处理最终的结果集。该步骤显示 rows=125,这表示查询最终返回了 125 行。

试题 3:

Choose four.

A newly deployed replication master database has a 10/90 read to write ratio. The complete dataset is currently 28G but will never fluctuate(波动) beyond +-10%. The database storage system consists of two locally attached PCI-E Enterprise grade disks (mounted as /data1 and /data2). The server is dedicated to this MySQL Instance. System memory capacity is 64G. The my.cnf file contents are displayed here:

1
2
3
4
[mysqld]
datadir = /data1/
innodb_buffer_pool_size = 28G
innodb_log_file_size = 150M

Which four changes provide the most performance improvement, without sacrificing(牺牲) data integrity?

  • A) innodb-doublewrite = off [错误]
  • B) innodb_log_group_home_dir = /data2/ [正确]
  • C) innodb_log_file_size = 1G [正确]
  • D) innodb_undo_directory = /dev/shm [错误]
  • E) log-bin = /data2/ [正确]
  • F) innodb_flush_log_at_trx_commit = 0 [错误]
  • G) sync_binlog = 0 [错误]
  • H) innodb_buffer_pool_size = 32G [正确]
  • I) disable-log-bin [错误]

答案分析: 不牺牲数据完整性的情况下提供了最大的性能改进

题解:

目标是在不牺牲数据完整性的前提下,最大化性能。服务器配置:数据28G,内存64G,双高速磁盘 (/data1, /data2),读写比10/90(写操作较多)。

  • A) 错误: 关闭双写缓冲区 (innodb_doublewrite=off) 会牺牲数据完整性,可能导致页损坏时无法恢复。
  • B) 正确: 将 InnoDB 重做日志 (innodb_log_group_home_dir) 放到第二个磁盘 (/data2/),可以将数据文件 I/O (datadir=/data1/) 和重做日志 I/O 分离到不同的物理磁盘,减少 I/O 争用,提高写入性能。
  • C) 正确: 将 InnoDB 重做日志文件大小 (innodb_log_file_size) 从 150M 增加到 1G。更大的日志文件意味着日志切换和检查点发生的频率降低,可以减少 I/O 操作,提高写入密集型负载的性能。
  • D) 错误: 将 Undo 日志目录 (innodb_undo_directory) 放到内存文件系统 (/dev/shm) 风险很高。如果服务器意外重启,内存中的 Undo 信息会丢失,可能导致事务无法回滚和实例无法恢复,牺牲了数据完整性。
  • E) 正确: 启用二进制日志 (log-bin) 并将其路径设置为第二个磁盘 (/data2/)。作为复制主库,二进制日志是必需的。将其与数据文件 I/O 分离可以提高性能。
  • F) 错误: innodb_flush_log_at_trx_commit = 0 会将事务日志写入和刷新延迟,可能导致服务器崩溃时丢失最后一秒的事务,牺牲了 ACID 的持久性。
  • G) 错误: sync_binlog = 0 表示不控制二进制日志同步到磁盘的频率,由操作系统决定。这可能导致主库崩溃时二进制日志与存储引擎数据不一致,影响复制的完整性。
  • H) 正确: 将 InnoDB 缓冲池大小 (innodb_buffer_pool_size) 从 28G 增加到 32G。数据集大小为 28G,内存有 64G。增加缓冲池可以缓存更多的数据和索引,减少磁盘 I/O,特别是对于读操作(虽然这里写操作占多数,但读性能也很重要)。32G 在 64G 内存下是合理的,为操作系统和其他进程留有空间。
  • I) 错误: 禁用二进制日志 (disable-log-bin) 会使复制无法进行,而题目明确这是一个复制主库。

因此,B, C, E, H 是在不牺牲数据完整性前提下提升性能的有效措施。

试题 4:

Which two actions will secure a MySQL server from network-based attacks?

  • A) Use MySQL Router to proxy connections to the MySQL server. [错误]
  • B) Place the MySQL instance behind a firewall. [正确]
  • C) Use network file system (NFS) for storing data. [错误]
  • D) Change the listening port to 3307. [错误]
  • E) Allow connections from the application server only. [正确]

题解:

  • A) 错误: MySQL Router 主要用于提供高可用性和负载均衡,将连接路由到后端的 MySQL 实例。它本身不是一个网络防火墙,虽然可以配置一些访问控制,但其主要目的不同。
  • B) 正确: 在 MySQL 服务器前面部署网络防火墙(如 iptables, firewalld, 或硬件防火墙)是标准的网络安全措施。防火墙可以限制哪些 IP 地址和端口可以访问 MySQL 服务器,有效阻止未授权的网络访问。
  • C) 错误: 使用 NFS 存储数据与网络攻击防护无关,反而可能引入额外的网络和性能复杂性。
  • D) 错误: 更改 MySQL 的监听端口(默认 3306)为其他端口(如 3307)只是一种“安全混淆”(security through obscurity)。攻击者可以通过端口扫描轻易发现新的端口,这并不能提供真正的安全防护。
  • E) 正确: 在 MySQL 服务器层面配置用户授权,只允许来自特定主机(如应用服务器的 IP 地址或主机名)的连接。这可以通过 GRANT 语句中的 HOST 部分 ('user'@'app_server_ip') 或防火墙规则来实现,是限制网络访问来源的有效方法。

试题 5:

Choose four.

You must store connection parameters for connecting a Linux-based MySQL client to a remote Windows-based MySQL server listening on port 3309. Which four methods can be used to configure user, host, and database parameters?

  • A) Embed login information into the SSH tunnel definition. [错误]
  • B) Execute mysql_config_editor to configure the user connection. [正确]
  • C) Configure ~/.my.cnf. [正确]
  • D) Execute the mysqladmin command to configure the user connection. [错误]
  • E) Execute the command in a bash script. [正确]
  • F) Configure environment variables. [正确]
  • G) Define a UNIX socket. [错误]
  • H) Use the usermod program to store static user information. [错误]
  • I) Configure ~/.ssh/config for public key authentication. [错误]

答案: you want to specify the TCP/IP port number using the MYSQL_TCP_PORT variable. (这个答案注释似乎与问题不完全相关,但提到了环境变量)

题解:

目标是在 Linux 客户端存储连接到远程 Windows MySQL (端口 3309) 的参数(用户、主机、数据库等)。

  • A) 错误: SSH 隧道用于安全地转发端口,其配置主要涉及 SSH 连接参数,而不是直接存储 MySQL 的用户、主机、数据库名。
  • B) 正确: mysql_config_editor set 命令可以将连接参数(包括用户、主机、端口、密码等)加密存储在 $HOME/.mylogin.cnf 文件中。后续 mysql 客户端可以自动读取这些凭证。
  • C) 正确: 在用户家目录下的 .my.cnf 文件(或系统级的 /etc/my.cnf)中,可以在 [client] 或自定义的组下配置 user, host, port, database, password 等选项。mysql 客户端会自动读取。
  • D) 错误: mysqladmin 是一个用于执行 MySQL 管理任务(如 ping, shutdown, processlist)的客户端工具,不能用来配置用户连接参数。
  • E) 正确: 可以编写一个 Bash 脚本,在脚本内部调用 mysql 命令,并将所有连接参数(如 -u user -h host -P 3309 -D database -p'password')直接写在命令行中。
  • F) 正确: 可以使用环境变量来设置连接参数,例如 MYSQL_USER, MYSQL_HOST, MYSQL_DATABASE, MYSQL_TCP_PORT (用于端口), MYSQL_PWD (不推荐,不安全)。客户端程序可以读取这些变量。
  • G) 错误: UNIX 套接字文件用于同一台机器上的本地进程间通信,不能用于连接到远程 Windows 服务器。
  • H) 错误: usermod 是 Linux 系统管理命令,用于修改用户账户属性,与 MySQL 连接参数无关。
  • I) 错误: ~/.ssh/config 用于配置 SSH 客户端的行为,与 MySQL 连接参数无关。

试题 6:

Choose two.

Examine this statement, which executes successfully:

1
2
3
4
5
6
7
8
CREATE TABLE employees (
emp_no int unsigned NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no)
) ENGINE = InnoDB;

Now examine this query:

1
2
3
SELECT emp_no, first_name, last_name, birth_date
FROM employees
WHERE MONTH(birth_date) = 4;

You must add an index that can reduce the number of rows processed by the query. Which two statements can do this?

  • A) ALTER TABLE employees ADD INDEX ((CAST(birth_date ->> ‘$.month’ AS unsigned))); [错误]
  • B) ALTER TABLE employees ADD INDEX (birth_date DESC); [错误]
  • C) ALTER TABLE employees ADD COLUMN birth_month tinyint unsigned GENERATED ALWAYS AS (MONTH(birth_date)) VIRTUAL NOT NULL, ADD INDEX (birth_month); [正确]
  • D) ALTER TABLE employees ADD INDEX (birth_date); [错误]
  • E) ALTER TABLE employees ADD COLUMN birth_month tinyint unsigned GENERATED ALWAYS AS (birth_date ->> ‘$.month’) VIRTUAL NOT NULL, ADD INDEX (birth_month); [错误]
  • F) ALTER TABLE employees ADD INDEX ((MONTH(birth_date))); [正确]

题解:

查询条件是 WHERE MONTH(birth_date) = 4,它对 birth_date 列使用了 MONTH() 函数。标准的 B-Tree 索引建立在原始列值(birth_date)上,无法直接用于优化基于函数结果的查找。

  • A) 错误: 这个索引基于 JSON 提取函数 ->>,与 MONTH() 函数无关。
  • B) 错误: 这是一个标准的 birth_date 列索引(降序)。由于查询条件中使用了函数,优化器无法直接利用此索引进行快速定位。
  • C) 正确: 这个方法创建了一个虚拟生成列 birth_month,其值始终是 MONTH(birth_date) 的结果。然后在这个生成列上创建索引。查询 WHERE MONTH(birth_date) = 4 可以被优化器识别为等同于 WHERE birth_month = 4,从而可以使用 birth_month 上的索引来快速定位匹配的行。
  • D) 错误: 与 B 类似,标准的 birth_date 列索引无法直接优化 MONTH() 函数。
  • E) 错误: 这个生成列基于 JSON 提取函数,与 MONTH() 无关。
  • F) 正确: MySQL 8.0 支持函数索引(或称表达式索引)。这个语句直接在表达式 MONTH(birth_date) 的结果上创建索引。优化器可以直接使用这个索引来处理 WHERE MONTH(birth_date) = 4 条件,进行高效查找。

因此,创建生成列并索引 (C) 或直接创建函数索引 (F) 都可以有效优化该查询。

试题 7:

Choose two.

Which two queries are examples of successful SQL injection attacks?

  • A) SELECT user, passwd FROM members WHERE user = ‘?’; INSERT INTO members (‘user’, ‘passwd’) VALUES (‘bob@example.com‘, ‘secret’); – ‘; [正确]
  • B) SELECT user, phone FROM customers WHERE name = ‘\; DROP TABLE users; – ‘; [正确]
  • C) SELECT id, name FROM user WHERE user.id = (SELECT members.id FROM members); [错误]
  • D) SELECT id, name FROM user WHERE id = 23 OR id = 32 OR 1=1; [错误]
  • E) SELECT id, name FROM user WHERE id = 23 OR id = 32 AND 1=1; [错误]
  • F) SELECT email, passwd FROM members WHERE email = ‘INSERT INTO members('email', 'passwd') VALUES ('bob@example.com', 'secret'); – ‘; [错误]

答案: F 在注入的语句前面没有分号。

题解:

SQL 注入攻击通常发生在应用程序将用户输入未经验证或未正确转义就拼接到 SQL 查询语句中。攻击者通过构造特殊的输入,闭合原有的查询语句部分,并注入恶意的 SQL 命令。

  • A) 正确: 假设应用程序代码是 query = "SELECT user, passwd FROM members WHERE user = '" + userInput + "';". 如果用户输入 ?'; INSERT INTO members ('user', 'passwd') VALUES ('bob@example.com', 'secret'); -- ,拼接后的 SQL 会变成 SELECT user, passwd FROM members WHERE user = '?'; INSERT INTO members ('user', 'passwd') VALUES ('bob@example.com', 'secret'); -- ';。这里的 '? 闭合了原来的字符串,分号 ; 结束了 SELECT 语句,然后执行了一个恶意的 INSERT 语句。-- 注释掉了后续可能存在的代码。这是一个典型的 SQL 注入。
  • B) 正确: 假设应用程序代码是 query = "SELECT user, phone FROM customers WHERE name = '" + userInput + "';". 如果用户输入 \'; DROP TABLE users; -- (假设 \ 没有被正确处理或被用于绕过某些过滤),拼接后可能变成 SELECT user, phone FROM customers WHERE name = '\'; DROP TABLE users; -- ';。这同样闭合了字符串,执行了 DROP TABLE 命令,并注释了后续内容。这也是一个 SQL 注入。
  • C) 错误: 这是一个使用了子查询的合法 SQL 语句,没有注入恶意命令。
  • D) 错误: OR 1=1 是一种常见的用于绕过认证或获取更多数据的 SQL 注入载荷片段,但它本身只是修改了 WHERE 子句的逻辑条件,并没有注入新的、独立的 SQL 命令(如 INSERT, DROP, UPDATE)。它本身不是一个完整的命令注入攻击。
  • E) 错误: 与 D 类似,AND 1=1 修改了逻辑,但没有注入新命令。
  • F) 错误: 假设应用程序代码是 query = "SELECT email, passwd FROM members WHERE email = '" + userInput + "';". 如果用户输入 INSERT INTO members('email', 'passwd') VALUES ('bob@example.com', 'secret'); -- ,拼接后的 SQL 是 SELECT email, passwd FROM members WHERE email = 'INSERT INTO members(\'email\', \'passwd\') VALUES (\'bob@example.com\', \'secret\'); -- ';。这里,整个 INSERT 语句被视为 email 列要比较的字符串值,而不是被当作独立的 SQL 命令执行。因此注入失败。

试题 8:

Choose two.

Which two tools are available to monitor the global status of InnoDB locking?

  • A) SHOW ENGINE INNODB STATUS; [正确] (核对后选这个)
  • B) SHOW TABLE STATUS; [错误]
  • C) INFORMATION_SCHEMA.INNODB_TABLESTATS. [错误]
  • D) SHOW STATUS; [错误]
  • E) INFORMATION_SCHEMA.STATISTICS [错误]
  • F) INFORMATION_SCHEMA.INNODB_METRICS [正确] (核对后选这个)

题解:

监控 InnoDB 锁的全局状态:

  • A) 正确: SHOW ENGINE INNODB STATUS 是查看 InnoDB 内部状态最详细和常用的命令。其输出包含了 LATEST DETECTED DEADLOCK(最近死锁信息)和 TRANSACTIONS(当前事务列表,包括它们持有的锁和等待的锁)等关键的锁信息。
  • B) 错误: SHOW TABLE STATUS 提供关于表的基本元数据信息(如引擎、行数、大小等),不包含实时的锁信息。
  • C) 错误: INFORMATION_SCHEMA.INNODB_TABLESTATS 提供 InnoDB 表的持久化统计信息,与实时锁无关。
  • D) 错误: SHOW STATUS 显示服务器级别的状态变量(计数器),其中可能包含一些与锁相关的计数(如 Innodb_row_lock_waits),但它不提供当前哪些事务持有或等待哪些锁的详细全局状态。
  • E) 错误: INFORMATION_SCHEMA.STATISTICS 提供关于表索引的信息。
  • F) 正确: INFORMATION_SCHEMA.INNODB_METRICS 表提供了大量的 InnoDB 性能和内部计数器指标。通过查询这个表,可以获取关于锁系统(如锁等待次数、死锁次数、锁内存使用等)的聚合统计信息,从而监控锁的活动情况性能影响。虽然不如 SHOW ENGINE INNODB STATUS 提供具体的锁持有/等待细节,但它也是监控锁状态(特别是性能指标)的工具。

因此,A 用于查看详细的当前锁状态和死锁,F 用于查看锁相关的性能指标和计数器。

试题 9:

Choose two.

Which two authentication plugins require the plain text client plugin for authentication to work?

  • A) LDAP authentication [正确]
  • B) SHA256 authentication [错误]
  • C) Windows Native authentication [错误]
  • D) PAM authentication [正确]
  • E) MySQL Native Password [错误]
  • F) LDAP SASL authentication [错误]

答案: https://dev.mysql.com/doc/refman/8.0/en/cleartext-pluggable-authentication.html

题解:

客户端明文认证插件 (mysql_clear_password) 会在客户端不经加密地发送密码到服务器。某些服务器端认证插件需要接收明文密码,因为它们需要将这个密码传递给外部系统(如 LDAP 服务器、PAM 框架)进行验证。

  • A) 正确: 基于简单绑定(Simple Bind)的 LDAP 认证通常需要在服务器端获取用户的明文密码,然后用这个密码去绑定(登录)LDAP 服务器以验证用户身份。因此,它需要客户端发送明文密码。
  • B) 错误: SHA256 认证 (sha256_password) 使用基于密码哈希的挑战-响应机制,不需要传输明文密码。
  • C) 错误: Windows Native 认证 (authentication_windows_client) 使用 Windows 的 SSPI,基于操作系统用户的凭证,不涉及传输 MySQL 密码。
  • D) 正确: PAM (Pluggable Authentication Modules) 认证 (authentication_pam_compat) 通常需要获取用户的明文密码,以便将其传递给配置好的 PAM 服务栈进行验证(例如,验证 Linux 系统用户密码)。
  • E) 错误: MySQL Native Password (mysql_native_password) 使用基于密码哈希的挑战-响应机制。
  • F) 错误: LDAP SASL 认证 (authentication_ldap_sasl) 使用 SASL (Simple Authentication and Security Layer) 机制,通常支持更安全的认证方法(如 GSSAPI/Kerberos 或 DIGEST-MD5),不一定需要明文密码,取决于具体的 SASL 机制。

参考文档确认,LDAP(简单绑定)和 PAM 认证插件通常需要客户端使用明文插件。

试题 10:

Which three are types of information stored in the MySQL data dictionary?

  • A) InnoDB buffer pool LRU management data [错误]
  • B) performance metrics [错误]
  • C) access control lists [正确]
  • D) server runtime configuration [错误]
  • E) server configuration rollback [错误]
  • F) view definitions [正确]
  • G) stored procedure definitions [正确]

(Note: The question appears twice with slightly different options. Formatting the second instance as well.)

Which four are types of information stored in the MySQL data dictionary?

  • A) performance metrics [错误]
  • B) table definitions [正确]
  • C) access control lists [正确]
  • D) view definitions [正确]
  • E) server runtime configuration [错误]
  • F) server configuration rollback [错误]
  • G) stored procedure definitions [正确]
  • H) InnoDB buffer pool LRU management data [错误]

题解:

MySQL 数据字典 (Data Dictionary, DD) 是 MySQL 8.0 引入的,用于存储数据库对象元数据的事务性系统。它取代了旧的 .frm, .par, .opt 文件等。

存储在数据字典中的信息主要包括:

  • 数据库对象的定义:
    • 表定义 (Table definitions) - 包括列、索引、约束、分区等。 (对应第二题的 B)
    • 视图定义 (View definitions) (对应 F 和 D)
    • 存储过程和函数定义 (Stored procedure/function definitions) (对应 G)
    • 触发器定义 (Trigger definitions)
    • 事件调度器定义 (Event scheduler definitions)
    • 表空间定义 (Tablespace definitions)
  • 访问控制信息:
    • 用户账户信息 (User accounts)
    • 权限授予信息 (Privileges, Grants) - 即访问控制列表 (Access control lists)。 (对应 C)

不存储在数据字典中的信息:

  • A/H) 错误: InnoDB 缓冲池的 LRU 管理数据是 InnoDB 存储引擎内部的运行时内存结构状态,不属于元数据。
  • B/A) 错误: 性能指标 (Performance metrics) 主要由 Performance Schema 收集和提供。
  • D/E) 错误: 服务器运行时配置主要由配置文件 (my.cnf)、启动参数和动态设置的全局变量决定。部分持久化的全局变量存储在 mysqld-auto.cnf 文件中,但这不完全等同于数据字典。
  • E/F) 错误: MySQL 数据字典本身没有内置服务器配置的回滚机制。

结论:

  • 第一题 (选三): C (访问控制列表), F (视图定义), G (存储过程定义) 是正确的。
  • 第二题 (选四): B (表定义), C (访问控制列表), D (视图定义), G (存储过程定义) 是正确的。

试题 12:

Choose two.

Examine this SQL statement:

1
mysql> GRANT r_read@localhost TO mark WITH ADMIN OPTION;

Which two are true?

  • A) Mark can grant the privileges assigned to the r_read@localhost role to another user. [错误] (mark 只能把角色授予给其他人,而不能把因该角色而获得的权限授予给其他用户)
  • B) Mark can grant the r_read@localhost role to another user. [正确]
  • C) ADMIN OPTION causes the role to be activated by default. [错误]
  • D) Mark must connect from localhost to activate the r_read@localhost role. [错误]
  • E) Mark can revoke the r_read@localhost role from another role. [正确]
  • F) ADMIN OPTION allows Mark to drop the role. [错误]

题解:

GRANT role TO user WITH ADMIN OPTION 语句授予用户 (mark) 一个角色 (r_read@localhost),并且附加了 ADMIN OPTION

WITH ADMIN OPTION 的含义是:允许被授权者 (mark) 将这个角色本身 (r_read@localhost) 授予给其他用户或角色,或者从其他用户或角色那里撤销这个角色。它允许被授权者授予或撤销该角色所包含的具体权限。

  • A) 错误: mark 不能将 r_read 角色包含的权限(例如 SELECT 权限)授予给其他用户。他只能授予 r_read 这个角色本身。
  • B) 正确: WITH ADMIN OPTION 明确允许 markr_read@localhost 这个角色授予给其他用户(例如 GRANT r_read@localhost TO 'another_user'@'%')。
  • C) 错误: ADMIN OPTION 与角色的默认激活状态无关。角色的激活由 SET DEFAULT ROLE 或全局变量 activate_all_roles_on_login 控制。
  • D) 错误: r_read@localhost 这个角色定义本身限制了它只能被来自 localhost 的连接激活和使用。但这与 mark 是否需要从 localhost 连接才能管理(授予/撤销)这个角色无关。mark 可以在他被允许连接的任何地方执行 GRANTREVOKE 角色命令(只要他有 ADMIN OPTION)。
  • E) 正确: WITH ADMIN OPTION 允许 mark 从他之前授予该角色的其他用户或角色那里撤销 r_read@localhost 角色(例如 REVOKE r_read@localhost FROM 'another_user'@'%')。
  • F) 错误: ADMIN OPTION 不授予 DROP ROLE 的权限。删除角色需要 DROP ROLECREATE ROLE 权限。

试题 13:

Choose two.

Which two statements are true about general tablespaces?

  • A) General tablespaces support temporary tables. [错误]
  • B) Dropping a table from a general tablespace releases the space back to the operating system. [错误]
  • C) A new table can be created explicitly in a general tablespace. [正确]
  • D) An existing table can be moved into a general tablespace. [正确]
  • E) A general tablespace can have multiple data files. [错误]

题解:

通用表空间 (General Tablespaces) 是使用 CREATE TABLESPACE 语句创建的共享 InnoDB 表空间。

  • A) 错误: 通用表空间不支持存储临时表。临时表存储在会话临时表空间或全局临时表空间中。
  • B) 错误: 从通用表空间中删除(DROP TABLE)一个表时,该表所占用的空间在表空间文件内部被标记为可用,可以被该表空间内的其他表重用,但通常不会导致表空间文件 (.ibd) 的大小收缩,也不会立即将空间返回给操作系统。
  • C) 正确: 可以使用 CREATE TABLE ... TABLESPACE = tablespace_name; 语法,在创建新表时明确指定将其存储在某个已存在的通用表空间中。
  • D) 正确: 可以使用 ALTER TABLE ... TABLESPACE = tablespace_name; 语法,将一个已经存在的、使用独立表空间(file-per-table)或系统表空间的 InnoDB 表移动到指定的通用表空间中。
  • E) 错误: 每个通用表空间只能包含一个数据文件 (.ibd)。不能向已存在的通用表空间添加第二个数据文件。

试题 14:

(Note: scale up 垂直扩展 在现有服务器中增加硬件资源,以提高性能和处理能力)

Which three methods are part of a ‘scale up’ approach to capacity planning?

  • A) adding additional MySQL servers to the existing host [错误]
  • B) adding more CPU power [正确]
  • C) adding a replication slave [错误]
  • D) adding more RAM [正确]
  • E) adding more storage to your disk array [正确]
  • F) sharding the server into a parallel server farm [错误]
  • G) adding a new node to InnoDB Cluster [错误]

题解:

容量规划中的“垂直扩展”(Scale Up)指的是增强单个服务器节点的处理能力,通过增加或升级其内部资源来实现。相对地,“水平扩展”(Scale Out)指的是增加更多的服务器节点来分担负载。

  • A) 错误: 在同一台物理主机上添加更多的 MySQL 服务器实例,虽然增加了处理单元,但更接近于水平扩展的概念(增加了服务实例数量),而不是增强单个实例的能力。
  • B) 正确: 增加更多的 CPU 核心或升级到更快的 CPU 是典型的垂直扩展,直接提升单个服务器的计算能力。
  • C) 错误: 添加复制从库是将读负载分散到新的服务器节点上,属于水平扩展。
  • D) 正确: 增加服务器的内存(RAM)容量是典型的垂直扩展,可以缓存更多数据,减少 I/O,提升单个服务器的性能。
  • E) 正确: 向现有的磁盘阵列添加更多磁盘(增加容量)或升级到更快的磁盘(如 SSD)属于垂直扩展,提升单个服务器的存储能力或 I/O 性能。
  • F) 错误: 将数据分片(Sharding)到多个服务器组成的集群中是典型的水平扩展策略。
  • G) 错误: 向 InnoDB Cluster 添加新节点是增加集群中的服务器数量,属于水平扩展。

试题 15:

Choose three.

A user wants to connect without entering his or her username and password on the Linux command prompt. Which three locations can be used to store the user’s mysql credentials to satisfy this requirement?

  • A) $HOME/.mysqlrc file [错误]
  • B) /etc/my.cnf file [正确]
  • C) DATADIR/mysqld-auto.cnf file [错误]
  • D) $HOME/.my.cnf file [正确]
  • E) $HOME/.mylogin.cnf file [正确]
  • F) $MYSQL_HOME/my.cnf file [错误]
  • G) $HOME/.mysql/auth/login file [错误]

答案: E mysql_config_editor 出可以给指定的连接和密码生成一个加密文件.mylogin.cnf,默认位于当前用户家目录下。 F $MYSQL_HOME/my.cnf Server-specific options (server only)

题解:

MySQL 客户端程序(如 mysql, mysqldump)可以从多个位置自动读取连接凭证,避免在命令行中输入。

  • A) 错误: .mysqlrc 不是标准的 MySQL 配置文件名。
  • B) 正确: /etc/my.cnf 是系统级的 MySQL 配置文件。可以在其中的 [client] 组下定义 user, password, host, port 等,所有用户运行客户端时都会读取(除非被用户级配置覆盖)。密码在此文件中是明文存储。
  • C) 错误: mysqld-auto.cnf 文件位于数据目录 (DATADIR),用于存储服务器通过 SET PERSIST 持久化的全局变量,与客户端连接凭证无关。
  • D) 正确: $HOME/.my.cnf 是用户家目录下的 MySQL 配置文件。用户可以在此文件的 [client] 组下定义自己的连接参数,优先级高于 /etc/my.cnf。密码在此文件中是明文存储。
  • E) 正确: $HOME/.mylogin.cnf 文件由 mysql_config_editor 工具创建和管理。它以加密格式存储连接凭证(包括密码),比在 .my.cnf 中明文存储更安全。客户端程序会优先尝试读取此文件。
  • F) 错误: $MYSQL_HOME/my.cnf 这个路径通常用于指定服务器特定的配置(如果设置了 MYSQL_HOME 环境变量),而不是客户端凭证的标准存储位置。
  • G) 错误: 这不是 MySQL 客户端凭证的标准存储路径。

因此,B, D, E 是存储客户端连接凭证以避免命令行输入的常用方法。

试题 16:

Choose two.

Examine the modified output:

1
2
3
4
5
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 1612

Seconds_Behind_Master value is steadily growing. What are two possible causes?

  • A) The master is producing a large volume of events in parallel but the slave is processing them serially. [正确]
  • B) This value shows only I/O latency and is not indicative of the size of the transaction queue. [错误]
  • C) One or more large tables do not have primary keys. [错误] (虽然可能导致变慢,但答案标记为错误)
  • D) The master is most probably too busy to transmit data and the slave needs to wait for more data. [正确] (解释为 Master 产生事件速度快于 Slave 处理速度)
  • E) The parallel slave threads are experiencing lock contention. [错误] (虽然可能导致变慢,但答案标记为错误)

题解:

Seconds_Behind_Master 显示的是从库 SQL 线程应用事件的时间戳与 I/O 线程从中库获取到的事件的时间戳之间的差距(秒数)。它的持续增长表明 SQL 线程的应用速度跟不上 I/O 线程接收事件的速度,即存在 SQL 线程延迟(Slave Lag)。

  • A) 正确: 如果主库能够并行执行事务并快速生成大量二进制日志事件,而从库默认是单线程应用这些事件(或者并行度不够高),那么从库的 SQL 线程就可能成为瓶颈,导致延迟不断增长。这是复制延迟的一个非常常见的原因。
  • B) 错误: Seconds_Behind_Master 主要反映的是 SQL 线程相对于 I/O 线程的延迟,而不是 I/O 线程本身的延迟。它直接指示了 SQL 应用队列的积压程度(以时间差衡量)。
  • C) 错误 (根据答案标记): 在使用基于行的复制(Row-Based Replication, RBR)时,如果被更新的表没有主键或有效的非空唯一键,从库在应用更新或删除事件时可能需要进行全表扫描来定位行,这会大大降低 SQL 线程的效率,导致延迟。这是一个可能的原因,但此题答案未选中它,可能认为 A 或 D 更普遍或直接。
  • D) 正确 (特定解释下): 这个选项的字面意思是主库太忙无法传输数据,这通常会导致 I/O 线程延迟(Slave_IO_Running: NoRead_Master_Log_Pos 停止前进)。但如果解释为“主库非常繁忙,以极高的速度产生二进制日志事件”,超出了从库 SQL 线程的处理能力,那么即使 I/O 线程能跟上(Slave_IO_Running: Yes),SQL 线程也会落后,导致 Seconds_Behind_Master 增长。这种解释下,此选项是正确的。
  • E) 错误 (根据答案标记): 如果从库配置了并行复制(slave_parallel_workers > 0),并且这些并行应用的 SQL 线程之间发生了锁争用(例如,更新同一行或存在间隙锁冲突),也会降低整体的应用速度,导致延迟。这也是一个可能的原因,但此题答案未选中。

综合来看,A 和 D(在特定解释下)被认为是两个主要原因。

试题 17:

Choose two.

Which two are true about binary logs used in asynchronous replication?

  • A) The master connects to the slave and initiates log transfer. [错误]
  • B) They contain events that describe all queries run on the master. [错误]
  • C) They contain events that describe database changes on the master. [正确]
  • D) They are pulled from the master to the slave. [正确]
  • E) They contain events that describe only administrative commands run on the master. [错误]

题解:

二进制日志 (Binary Logs) 是 MySQL 复制的基础。

  • A) 错误: 在标准的异步复制中,是从库(通过其 I/O 线程)主动连接到主库,请求传输二进制日志事件。
  • B) 错误: 二进制日志记录的是对数据库产生更改的操作。默认情况下,不修改数据的 SELECT 查询不会被记录。即使配置为记录所有语句(不推荐),其主要目的也是记录更改。日志格式可以是语句(Statement-Based Replication, SBR),也可以是行更改(Row-Based Replication, RBR,默认),或者是混合模式(Mixed)。
  • C) 正确: 二进制日志的核心功能就是记录发生在主库上的所有数据库更改事件(如 INSERT, UPDATE, DELETE, DDL 等),以便从库可以重放这些事件来达到数据同步。
  • D) 正确: 从库的 I/O 线程连接到主库后,会请求并“拉取”(pull)主库产生的新的二进制日志事件,并将它们写入从库本地的中继日志(Relay Log)。
  • E) 错误: 二进制日志记录的是数据更改操作(DML, DDL),不仅仅是管理命令。

试题 18:

You have appropriate privileges and are about to shut down a running MySQL server process on Oracle Linux 7. Which three are valid methods that will shut down the MySQL server?

  • A) mysqld_safe -S /tmp/mysql.sock SHUTDOWN [错误]
  • B) kill mysqld_safe [错误]
  • C) mysqladmin shutdown [正确]
  • D) mysql -S /tmp/mysql.sock –shutdown [错误]
  • E) mysqld_safe –shutdown [错误]
  • F) systemctl stop mysqld [正确]
  • G) mysql> SHUTDOWN; [正确]

题解:

关闭正在运行的 MySQL 服务器进程的有效方法:

  • A) 错误: mysqld_safe 是启动和监控 mysqld 进程的脚本,它不接受 SHUTDOWN 作为命令行参数。
  • B) 错误: kill mysqld_safe 只是杀死了 mysqld_safe 脚本进程,可能不会干净地关闭它管理的 mysqld 进程,可能导致数据不一致或恢复问题。不推荐。
  • C) 正确: mysqladmin 是 MySQL 的管理客户端工具,mysqladmin shutdown 命令会连接到服务器并发送一个关闭信号,触发服务器执行正常的、干净的关闭流程。
  • D) 错误: mysql 客户端没有 --shutdown 选项。
  • E) 错误: mysqld_safe 脚本没有 --shutdown 选项。
  • F) 正确: 在使用 systemd 管理服务的 Oracle Linux 7 系统上(以及其他现代 Linux 发行版),systemctl stop mysqld (或对应的服务名,如 mysql) 是标准的、推荐的停止服务的方式。它会执行预定义的关闭脚本,确保干净地停止 MySQL 服务器。
  • G) 正确: 在连接到 MySQL 服务器后(例如通过 mysql 客户端),如果用户拥有 SHUTDOWN 权限,可以直接执行 SQL 命令 SHUTDOWN; 来触发服务器的正常关闭流程。

因此,C, F, G 是有效且推荐的关闭方法。

试题 19:

Choose two.

Examine this MySQL Shell command:

1
dba.rebootClusterFromCompleteOutage()

Which two statements are true?

  • A) It stops and restarts all InnoDB Cluster instances and initializes the metadata. [错误]
  • B) It only stops and restarts all InnoDB Cluster instances. [错误]
  • C) It is not mandatory that all instances are running and reachable before running the command. [正确]
  • D) It performs InnoDB Cluster instances rolling restart. [正确] (根据答案标记为正确,但术语存疑)
  • E) It reconfigures InnoDB Cluster if the cluster was stopped. [错误] (根据答案标记为错误,但实际会重新配置)
  • F) It picks the minimum number of instances necessary to rebuild the quorum and reconfigures InnoDB Cluster. [错误]
  • G) It only starts all InnoDB Cluster instances. [错误]

答案: 参考文档 MySQL 8.0 for Database Administrators StudentGuide 2.pdf 页数 P431

题解:

dba.rebootClusterFromCompleteOutage() 是 MySQL Shell 中用于从 InnoDB Cluster 完全宕机(所有节点都停止或无法通信,可能导致元数据不一致)状态恢复集群的命令。它需要指定一个“种子”实例,集群将基于该实例的状态重新建立。

  • A) 错误: 它不是简单地重启所有实例。它使用一个种子实例来引导集群恢复,其他实例重新加入。它不一定会初始化元数据,而是尝试从最有数据的实例恢复。
  • B) 错误: 同 A。
  • C) 正确: 这个命令正是用于所有实例(或大部分实例)不可达或状态不一致的“完全宕机”场景。因此,执行命令时,并非所有实例都必须运行或可达。
  • D) 正确 (根据答案标记): 这个说法术语上可能不太准确。“滚动重启”通常指在集群保持在线的情况下逐个重启节点。而 rebootClusterFromCompleteOutage 是在集群已经宕机后进行恢复。但其效果可能是种子实例先启动并形成集群,然后其他实例逐个加入并可能重启以同步数据,从效果上看有点像序列化的重启过程。也许答案是基于这种效果的描述。
  • E) 错误 (根据答案标记): 这个命令的核心作用就是重新配置集群。它会根据选定的种子实例确定最新的事务集,并以此为基础强制形成新的集群成员视图(Group Replication Group),本质上就是重新配置集群的当前状态和成员。标记为错误的原因不明确,除非有非常特定的语境。
  • F) 错误: 它不是选择“最小数量”,而是通常选择数据最新的那个实例作为种子来恢复,然后重新配置集群。
  • G) 错误: 它不仅仅是启动实例,关键在于重新建立集群的一致性和成员关系。

基于提供的答案 C 和 D,解释如上。D 的术语值得商榷,E 被标记为错误也有些奇怪。

试题 20:

Choose two.

Examine this command and output: (见下图)

1
<html><body><table><tr><td colspan="10">root@dbhost:/var/lib/mysql#ls-al</td></tr><tr><td>total540 drwxrwxr-x1mysqlmysql</td><td></td><td></td><td></td><td>4096</td><td>Aug</td><td>22</td><td>14:07.</td><td></td><td></td></tr><tr><td></td><td></td><td>root root</td><td></td><td>4096</td><td>May</td><td>22</td><td>00:42.</td><td></td><td></td></tr><tr><td>drwxr-xr-x1</td><td></td><td></td><td></td><td>56</td><td></td><td>20</td><td></td><td>13:58auto.cnf</td><td></td></tr><tr><td>-rw-r-----</td><td></td><td></td><td>1mysqlmysql</td><td>4096</td><td>Aug Aug</td><td></td><td></td><td>21 10:28 accounting</td><td></td></tr><tr><td>drwxr-xr-x</td><td></td><td></td><td>1mysqlmysql</td><td>1112</td><td></td><td></td><td></td><td>13:58ca.pem</td><td></td></tr><tr><td>-rw-r--r--</td><td></td><td></td><td>1mysqlmysql</td><td></td><td></td><td>Aug20</td><td></td><td></td><td></td></tr><tr><td>-rw-r-</td><td>1</td><td></td><td>mysqlmysql</td><td>172040</td><td></td><td>Aug22</td><td></td><td></td><td>14:07 ib_buffer_pool</td></tr><tr><td>-rw-r-</td><td>1</td><td></td><td>mysqlmysql</td><td>12582919</td><td>Aug</td><td>22</td><td></td><td>14:07ibdata1</td><td></td></tr><tr><td>-rw-r-</td><td>1</td><td></td><td>mysqlmysql</td><td>50331648</td><td>Aug</td><td></td><td></td><td></td><td>2214:07ib_logfile0</td></tr><tr><td>-rw-r-</td><td>1</td><td></td><td>mysqlmysql</td><td>50331648</td><td>Aug</td><td></td><td></td><td></td><td>2013:47ib_logfile1</td></tr><tr><td>-rw-r-</td><td>1</td><td></td><td>mysqlmysql</td><td>292292</td><td>Aug</td><td></td><td></td><td>2214:07ibtmp1</td><td></td></tr><tr><td>drwxr-x--</td><td>1</td><td></td><td>mysqlusers</td><td>4096 64064</td><td>Aug Aug</td><td></td><td></td><td>2013:59mysq1</td><td></td></tr><tr><td>-rw-r-</td><td></td><td></td><td>1mysqlmysql</td><td>4096</td><td>Aug</td><td></td><td>2013:59</td><td></td><td>2215:18mysq1-error.log</td></tr><tr><td>drwxr-x--</td><td>1</td><td></td><td>mysqlmysql</td><td>1680</td><td></td><td>Aug20</td><td>13:59</td><td></td><td>performance_schema</td></tr><tr><td>-rw-rw--</td><td>1</td><td></td><td>mysqlmysql</td><td></td><td>452 Aug</td><td>20</td><td>13:59</td><td></td><td>private_key.pem</td></tr><tr><td>-rw-r--r--</td><td>1 1</td><td></td><td>mysql mysql mysqlmysql</td><td>1112</td><td>Aug</td><td>20</td><td></td><td>13:58</td><td>public_key.pem server-cert.pem</td></tr><tr><td>-rw-r--r-- rw-</td><td>1</td><td></td><td>mysqlmysql</td><td></td><td>1680</td><td>Aug</td><td>20</td><td>13:58</td><td>server-key.pem</td></tr><tr><td>drwxr-x---</td><td></td><td></td><td>mysqlmysql</td><td></td><td>4096</td><td>Aug 20</td><td></td><td>13:59</td><td></td></tr><tr><td></td><td>1</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>sys</td></tr></table></body></html>

(HTML output reformatted for clarity based on typical ls -al)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
drwxr-xr-x 1 mysql mysql  4096 Aug 22 14:07 .
drwxr-xr-x 1 root root 4096 May 22 00:42 ..
-rw-r----- 1 mysql mysql 56 Aug 20 13:58 auto.cnf
drwxr-xr-x 1 mysql mysql 4096 Aug 21 10:28 accounting <-- World readable/executable
-rw-r--r-- 1 mysql mysql 1112 Aug 20 13:58 ca.pem
-rw-r----- 1 mysql mysql 172040 Aug 22 14:07 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582919 Aug 22 14:07 ibdata1
-rw-r----- 1 mysql mysql 50331648 Aug 22 14:07 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Aug 20 13:47 ib_logfile1
-rw-r----- 1 mysql mysql 292292 Aug 22 14:07 ibtmp1
drwxr-x--- 1 mysql users 4096 Aug 20 13:59 mysql <-- Group 'users', Other execute
-rw-r----- 1 mysql mysql 64064 Aug 22 15:18 mysql-error.log
drwxr-x--- 1 mysql mysql 4096 Aug 20 13:59 performance_schema
-rw-rw---- 1 mysql mysql 452 Aug 20 13:59 private_key.pem <-- Group readable/writable
-rw-r--r-- 1 mysql mysql 1112 Aug 20 13:58 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Aug 20 13:58 server-cert.pem
-rw------- 1 mysql mysql 1680 Aug 20 13:58 server-key.pem
drwxr-x--- 1 mysql mysql 4096 Aug 20 13:59 sys

Which two options will improve the security of the MySQL instance?

  • A) Remove the world read/execute privilege from the accounting directory. [正确]
  • B) Remove world read privileges from the public_key.pem file. [错误]
  • C) Change the group ownership of the mysql directory to the mysql user group. [错误]
  • D) Change the parent directory owner and group to mysql. [错误]
  • E) Remove world read privileges from the server-cert.pem certificate file. [错误]
  • F) Remove group read/write privileges from the private_key.pem file. [正确]

答案: c 把 root 属主改成 mysql 应该是没有必要的 (这个注释似乎与选项 C 无关)

题解:

分析 ls -al 输出中不安全的权限设置:

  • accounting 目录: drwxr-xr-x - 其他用户(world)拥有读和执行权限。这可能允许非授权用户列出目录内容或访问其中的文件(如果文件权限允许)。
  • mysql 目录: drwxr-x--- - 属组是 users 而不是 mysql,并且其他用户(other)拥有执行权限。这可能允许非 mysql 组成员但属于 users 组的用户访问该目录,并且允许任何用户尝试访问该目录(虽然内部文件可能不允许)。
  • private_key.pem 文件: -rw-rw---- - 属组(group)拥有读和写权限。私钥文件应该只有属主(mysql)可以读写,属组和其他用户都不应有权限。

改进安全的措施:

  • A) 正确: 移除 accounting 目录的世界读/执行权限(例如 chmod o-rx accounting)。这限制了对该目录的访问,提高了安全性。
  • B) 错误: public_key.pem 是公钥文件,通常需要可读才能被客户端或其他服务使用。移除世界读权限可能破坏其功能,且公钥本身公开也无安全风险。
  • C) 错误:mysql 目录的属组从 users 改为 mysql 是一个好的实践,可以使权限管理更一致。但主要的安全风险在于其他用户的执行权限 (---x)。仅仅改变属组而不修改权限 (chmod o-x mysql),安全改进有限。相比 A 和 F,这不是最优先或最有效的安全改进。
  • D) 错误: 我们看到的是 /var/lib/mysql 目录的内容,其父目录是 /var/lib。更改 /var/lib 的属主属组为 mysql 是不合适的,会影响系统其他部分。
  • E) 错误: server-cert.pem 是服务器证书文件(公钥部分),通常需要对客户端可读以验证服务器身份。移除世界读权限可能阻止客户端验证服务器。
  • F) 正确: 移除 private_key.pem 文件的属组读写权限(例如 chmod g-rw private_key.pem)。私钥必须严格保护,只允许属主访问。

因此,A 和 F 是最直接且必要的安全改进措施。

试题 21:

Choose two.

Which two statements are true about general tablespaces?

  • A) General tablespaces support temporary tables. [错误]
  • B) Dropping a table from a general tablespace releases the space back to the operating system. [错误]
  • C) An existing table can be moved into a general tablespace. [正确]
  • D) A general tablespace can have multiple data files. [错误]
  • E) A new table can be created explicitly in a general tablespace. [正确]

答案: Creation of temporary general tablespaces is not supported. General tablespaces do not support temporary tables. InnoDB general tablespaces support only one data file per tablespace. You cannot add a second data file to an existing general tablespace. 参考文档 MySQL 8.0 for Database Administrators StudentGuide 1.pdf 页数 P154

题解: (同 试题 13)

  • A) 错误: 通用表空间不支持存储临时表。
  • B) 错误: 删除表仅在表空间内部释放空间,不直接返还给操作系统。
  • C) 正确: 可以使用 ALTER TABLE ... TABLESPACE = ... 将现有表移入通用表空间。
  • D) 错误: 每个通用表空间只有一个 .ibd 数据文件。
  • E) 正确: 可以使用 CREATE TABLE ... TABLESPACE = ... 在创建表时指定通用表空间。

试题 22:

Choose three.

Examine this command, which executes successfully:

1
cluster.addInstance('<user>@<host>:<port>', {recoveryMethod: 'clone'})

Which three statements are true?

  • A) It is always slower than recoveryMethod: ‘incremental’. [错误]
  • B) InnoDB tablespaces outside the datadir are able to be cloned. [正确]
  • C) A target instance must exist, then it will be provisioned with data from an instance already in the cluster and joined to the cluster. [正确]
  • D) The account used to perform this recovery needs the BACKUP_ADMIN privilege. [正确]
  • E) A new instance is installed, initialized, and provisioned with data from an instance already in the cluster and joined to the cluster. [错误]
  • F) InnoDB redo logs must not rotate for the duration of the execution; otherwise, the recovery will fail. [错误]

答案: 参考文档 MySQL 8.0 for Database Administrators StudentGuide 2.pdf 页数 P419 Cloning Remote Data User-created InnoDB tables and tablespaces that reside outside of the data directory on the donor MySQL server instance are cloned to the same path on the recipient MySQL server instance.

题解:

cluster.addInstance() 使用 recoveryMethod: 'clone' 时,会利用 MySQL 的 Clone 插件来添加新实例到 InnoDB Cluster。Clone 插件会从集群中的一个现有成员(donor)物理复制数据到新实例(recipient)。

  • A) 错误: 对于数据量较大的情况,物理克隆(clone)通常比增量恢复(incremental,基于应用二进制日志)更快,因为它直接复制数据文件。
  • B) 正确: MySQL Clone 插件能够处理位于数据目录之外的 InnoDB 表空间文件,只要这些文件在 donor 和 recipient 上的路径相同。
  • C) 正确: 执行此命令前,目标实例(recipient)的 MySQL 服务器软件需要已经安装好,并且处于可以被 MySQL Shell 连接和管理的状态(通常是已初始化但没有用户数据)。addInstance 过程会使用 Clone 插件从 donor 拉取数据来“配置”(provision)这个目标实例,然后将其加入集群。
  • D) 正确: 执行克隆操作需要在 donor 实例上拥有 BACKUP_ADMIN 权限(允许读取数据进行备份),在 recipient 实例上拥有 CLONE_ADMIN 权限(允许接收克隆数据)。执行 cluster.addInstance 的用户(通常是集群管理员)需要有权限在这两个实例上执行必要的操作,间接需要这些底层权限。
  • E) 错误: cluster.addInstance 不负责安装 MySQL 软件或进行初始的 mysqld --initialize。它假设这些已经完成,只负责数据同步和集群配置。
  • F) 错误: 克隆操作期间,donor 实例上的 InnoDB 重做日志(redo logs)可以正常轮转。克隆过程会处理好数据一致性。

试题 23:

Choose three.

Which three sets of item information are visible in the mysql system database?

  • A) time zone information and definitions [正确]
  • B) help topics [正确]
  • C) plugins [正确]
  • D) audit log events [错误]
  • E) performance monitoring information [错误]
  • F) rollback segments [错误]
  • G) information about table structures [错误]

答案: mysql Database MySQL stores the mysql system database on disk just like any other database. The mysql database contains information such as users, privileges, plugins, help topics, and timezone data. All the InnoDB tables in the mysql system database are stored in the mysql general tablespace (mysql.ibd) at the data directory level. Non InnoDB tables are stored in the mysql database Directory https://dev.mysql.com/doc/refman/8.0/en/system-schema.html

题解:

mysql 系统数据库存储了 MySQL 服务器运行所需的多种元数据和系统信息。

  • A) 正确: mysql 数据库包含 time_zone* 相关表,用于存储时区信息和定义。
  • B) 正确: mysql 数据库包含 help_* 相关表,存储了 HELP 命令显示的内容。
  • C) 正确: mysql 数据库包含 plugin 表,记录了服务器上已安装的插件信息。
  • D) 错误: 审计日志事件通常由审计插件记录到指定的文件或表中,不属于 mysql 系统数据库的核心内容。
  • E) 错误: 性能监控信息主要由 Performance Schema (performance_schema 数据库) 和 Sys Schema (sys 数据库) 提供。
  • F) 错误: 回滚段(Rollback Segments)是 InnoDB 存储引擎内部管理 Undo 信息的一种机制,其数据存储在 Undo 表空间中,不直接在 mysql 数据库的表中可见。
  • G) 错误: 在 MySQL 8.0 及以后版本,关于表结构(列、索引等)的权威信息存储在数据字典(Data Dictionary)中,而不是 mysql 数据库的传统表中(虽然物理上 DD 可能使用 mysql.ibd)。在 8.0 之前,部分信息可能在 mysql 库中,但现在主要在 DD。

试题 24:

Which two situations will cause the binary log to rotate?

  • A) FLUSH HOSTS executed [错误]
  • B) max_binlog_size exceeded [正确]
  • C) max_binlog_cache_size exceeded [错误]
  • D) SET sql_log_bin=1 executed [错误]
  • E) SET sync_binlog=1 executed [错误]
  • F) FLUSH LOGS executed [正确]

题解:

二进制日志轮转(Rotation)是指关闭当前的二进制日志文件,并开始写入一个新的二进制日志文件。

  • A) 错误: FLUSH HOSTS 命令用于清空主机缓存,与日志轮转无关。
  • B) 正确: 当一个二进制日志文件的大小达到全局变量 max_binlog_size 设定的阈值时,服务器会自动关闭当前文件并创建一个新的文件进行写入,即发生轮转。
  • C) 错误: max_binlog_cache_size 限制的是单个事务在内存中缓存二进制日志事件的最大大小。超过这个大小,事务的日志事件会被写入临时文件。它不直接触发日志文件的轮转。
  • D) 错误: SET sql_log_bin=1 (或 0) 用于在会话级别控制是否将当前会话的更改记录到二进制日志,不触发轮转。
  • E) 错误: SET sync_binlog=1 (或其他值) 控制二进制日志写入磁盘的同步频率,影响持久性,不触发轮转。
  • F) 正确: FLUSH LOGS 命令会显式地关闭并重新打开所有正在使用的日志文件,包括二进制日志(如果启用)。这会导致二进制日志强制轮转到一个新文件。服务器正常重启时也会发生日志轮转。

试题 25:

Choose three.

Which three statements are true about MySQL replication?

  • A) Each slave must have its own MySQL user for replication. [错误]
  • B) A replication user must have the SELECT privilege for all tables that need to be replicated. [错误]
  • C) Each instance in a replication topology must have a unique server ID. [正确]
  • D) Any instance can have multiple slaves, but it can have only one master. [错误]
  • E) Binary logs contain only transactions originating from a single MySQL instance. [错误]
  • F) Replication can use only TCP/IP connections. [正确]
  • G) Binary logging must be enabled on the master in order to replicate to other instances. [正确]

题解:

关于 MySQL 复制的基本事实:

  • A) 错误: 多个从库可以(并且通常是)使用同一个专门创建的复制用户账号连接到主库。没有必要为每个从库创建单独的用户。
  • B) 错误: 复制用户账号需要的主要权限是 REPLICATION SLAVE。这个权限允许它连接到主库并请求二进制日志。它不需要对被复制的表拥有 SELECT 权限。
  • C) 正确: 在一个复制拓扑中,每个 MySQL 实例(无论是主库还是从库)都必须配置一个全局唯一的 server_id(或 server_uuid)。这是区分不同服务器、防止复制循环的关键。
  • D) 错误: 一个 MySQL 实例可以同时作为多个从库的主库(一主多从),也可以同时作为多个主库的从库(多源复制,需要特定配置)。
  • E) 错误: 二进制日志记录的是在其所在实例上发生的更改。如果一个实例是从库,并且配置了 log_slave_updates=ON,那么它从其主库复制过来的更改也会被记录到它自己的二进制日志中。因此,二进制日志可能包含源自本地的事务和源自上游主库的事务。
  • F) 正确: MySQL 的标准异步复制和半同步复制依赖于 TCP/IP 网络连接来实现主库和从库之间的通信。
  • G) 正确: 主库必须启用二进制日志(通过设置 log_bin 系统变量),因为二进制日志是复制内容的来源。没有二进制日志,从库就无法获取主库的更改事件。

试题 26:

The data in this instance transient; no backup or replication will be required. It is currently under performing. The database size is static and including indexes is 19G. Total system memory is 32G. After profiling the system, you highlight these MySQL status and global variables:

1
2
3
4
5
6
7
Com_rollback = 85408355
Com_commit = 1234342
Innodb_buffer_pool_pages_free = 163840
[mysqld]
Buffer_pool_size = 20G
Innodb_flush_log_at_trx_commit = 2
Disable-log-bin

The OS metrics indicate that disk is a bottleneck. Other variables retain their default values. Which two changes will provide the most benefit to the instance?

  • A) sync_binlog = 0 [错误]
  • B) buffer_pool_size = 24G [正确]
  • C) innodb_flush_log_at_trx_commit = 1 [错误]
  • D) innodb_doublewrite = 0 [正确]
  • E) max_connections = 10000 [错误]
  • F) innodb_log_file_size = 1G [错误]

题解:

情况:数据瞬态(不需要备份/复制,完整性要求低),性能不佳,磁盘是瓶颈。数据 19G,内存 32G,缓冲池 20G,有空闲缓冲池页,innodb_flush_log_at_trx_commit=2(性能优先,牺牲一点持久性),log-bin 已禁用。回滚次数远大于提交次数,可能暗示大量无效操作或错误处理。

目标:提升性能,主要解决磁盘瓶颈,可以牺牲一些完整性。

  • A) 错误: 二进制日志已禁用 (Disable-log-bin),所以 sync_binlog 的设置无效。
  • B) 正确: 将缓冲池从 20G 增加到 24G(或更高,如 25-28G,只要给 OS 留足够内存)。数据总量 19G,更大的缓冲池可以缓存更多的数据和索引,显著减少磁盘读 I/O,直接缓解磁盘瓶颈。
  • C) 错误:innodb_flush_log_at_trx_commit 从 2 改为 1 会增加每次事务提交时的磁盘 I/O(强制日志刷盘),加剧磁盘瓶颈,与目标相反。改为 0 会进一步减少 I/O,但已经是 2 了。
  • D) 正确: 设置 innodb_doublewrite = 0 可以禁用 InnoDB 的双写缓冲区。双写是为了防止部分页写入导致的数据损坏,但会带来额外的写 I/O 开销。既然数据是瞬态的,完整性要求不高,禁用双写可以显著减少写 I/O,缓解磁盘瓶颈。
  • E) 错误: 增加最大连接数 (max_connections) 与解决磁盘瓶颈无直接关系,反而可能因资源竞争加剧问题。
  • F) 错误: 增加 InnoDB 日志文件大小 (innodb_log_file_size) 主要减少日志切换和检查点的频率,对写性能有帮助。但当前 innodb_flush_log_at_trx_commit=2 已经大大降低了日志刷盘频率。相比增加缓冲池 (B) 或禁用双写 (D) 对缓解磁盘瓶颈(特别是读瓶颈或写瓶颈)的效果可能更直接。

因此,增加缓冲池 (B) 和禁用双写 (D) 是针对当前情况最有效的两个性能优化措施。

试题 27:

Choose two.

User ‘fwuser`@’localhost’ is registered with the MySQL Enterprise Firewall and has been granted privileges for the SAKILA database. Examine these commands that you executed and the results:
mysql> SELECT MODE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS WHERE USERHOST = ‘fwuser@localhost’; (见下图)

1
2
3
4
5
+-----------+
| MODE |
+-----------+
| PROTECTING |
+-----------+

You then execute this command:
mysql> CALL mysql.sp_set_firewall_mode(‘fwuser@localhost’, ‘RESET’);
Which two are true?

mysql> SELECT RULE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELIST WHERE USERHOST=‘fwuser@localhost’;

1
2
3
4
5
6
7
8
+--------------------------------------------------------------------------+
| RULE |
+--------------------------------------------------------------------------+
| SELECT `first_name`, `last_name` FROM `customer` WHERE `customer_id` = ? |
| SELECT `get_customer_balance`( ?, NOW() ) |
| UPDATE `rental` SET `return_date` = NOW() WHERE `rental_id` = ? |
| SELECT @@`version_comment` LIMIT ? |
+--------------------------------------------------------------------------+
  • A) The fwuser@localhost account is removed from the mysql.user table. [错误]
  • B) The information_schema.MYSQL_FIREWALL_WHITELIST table is truncated. [错误]
  • C) The whitelist of the fwuser@localhost account is truncated. [正确]
  • D) The mysql.firewall_users table is truncated. [错误]
  • E) The firewall resets all options to default values. [错误]
  • F) The fwuser@localhost account mode is set to DETECTING. [错误]
  • G) The fwuser@localhost account mode is set to OFF. [正确]

答案: When a profile is assigned any of the preceding mode values, the firewall stores the mode in the profile. Firewall mode-setting operations also permit a mode value of RESET, but this value is not stored: setting a profile to RESET mode causes the firewall to delete all rules for the profile and set its mode to OFF. RESET 概要文件设置为 RESET 模式会导致防火墙删除概要文件的所有规则并将其模式设置为 OFF。设置为 RESET 时,除了关闭 Firewall 保护,同时也会将该账号之前训练学习的白名单全部清空,这样下次再想采用 Firewall 保护就需要重头开始了,除非再也不用了,否则不建议这么做 https://dev.mysql.com/doc/refman/8.0/en/firewall-usage.html
b 选项指定的表是对的,但其中保存了全部的 profile。

题解:

MySQL 企业防火墙 (Enterprise Firewall) 通过记录和强制执行允许的 SQL 语句模式(白名单)来保护数据库。sp_set_firewall_mode 存储过程用于设置特定用户配置文件的模式。

当模式设置为 RESET 时,根据文档:

  1. 该用户配置文件的所有白名单规则(存储在 mysql.firewall_whitelist 表中对应记录)将被删除。
  2. 该用户配置文件的模式(存储在 mysql.firewall_users 表中对应记录)将被设置为 OFF
  • A) 错误: 防火墙操作不影响 mysql.user 表中的用户账户本身。
  • B) 错误: RESET 只影响指定用户 (fwuser@localhost) 的规则,不会清空整个白名单表(该表包含所有受防火墙管理用户的规则)。
  • C) 正确: fwuser@localhost 账户对应的白名单规则会被删除(清空)。
  • D) 错误: RESET 只修改 fwuser@localhostmysql.firewall_users 表中的模式记录,不会清空整个表。
  • E) 错误: RESET 只重置指定用户配置文件的规则和模式,不影响防火墙的全局或其他默认设置。
  • F) 错误: 模式被设置为 OFF,不是 DETECTING
  • G) 正确: 模式被设置为 OFF

试题 28:

Choose two.

Examine this statement and output:

1
2
3
4
5
6
7
8
mysql> SHOW GRANTS FOR jsmith;
+----------------------------------------------------------+
| Grants for jsmith@% |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jsmith'@'%' |
| GRANT UPDATE (Name) ON `world`.`country` TO 'jsmith'@'%' |
+----------------------------------------------------------+
2 rows in set (0.00 sec)

Which two SQL statements can jsmith execute?

  • A) UPDATE world.country SET Name = CONCAT(‘New ‘, Name); [错误]
  • B) UPDATE world.country SET Name = ‘one’ LIMIT 1; [正确]
  • C) UPDATE world.country SET Name = ‘first’ ORDER BY Name LIMIT 1; [错误]
  • D) UPDATE world.country SET Name = ‘all’; [正确]
  • E) UPDATE world.country SET Name = ‘new’ WHERE Name = ‘old’; [错误]

答案: 权限里缺少 select 语句

题解:

用户 jsmith 拥有的权限是:

  1. USAGE ON *.*: 允许连接到服务器,但没有数据库级别的操作权限。
  2. UPDATE (Name) ON world.country: 只允许更新 world.country 表中的 Name 列。

关键在于,执行 UPDATE 语句时,如果语句中涉及读取其他列(例如在 WHERE 子句、ORDER BY 子句或 SET 子句的表达式中),用户也需要对那些被读取的列拥有 SELECT 权限。jsmith 只有 UPDATE(Name) 权限,没有 SELECT 权限。

  • A) 错误: SET Name = CONCAT('New ', Name) 需要读取当前的 Name 列值,这隐式需要 SELECT(Name) 权限,jsmith 没有。
  • B) 正确: SET Name = 'one' LIMIT 1 只更新 Name 列为一个常量值,没有 WHEREORDER BY 子句读取其他列。这是允许的。
  • C) 错误: ORDER BY Name 需要读取 Name 列进行排序,需要 SELECT(Name) 权限。
  • D) 正确: SET Name = 'all' 只更新 Name 列为一个常量值,没有 WHEREORDER BY。这是允许的。
  • E) 错误: WHERE Name = 'old' 需要读取 Name 列进行比较,需要 SELECT(Name) 权限。

试题 29:

Choose two.

There are five MySQL instances configured with a working group replication. Examine the output of the group members:

1
mysql> SELECT MEMBER_ID, MEMBER_STATE FROM performance_schema.replication_group_members;
1
2
3
4
5
6
7
8
9
+------------------------------------------+-----------------+
| MEMBER_ID | MEMBER_STATE |
+------------------------------------------+-----------------+
| 1999b9fb-4aaf-11e6-bb54-28b2bd168d07 | UNREACHABLE |
| 199b2df7-4aaf-11e6-bb16-28b2bd168d07 | ONLINE |
| 199bb88e-4aaf-11e6-babe-28b2bd168d07 | ONLINE |
| 19ab72fc-4aaf-11e6-bb51-28b2bd168d07 | UNREACHABLE |
| 19b33846-4aaf-11e6-ba81-28b2bd168d07 | UNREACHABLE |
+------------------------------------------+-----------------+

Which two statements are true about network partitioning in the cluster?

  • A) The group replication will buffer the transactions on the online nodes until the unreachable nodes return online. [错误]
  • B) A manual intervention to force group members to be only the working two instances is required. [正确]
  • C) The cluster will shut down to preserve data consistency. [错误]
  • D) There could be both a 2 node and 3 node group replication still running, so shutting down group replication and diagnosing the issue is recommended. [正确]
  • E) The cluster has built-in high availability and updates group_replication_ip_whitelist to remove the unreachable nodes. [错误]

题解:

情况:一个 5 节点的 Group Replication 集群,现在只有 2 个节点状态为 ONLINE,另外 3 个为 UNREACHABLE

Group Replication (GR) 依赖于组成员之间就事务顺序和提交达成共识(Quorum)。对于一个 N 个节点的组,需要至少 floor(N/2) + 1 个节点在线才能形成多数派(Quorum)并继续处理写事务。

在这个 5 节点的集群中,Quorum 需要 floor(5/2) + 1 = 2 + 1 = 3 个节点。当前只有 2 个节点 ONLINE,不足以达到 Quorum。

  • A) 错误: 当集群失去 Quorum 时,剩余的少数派分区(这里是 2 个 ONLINE 节点)会进入只读模式或阻塞写操作,以防止数据不一致(脑裂)。它们不会无限期缓冲事务等待其他节点恢复。
  • B) 正确: 由于失去了 Quorum,集群无法自动恢复。需要管理员手动干预。一种方法是修复网络分区,让足够多的节点重新变为 ONLINE 以达到 Quorum。另一种方法是(如果确认网络问题无法立即解决且需要让部分集群恢复写服务),可以使用 group_replication_force_members 变量在少数派分区(这 2 个 ONLINE 节点)上强制形成一个新的、较小的集群视图。这需要谨慎操作。
  • C) 错误: 集群(指剩余的 ONLINE 节点)不会完全“关闭”,但它们会停止处理需要 Quorum 的操作(主要是写事务),以保证数据一致性。读操作可能仍然可用(取决于配置)。
  • D) 正确: 这种情况很可能是网络分区造成的。可能存在一个包含 2 个 ONLINE 节点的分区和一个包含 3 个 UNREACHABLE 节点的分区(这 3 个节点之间可能仍然可以通信)。由于两个分区都没有达到原集群的 Quorum (3/5),理论上两个分区都应该阻塞写操作。诊断网络问题并解决分区是首要任务。在某些复杂情况下,可能需要停止 GR 并重新引导集群。
  • E) 错误: GR 具有高可用性,但它不能自动解决导致 Quorum 丢失的网络分区问题,也不会自动修改 group_replication_ip_whitelist。需要手动干预。

试题 30:

Choose two.

Which two statements are true about InnoDB data-at-rest encryption?

  • A) It supports all indexes transparently. [正确]
  • B) It decrypts data for use in memory. [正确]
  • C) It supports only non-blob datatypes. [错误]
  • D) It does not support the transportable tablespaces feature. [错误]
  • E) It enforces encryption from disk to memory and over network transmission. [错误]

答案: 参考文档 MySQL 8.0 for Database Administrators StudentGuide 2.pdf 页数 P77

题解:

InnoDB 静态数据加密(Data-at-Rest Encryption),也称为透明数据加密(Transparent Data Encryption, TDE)。

  • A) 正确: InnoDB TDE 在表空间级别进行加密(包括系统表空间、独立表空间、通用表空间)。存储在加密表空间中的所有数据,包括表数据和相关的索引数据,都会被加密。这个过程对用户和应用程序是透明的。
  • B) 正确: 加密只发生在数据写入磁盘时,以及从磁盘读取数据后。当数据页从磁盘读入 InnoDB 缓冲池(内存)时,会被解密。在内存中处理数据时,数据是未加密的。
  • C) 错误: TDE 支持存储在加密表空间中的所有 InnoDB 数据类型,包括 BLOB, TEXT 等大对象类型。
  • D) 错误: TDE 支持 可传输表空间(Transportable Tablespaces)功能。在传输加密的表空间时,需要同时管理好加密密钥(通常通过 keyring 插件)。
  • E) 错误: TDE 只负责数据在磁盘上(at-rest)的加密。它不负责数据在内存中的加密(数据在内存中是解密的),也不负责数据在网络传输过程中的加密(网络加密需要使用 TLS/SSL 连接)。

试题 31:

Choose three.

Which three statements are true about MySQL Enterprise Firewall?

  • A) On Windows systems, it is controlled and managed using the Windows Internet Connection Firewall control panel. [错误]
  • B) System tables named firewall_users and firewall_whitelist in the mysql database provide persistent storage of firewall data. [正确]
  • C) It is available only in MySQL Enterprise versions. [正确]
  • D) It provides INFORMATION_SCHEMA tables that enable views into firewall data. [正确]
  • E) Firewall functionality is dependent on SHA-256 and ANSI-specific functions built in to the mysql.firewall table. [错误]
  • F) It shows only notifications for blocked connections, which originated outside of your network’s primary domain. [错误]

答案: 参考文档 MySQL 8.0 for Database Administrators StudentGuide 2.pdf 页数 P91

题解:

MySQL 企业防火墙 (MySQL Enterprise Firewall) 是 MySQL 企业版提供的一个安全特性。

  • A) 错误: MySQL 企业防火墙是 MySQL 服务器内部的一个功能,通过 SQL 接口(存储过程、系统表、信息模式视图)进行管理,与操作系统的防火墙(如 Windows 防火墙)无关。
  • B) 正确: 防火墙的用户配置文件(模式、选项)存储在 mysql.firewall_users 系统表中,允许的 SQL 语句模式(白名单规则)存储在 mysql.firewall_whitelist 系统表中。这些表提供了防火墙数据的持久化存储。
  • C) 正确: 这是 MySQL 企业版(Enterprise Edition)的专有功能,在社区版(Community Edition)中不可用。
  • D) 正确: MySQL 提供了 INFORMATION_SCHEMA.MYSQL_FIREWALL_USERSINFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELIST 这两个视图,可以方便地查询当前加载的防火墙配置和规则信息。
  • E) 错误: 防火墙的功能不依赖于特定的哈希函数(如 SHA-256)或不存在的 mysql.firewall 表。它基于对 SQL 语句进行解析和模式匹配。
  • F) 错误: 防火墙根据配置的模式(如 RECORDING, PROTECTING, DETECTING)工作。在 PROTECTING 模式下,它会阻止(block)不在白名单中的语句,并可以记录这些事件。它不区分连接的来源域,而是基于语句是否匹配规则。

试题 32:

Choose two.

Which two storage engines provide a view of the data consistent with the storage system at any moment?

  • A) InnoDB [正确]
  • B) ARCHIVE [错误]
  • C) MyISAM [错误]
  • D) MEMORY [错误]
  • E) NDB [正确]

题解:

“提供数据在任意时刻与存储系统一致的视图”通常指的是存储引擎支持事务和多版本并发控制(MVCC),能够提供一致性读(Consistent Read)快照。

  • A) 正确: InnoDB 是一个事务性存储引擎,实现了 MVCC。它可以通过事务隔离级别(如 REPEATABLE READ, READ COMMITTED)为查询提供一个数据在某个时间点的一致性快照视图,即使其他事务正在修改数据。
  • B) 错误: ARCHIVE 引擎是一个用于归档的、只支持插入和查询的引擎,不支持事务和 MVCC,不提供一致性读。
  • C) 错误: MyISAM 是非事务性引擎,使用表级锁定。它不提供 MVCC 或行级的一致性读快照。读取操作可能会看到其他并发 DML 操作的部分结果(脏读,取决于操作顺序和锁定)。
  • D) 错误: MEMORY (HEAP) 引擎也是非事务性的,通常使用表级锁定,不提供 MVCC。
  • E) 正确: NDB (MySQL Cluster) 存储引擎是为 MySQL Cluster 设计的分布式、高可用、事务性存储引擎。它支持事务和 MVCC,能够提供一致性视图。

试题 33:

Choose three.

Which three are requirements for a secure MySQL Server environment?

  • A) Minimize the number of non-MySQL Server-related processes running on the server host. [错误] (根据答案标记为错误,但通常是最佳实践)
  • B) Restrict the number of OS users that have access at the OS level. [正确]
  • C) Ensure appropriate file system privileges for OS users and groups. [正确]
  • D) Keep the entire software stack on one OS host. [正确] (解释为保持 MySQL 组件在同一主机)
  • E) Encrypt the file system to avoid needing exact file-system permissions. [错误]
  • F) Run MySQL server as the root user to prevent incorrect sudo settings. [错误]

题解:

构建安全的 MySQL 服务器环境涉及多个层面。

  • A) 错误 (根据答案标记): 最小化服务器上运行的无关进程是标准的服务器安全加固(hardening)最佳实践,可以减少攻击面。但此题答案未选中,可能认为这是通用 OS 安全而非 MySQL 特定要求。
  • B) 正确: 限制能够登录到 MySQL 服务器操作系统的用户数量,特别是拥有高权限(如 root 或 sudo)的用户数量,可以减少潜在的内部威胁或因账户泄露导致的安全风险。
  • C) 正确: 确保 MySQL 数据目录、日志文件、配置文件等具有严格的文件系统权限至关重要。通常只有运行 MySQL 服务器的特定用户(如 mysql)应该拥有读写权限,其他用户应尽可能限制访问。
  • D) 正确 (特定解释下): 这个说法本身比较模糊。如果理解为将应用程序、Web 服务器和数据库都放在同一台主机上,这通常被认为是不安全的(单点故障/风险集中)。但如果理解为将 MySQL 服务器的所有组件(如二进制文件、数据文件、日志文件)都部署在专用的、受控的数据库服务器主机上,而不是分散到网络文件系统或其他不可信位置,那么这可以视为一种安全要求(保持组件的物理和逻辑集中性,便于管理和保护)。
  • E) 错误: 文件系统加密(如 dm-crypt/LUKS)可以保护数据在磁盘被盗或物理访问时的机密性,但它不能替代正确的文件系统权限设置。即使文件系统加密了,登录到系统的授权用户仍然需要通过文件权限来控制对 MySQL 文件的访问。
  • F) 错误:root 用户身份运行 MySQL 服务器是极度危险和不推荐的做法。这会给予 MySQL 进程过高的系统权限,一旦 MySQL 服务本身被攻破,攻击者就能获得整个系统的 root 权限。应该使用专用的、低权限的用户(如 mysql)来运行。

基于提供的答案 B, C, D,解释如上。

试题 34:

Choose two.

Examine this list of MySQL data directory binary logs:

1
2
3
4
5
6
7
binlog.000001
binlog.000002
.......
binlog.000289
binlog.000300
binlog.000301
binlog.index

Now examine this command, which executes successfully:

1
mysqldump --delete-master-logs --all-databases > /backup/db_backup.sql

Which two are true?

  • A) All databases are backed up to the output file. [正确]
  • B) All non-active binary logs are removed from the master. [正确]
  • C) All binary logs are backed up and then deleted. [错误]
  • D) All binary logs are deleted from the master. [错误]
  • E) All databases, excluding master metadata, are backed up to the output file. [错误]
  • F) All details regarding deleted logs and master metadata are captured in the output file. [错误]

答案: 参考文档 MySQL 8.0 for Database Administrators StudentGuide 2.pdf 页数 P293

题解:

分析 mysqldump 命令及其选项:

  • mysqldump: 用于创建数据库逻辑备份(SQL 语句)。
  • --all-databases: 指定备份服务器上的所有数据库。
  • --delete-master-logs: 这个选项的作用是,在 mysqldump 成功完成后,它会向 MySQL 服务器发送一个 PURGE BINARY LOGS 命令,删除早于当前正在写入的二进制日志文件的所有二进制日志文件。它不会删除当前活动的日志文件。
  • > /backup/db_backup.sql: 将备份输出重定向到指定的 SQL 文件。

执行结果:

  • A) 正确: --all-databases 选项确保了所有数据库都被包含在 /backup/db_backup.sql 备份文件中。
  • B) 正确: --delete-master-logs 会删除所有非活动的二进制日志文件。假设在 dump 结束时,活动的日志是 binlog.000301,那么 binlog.000001binlog.000300 都会被删除。
  • C) 错误: mysqldump 本身不备份二进制日志文件内容,它创建的是 SQL 备份。删除日志是 --delete-master-logs 的附加效果。
  • D) 错误: 只删除非活动的日志,当前活动的日志文件会保留。
  • E) 错误: --all-databases 包含了所有数据库,包括 mysql, information_schema, performance_schema, sys 这些包含元数据和系统信息的数据库。
  • F) 错误: 备份文件主要包含 CREATEINSERT 等 SQL 语句。它会包含主库的 GTID 信息(如果启用),但不会包含关于哪些日志被删除的详细列表。

试题 35:

You want to install and configure MySQL on Linux server with tarball binaries in the /app/mysql/ directory, where the bin directory is found at /app/mysql/bin and the data directory at /app/data. Which two parameters are required to configure the MySQL instance?

  • A) The configuration basedir = /app/mysql is needed. [正确]
  • B) The configuration datadir = /app/data is needed. [正确]
  • C) The configuration log-bin = /app/data is needed. [错误]
  • D) The configuration datadir = /app/mysql/data is needed [错误]
  • E) The configuration innodb_log_group_home_dir = /datadir is needed. [错误]
  • F) The configuration basedir = /app/mysql/bin is needed. [错误]

题解:

使用 tarball(二进制压缩包)安装 MySQL 时,通常需要明确告诉 mysqld 服务器进程它的基础安装目录 (basedir) 和数据存储目录 (datadir) 在哪里,特别是当这些目录不在编译时默认的预期位置时。

  • basedir: 指向 MySQL 安装的根目录,服务器需要在这里找到它的支持文件(如 share/ 目录下的错误消息文件、字符集文件等)。在本例中,安装根目录是 /app/mysql/
  • datadir: 指向 MySQL 存储数据库文件(表、索引、日志等)的目录。在本例中,指定的数据目录是 /app/data/

因此:

  • A) 正确: 需要设置 basedir = /app/mysql,告诉服务器安装文件的根位置。
  • B) 正确: 需要设置 datadir = /app/data,告诉服务器数据文件的存储位置。
  • C) 错误: log-bin 用于启用二进制日志,是可选配置,不是启动实例的必需配置。
  • D) 错误: 指定的数据目录是 /app/data,不是 /app/mysql/data
  • E) 错误: innodb_log_group_home_dir 用于指定 InnoDB 重做日志的位置,是可选配置(默认在 datadir),不是必需的。
  • F) 错误: basedir 应该是安装根目录 /app/mysql,而不是 bin 子目录。

试题 36:

A valid raw backup of the shop.customers MyISAM table was taken. You must restore the table. You begin with these steps:

  1. Confirm that secure_file_priv = '/var/tmp'
  2. mysql> DROP TABLE shop.customers;
  3. shell> cp /backup/customers.MY* /var/lib/mysql/shop/

Which two actions are required to complete the restore? (Choose two.)

  • A) shell> cp /backup/customers.sdi /var/tmp [正确]
  • B) shell> cp /backup/customers.sdi /var/lib/mysql/shop/ [错误]
  • C) mysql> SOURCE '/var/tmp/customers.sdi' [错误]
  • D) mysql> IMPORT TABLE FROM '/var/tmp/customers.sdi' [正确]
  • E) shell> cp /backup/customers.frm /var/lib/mysql/shop/ [错误]
  • F) mysql> IMPORT TABLE FROM '/var/lib/mysql/shop/customers.sdi' [错误]
  • G) mysql> ALTER TABLE shop.customers IMPORT TABLESPACE [错误]
  • H) mysql> ALTER TABLE shop.customers DISCARD TABLESPACE [错误]

题解:

恢复 MyISAM 表的原始备份(文件级备份)。在 MySQL 8.0+ 中,表结构定义存储在数据字典中,并通过 .sdi (Serialized Dictionary Information) 文件表示。旧版本的 .frm 文件不再使用。

步骤:

  1. 确认 secure_file_priv 路径,这是 MySQL 允许进行文件导入操作的安全路径。
  2. 删除已存在的表(如果存在)。
  3. 将 MyISAM 表的数据文件 (.MYD) 和索引文件 (.MYI) 从备份位置复制到 MySQL 数据目录下对应的数据库目录中。

此时,数据和索引文件已就位,但 MySQL 服务器的数据字典中还没有这个表的定义。需要从备份的 .sdi 文件导入表结构。

完成恢复所需的后续步骤:

  • A) 正确: 需要将备份的表结构文件 customers.sdi 复制到 secure_file_priv 指定的目录 (/var/tmp),因为 IMPORT TABLE 命令只能从这个安全目录读取文件。
  • B) 错误:.sdi 文件复制到数据目录是无效的,IMPORT TABLE 不会从那里读取。
  • C) 错误: SOURCE 命令用于执行 SQL 脚本文件,不能用于导入 .sdi 文件。
  • D) 正确: 执行 IMPORT TABLE FROM '/var/tmp/customers.sdi' 命令。这个命令会读取指定路径下的 .sdi 文件,解析其中的表结构信息,并将其注册到 MySQL 数据字典中,从而完成表的恢复。
  • E) 错误: .frm 文件是旧版本 MySQL 使用的,在 8.0+ 中无效。
  • F) 错误: IMPORT TABLE 必须从 secure_file_priv 指定的路径读取 .sdi 文件。
  • G) 错误: IMPORT TABLESPACE 是用于 InnoDB 表空间传输的命令。
  • H) 错误: DISCARD TABLESPACE 是用于 InnoDB 表空间操作的命令。

因此,需要先将 .sdi 文件复制到安全路径 (A),然后执行 IMPORT TABLE 命令 (D)。

试题 37:

Choose two.

You are investigating performance problems in a MySQL database; all data fits in memory. You determine that SELECT queries to one table is the main cause for poor response times. Which two have the biggest potential for eliminating the problem?

  • A) high concurrency [正确]
  • B) operating system resources [错误]
  • C) column definitions [错误]
  • D) innodb mutexes [错误] (根据答案标记为错误,但与A相关)
  • E) non-transaction storage engine [正确] (解释为使用非事务引擎导致的问题)
  • F) table indexes [错误]

答案: 数据都在内存里

题解:

情况:性能问题主要由对单个表的 SELECT 查询引起,并且所有相关数据都能装入内存。这意味着磁盘 I/O 不是主要的瓶颈。

潜在原因分析:

  • A) 正确: 即使数据在内存中,大量的并发 SELECT 查询仍然可能导致性能问题。原因可能包括:
    • CPU 资源耗尽:大量的查询需要 CPU 进行处理。
    • 内部锁/闩(Latch/Mutex)争用:高并发访问可能导致对 InnoDB 内部数据结构(如缓冲池、数据字典)的保护锁/闩产生争用。
    • 连接管理开销:大量连接的建立和管理本身也有开销。
  • B) 错误: 虽然操作系统资源(如 CPU、网络带宽)最终会成为瓶颈,但题目暗示问题与特定表的 SELECT 相关,指向数据库内部的可能性更大。如果只是泛指 OS 资源不足,不如 A 或 E 具体。
  • C) 错误: 列定义(如数据类型)本身不太可能是在数据已在内存情况下导致 SELECT 慢的主要原因,除非是非常极端的情况(如超大列的比较)。通常索引问题影响更大,但 F 被标记为错误。
  • D) 错误 (根据答案标记): InnoDB 互斥锁(mutexes)和读写锁(rw-locks)的争用正是高并发 (A) 可能导致的具体问题之一。将 A 选为正确而 D 选为错误有点矛盾,除非 D 被认为过于具体,而 A 更概括。
  • E) 正确 (特定解释下): 如果该表使用的存储引擎是非事务性的(如 MyISAM),它通常使用表级锁定。虽然 SELECT 通常使用共享锁,不阻塞其他 SELECT,但如果同时有 UPDATEDELETE 操作发生,它们会请求排他锁,阻塞后续的所有操作(包括 SELECT),直到 DML 完成。在高并发读写混合场景下,表锁可能成为严重瓶颈。因此,“non-transaction storage engine” 本身可能是导致 SELECT 响应时间不佳的原因。
  • F) 错误: 如果数据完全在内存中,索引查找会非常快。虽然糟糕的索引或全表扫描仍然会消耗 CPU,但题目似乎暗示问题不仅仅是索引本身,而是并发或引擎特性。

因此,高并发 (A) 和可能由非事务性引擎(如 MyISAM)的表锁引起的问题 (E) 是在数据已在内存中最可能导致 SELECT 性能问题的两大因素。

试题 38:

Choose two.

You have semi-synchronous replication configured and working with one slave. rpl_semi_sync_master_timeout has never been reached. You find that the disk system on the master has failed and as a result, the data on the master is completely unrecoverable.

Which two statements are true?

  • A) The slave automatically identifies that the master is unreachable and performs any required actions so that applications can start using the slave as the new master. [错误]
  • B) Reads from the slave can return outdated data until the value of the rpl_semi_sync_master_timeout variable is reached. [错误]
  • C) No committed transactions are lost. [正确]
  • D) Reads from the slave can return outdated data for some time, until it applies all transactions from its relay log. [正确]
  • E) A small amount of committed transactions may be lost in case they were committed just before the disk failure. [错误]
  • F) As soon as the incident happens, application can read data from the slave and rely on it to return a full and current set of data. [错误]

答案: rpl_semi_sync_master_timeout has never been reached, 还没有 timeout,if reaches then it will change to async mode.

题解:

情况:半同步复制(Semi-Synchronous Replication),主库等待至少一个从库确认收到事务事件(写入 relay log)后才在主库提交事务。超时从未发生,意味着从库总能及时确认。现在主库磁盘故障,数据丢失。

半同步复制的保证(在超时未发生时):

  • 主库上已提交的事务,其对应的二进制日志事件一定已经被至少一个从库接收并写入了中继日志(relay log)。

分析:

  • A) 错误: MySQL 标准复制(包括半同步)不提供自动故障转移(failover)功能。需要外部工具(如 MHA, Orchestrator, InnoDB Cluster/ReplicaSet)或手动操作来将从库提升为新的主库。
  • B) 错误: 超时从未达到,意味着半同步的保证一直有效。从库拥有所有主库已提交事务的日志。读取过时数据的原因不是等待超时,而是 SQL 线程应用日志需要时间。
  • C) 正确: 由于主库在提交前会等待从库的确认,任何在主库上成功提交的事务都保证了其日志事件已被从库接收。因此,主库崩溃不会导致任何已提交事务的丢失(这些事务的数据更改可以在从库上重放)。
  • D) 正确: 虽然从库的 I/O 线程已经接收了所有主库提交的事务日志到中继日志中,但从库的 SQL 线程还需要时间来读取中继日志并将这些事务应用(重放)到从库的数据中。在这个应用过程中,如果从库被读取,可能会读到尚未应用最新事务的状态,即相对于主库崩溃前的最终状态是“过时的”。直到 SQL 线程应用完所有中继日志中的事务,从库数据才达到最终一致状态。
  • E) 错误: 见 C 的解释,已提交的事务不会丢失。
  • F) 错误: 见 D 的解释,从库需要时间应用中继日志,不能保证在主库故障瞬间就能提供完全最新的数据。

试题 39:

Choose three.

You are considering using file-system snapshots to back up MySQL. Which three statements are true?

  • A) There is a slight performance cost while the snapshot is active. [正确]
  • B) The backup window is almost zero from the perspective of the application. [正确]
  • C) They allow direct copying of table rows with operating system copy commands. [错误]
  • D) They do not back up views, stored procedures, or configuration files. [错误]
  • E) They take roughly twice as long as logical backups. [错误]
  • F) They work best for transaction storage engines that can perform their own recovery when restored. [正确]
  • G) They do not use additional disk space. [错误]

题解:

文件系统快照(如 LVM 快照、ZFS 快照、存储阵列快照)是一种备份技术,它在某个时间点创建文件系统状态的一个逻辑副本。

  • A) 正确: 大多数快照技术(特别是写时复制 Copy-on-Write, COW)在快照活动期间,对原始卷的写入操作会产生一些性能开销,因为需要先将旧数据块复制到快照空间。
  • B) 正确: 创建快照的操作本身通常非常快速(接近瞬时),只需要短暂地锁定或刷新文件系统即可。从应用程序的角度看,数据库不可用或性能受影响的“备份窗口”非常短。实际的数据复制可以在快照创建后异步进行。
  • C) 错误: 文件系统快照是在块(block)级别工作的,捕获的是文件系统映像。它不理解数据库的逻辑结构(如表、行)。你不能直接用 OS 命令从快照中复制单个表行。你需要挂载快照,然后像操作原始文件一样操作快照中的 MySQL 数据文件(通常需要启动一个恢复实例)。
  • D) 错误: 文件系统快照备份的是整个文件系统(或卷)的内容。如果 MySQL 的数据文件、日志文件、配置文件、以及包含视图/存储过程定义的数据库文件都位于被快照的文件系统上,那么它们都会被包含在快照备份中。
  • E) 错误: 文件系统快照备份通常比逻辑备份(如 mysqldump,需要查询和转换数据为 SQL)快得多,因为它主要是块级别的复制。
  • F) 正确: 文件系统快照捕获的是某个瞬间的文件系统状态,对于数据库来说可能不是完全一致的状态(有些更改在内存,有些在磁盘)。因此,从快照恢复后,事务性存储引擎(如 InnoDB)需要能够利用其事务日志(redo log)进行崩溃恢复(crash recovery),将数据库恢复到一个一致的状态。非事务性引擎(如 MyISAM)从这种可能不一致的快照恢复可能会有问题。
  • G) 错误: 快照需要额外的磁盘空间来存储自快照创建以来原始卷上发生变化的数据块的旧版本(对于 COW 快照)。空间使用量取决于快照存在期间数据的变化量。

试题 40:

Choose two.

Which two commands will display indexes on the parts table in the manufacturing schema?

  • A) EXPLAIN manufacturing.parts;
  • B) SELECT * FROM information_schema.statistics WHERE table_schema = ‘manufacturing’ AND TABLE_NAME = ‘parts’; [错误]
  • C) DESCRIBE manufacturing.parts; [正确]
  • D) SHOW INDEXES FROM manufacturing.parts; [正确]
  • E) SELECT * FROM information_schema.COLUMN_STATISTICS; [错误]

题解:

显示表索引的方法:

  • A) 正确: EXPLAIN table_nameDESCRIBE table_name 的别名。它会显示表的列信息,并在 Key 列中标注哪些列是索引的一部分(如 PRI, UNI, MUL)。
  • B) 错误: 这个查询语句的语法不完整或不规范。正确的查询应该是 SELECT INDEX_NAME, COLUMN_NAME FROM information_schema.statistics WHERE table_schema = 'manufacturing' AND table_name = 'parts';。虽然 information_schema.statistics 表确实包含索引信息,但选项中给出的形式不是一个可直接执行的命令。
  • C) 正确: DESCRIBE table_name (或 DESC table_name) 是显示表结构的常用命令,其输出包含列信息和索引信息(通过 Key 列指示)。
  • D) 正确: SHOW INDEXES FROM table_name (或 SHOW KEYS FROM table_name) 是专门用于显示表上所有索引详细信息的命令,输出比 DESCRIBE 更专注于索引。
  • E) 错误: information_schema.COLUMN_STATISTICS 表存储的是关于列数据分布的统计信息(直方图),用于查询优化,而不是索引的定义。

因此,C 和 D 是直接且常用的显示索引的命令。A 也可以,但 C/D 更直接或更详细。

试题 41:

On examination, your MySQL installation datadir has become recursively world (所有用户) read/write/executable. What are two major concerns of running an installation with incorrect file privileges?

  • A) Data files could be deleted. (datafiles) [正确]
  • B) Users could overwrite configuration files. (mysqld-auto.cnf) [正确]
  • C) SQL injections could be used to insert bad data into the database. [错误]
  • D) Extra startup time would be required for the MySQL server to reset the privileges. (没有这个功能) [错误]
  • E) MySQL binaries could be damaged, deleted, or altered. (basedir 中才有 MySQL binaries) [错误]

题解:

数据目录 (datadir) 被设置为对所有用户(world)可读、可写、可执行 (rwxrwxrwx 或类似权限)是非常危险的。

  • A) 正确: 世界可写权限意味着系统上的任何用户都可以修改或删除 MySQL 的数据文件(如 .ibd, .MYD, .MYI 文件),导致数据丢失或损坏。
  • B) 正确: 世界可写权限也意味着任何用户都可以修改数据目录中的配置文件(如 mysqld-auto.cnf,如果存在于数据目录中)或其他重要文件(如 PID 文件、socket 文件),可能导致服务器无法启动、配置错误或安全问题。
  • C) 错误: SQL 注入是应用程序层面的漏洞,利用的是应用程序未能正确处理用户输入而构造恶意 SQL 语句。它与 MySQL 服务器数据目录的文件系统权限没有直接关系。
  • D) 错误: MySQL 服务器在启动时不会自动检查并修复其数据目录的文件权限。它会尝试以配置的权限运行,如果权限不当导致无法访问文件,则启动失败。
  • E) 错误: MySQL 的二进制可执行文件(如 mysqld, mysql)通常位于安装目录 (basedir) 下的 bin 子目录中,而不是数据目录 (datadir)。数据目录权限问题不会直接影响二进制文件。

试题 42:

Choose three.

Which three requirements must be enabled for group replication?

  • A) replication filters [错误]
  • B) semi-sync replication plugin [错误]
  • C) slave updates logging [正确]
  • D) binary log checksum [错误]
  • E) primary key or primary key equivalent on every table [正确]
  • F) binary log MIXED format [错误]
  • G) binary log ROW format [正确]

答案: https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements.html

题解:

启用 Group Replication (GR) 的一些关键要求:

  • A) 错误: 复制过滤器(Replication Filters)通常与 GR 不兼容或可能导致问题,不推荐使用。
  • B) 错误: GR 是一个独立的、基于 Paxos 协议的复制技术,它不依赖于半同步复制插件。
  • C) 正确: 需要启用 log_slave_updates (在 MySQL 8.0.26 及之前叫 log_slave_updates, 之后推荐用 log_replica_updates)。这确保了在一个组成员上应用的事务(无论是本地产生的还是从其他成员复制过来的)也会被记录到该成员自己的二进制日志中。这对于故障转移后,其他成员能够从新的主库同步是必需的。
  • D) 错误: 需要启用二进制日志校验和 (binlog_checksum),但不能设置为 NONE。默认值 CRC32 是可以接受的。所以不是必须“启用”某个特定值,而是不能是 NONE
  • E) 正确: 所有需要被 GR 复制的表都必须有一个主键,或者一个等效的主键(即非空唯一键)。这是 GR 进行冲突检测和高效应用更改所必需的。
  • F) 错误: GR 要求二进制日志格式必须是 ROW。不支持 MIXED 格式。
  • G) 正确: 二进制日志格式 (binlog_format) 必须设置为 ROW

因此,C, E, G 是启用 GR 的三个必要条件。

试题 43:

You are attempting to start your mysqld. Examine this log output:

1
2
3
4
5
6
2019-12-12T22:21:40:353800z 0 [System] [MY-010116] Server /mysql/bin/mysqld (mysqld 8.0.18-commercial) starting as process 29740
2019-12-12T22:21:40:458802z 1 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2019-12-12T22:21:40:459259z 1 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2019-12-12T22:21:40:459423z 1 [ERROR] [MY-012594] [InnoDB] If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
2019-12-12T22:21:40:459606z 1 [ERROR] [MY-012646] [InnoDB] File ./ibdata1: 'open' returned OS error 71. Cannot continue operation.
2019-12-12T22:21:40:459891z 1 [ERROR] [MY-012981] [InnoDB] Cannot continue operation.

Which two things must you check?

  • A) the configuration file for correct datadir setting [正确]
  • B) that you are using the correct version of MySQL [错误]
  • C) that the TLS/SSL certificates are still valid [错误]
  • D) for the possibility that the files are locked by another process [错误]
  • E) for the presence of the missing files in other locations [正确]
  • F) that the user attempting to connect to the database is using the correct username and password [错误]

题解:

错误日志分析:

  • Operating system error number 2: 在 Linux/Unix 系统上,错误码 2 通常是 ENOENT,表示 “No such file or directory”。
  • The error means the system cannot find the path specified.:明确指出了问题是找不到路径。
  • File ./ibdata1: 'open' returned OS error 71.:尝试打开 ibdata1 文件失败。错误码 71 (EPROTO on Linux?) 比较少见,但结合前面的错误 2,核心问题很可能是找不到文件或目录。./ibdata1 表示它在当前工作目录(或相对路径)下寻找 ibdata1

需要检查的事项:

  • A) 正确: 检查 MySQL 配置文件 (my.cnfmy.ini) 中 datadir 参数的设置是否正确。如果 datadir 指向了一个不存在的目录,或者 MySQL 服务器进程的工作目录不正确(导致相对路径 ./ibdata1 指向错误位置),就会发生此错误。
  • B) 错误: MySQL 版本不匹配通常不会导致“找不到路径”的错误,而可能是在数据格式兼容性等方面出问题。
  • C) 错误: TLS/SSL 证书问题会影响加密连接的建立,与服务器启动时查找本地数据文件无关。
  • D) 错误: 文件被其他进程锁定通常会报“权限不足”(Permission Denied)或“资源忙”(Resource Temporarily Unavailable)之类的错误,而不是“找不到路径”。
  • E) 正确: 检查 ibdata1 以及其他 InnoDB 数据文件是否确实存在于预期的 datadir 路径下。可能文件被移动、删除,或者 datadir 配置错误导致服务器在错误的位置查找。
  • F) 错误: 用户连接认证发生在服务器成功启动之后,与启动过程中无法找到核心数据文件无关。

试题 45:

Choose two.

Which two statements are true about raw binary backups?

  • A) They are converted to a highly compressible binary format. [错误]
  • B) They are required to obtain FIPS security compliance. [错误]
  • C) The resulting files are easily human readable. [错误]
  • D) The data format is identical to how MySQL stores the data on disk. [正确]
  • E) They are faster than logical backups because the process is a simple file or file system copy. [正确]

题解:

原始二进制备份(Raw Binary Backups)指的是直接复制 MySQL 在磁盘上存储数据的文件(如 .ibd, .MYD, .MYI, 日志文件等),或者使用文件系统/块级快照技术。例如,冷备份(关闭服务器后复制文件)、文件系统快照、或使用像 Percona XtraBackup 这样的热备份工具(它模拟 InnoDB 内部机制来复制文件)。

  • A) 错误: 原始二进制备份是直接复制文件,不进行格式转换。压缩是可选的后续步骤。
  • B) 错误: FIPS 安全合规性涉及加密算法和模块的标准,与备份是逻辑备份还是二进制备份无关。
  • C) 错误: MySQL 的数据文件是二进制格式,不是设计为人类可读的。逻辑备份(SQL 文件)才是人类可读的。
  • D) 正确: 这种备份方式的核心就是复制 MySQL 在磁盘上存储数据的原始格式文件。
  • E) 正确: 因为原始二进制备份避免了将数据转换为 SQL 语句(逻辑备份)的开销,通常只是进行文件复制或块复制,所以它通常比逻辑备份(如 mysqldump)速度快得多,尤其对于大型数据库。

试题 46:

Choose two.

Which two methods can be used to determine whether a query uses the hash join algorithm?

  • A) EXPLAIN FORMAT=JSON [正确]
  • B) EXPLAIN FORMAT=TRADITIONAL [错误]
  • C) EXPLAIN FORMAT=TREE [正确]
  • D) EXPLAIN without any formatting argument [错误]
  • E) EXPLAIN ANALYZE [错误] (根据答案标记为错误,但实际可以)

题解:

MySQL 在 8.0 版本引入了哈希连接(Hash Join)作为一种连接算法,特别适用于等值连接且一个表远小于另一个表,或者缺少合适索引的情况。要查看查询优化器是否计划使用哈希连接:

  • A) 正确: EXPLAIN FORMAT=JSON 输出提供详细的、结构化的 JSON 格式的执行计划。在 JSON 输出中,连接操作会明确标示其使用的算法,例如 "join_execution_strategy": "HASH_JOIN"
  • B) 错误: EXPLAIN FORMAT=TRADITIONAL(或默认的表格格式)通常不直接显示“Hash Join”。它可能会显示 Using join buffer (Block Nested Loop)Using join buffer (Batched Key Access) 等,但不足以明确判断是否为哈希连接。
  • C) 正确: EXPLAIN FORMAT=TREE 提供一种更易读的树状格式的执行计划。在这种格式下,连接操作会清晰地显示所使用的算法,例如 -> Hash Join (cost=... rows=...)
  • D) 错误: 默认的 EXPLAIN 输出(无 FORMAT 参数)是表格格式,同 B。
  • E) 错误 (根据答案标记): EXPLAIN ANALYZE 会实际执行查询并显示详细的执行计划和实际执行信息(时间、行数)。它的输出格式类似于 FORMAT=TREE,并且确实会显示实际使用的连接算法,包括哈希连接。标记为错误的原因不明确,可能是因为它会实际执行查询,或者认为 A/C 是更纯粹的查看计划的方法。

因此,A 和 C 是查看执行计划中是否包含哈希连接的可靠方法。

试题 47:

Choose two.

You have an InnoDB Cluster configured with three servers. Examine this command, which executes successfully:

1
mysqldump -uroot -p -d mydatabase > mydatabase_backup.sql

Due to data loss, the cluster is initialized and a restore is attempted resulting in this error:

1
ERROR 13176 (HY000) at line 23: Cannot update GTID_PURGED with the Group Replication plugin running

Which two actions, either one of which, can fix this error and allow a successful restore of the cluster?

  • A) Remove the group replication plugin from each instance before restoring. [错误]
  • B) Remove the @@GLOBAL.gtid_executed statement from the dump file. [错误]
  • C) Stop all instances except the primary read/write master instance and run the restore. [错误]
  • D) Restore using the –set-gtid-purged = OFF option. [错误]
  • E) Remove the @@GLOBAL.gtid_purged statement from the dump file. [正确]
  • F) Create the backup by using the –set-gtid-purged = OFF option. [正确]

题解:

错误信息 Cannot update GTID_PURGED with the Group Replication plugin running 表明,在启用了 Group Replication (GR) 的实例上,不允许通过 SQL 语句(如 SET @@GLOBAL.gtid_purged = '...')来直接修改 gtid_purged 系统变量。GR 会自动管理集群的 GTID 状态。

mysqldump 默认会(如果源服务器启用了 GTID)在备份文件的开头包含一条 SET @@GLOBAL.gtid_purged = '...' 语句,用于在恢复时设置目标服务器的 GTID 历史记录,以确保复制兼容性。然而,这与 GR 的管理机制冲突。

解决方案:

  • A) 错误: 移除 GR 插件过于极端,且可能破坏集群配置。
  • B) 错误: 备份文件中导致问题的是 gtid_purged 语句,不是 gtid_executed
  • C) 错误: 即使只在主节点上恢复,只要 GR 插件仍在运行,尝试执行 SET @@GLOBAL.gtid_purged 仍然会失败。
  • D) 错误: --set-gtid-purged=OFFmysqldump备份时选项,不是 mysql 客户端的恢复时选项。
  • E) 正确: 在执行恢复之前,手动编辑备份文件 (mydatabase_backup.sql),找到并删除或注释掉 SET @@GLOBAL.gtid_purged = '...' 这一行。这样恢复时就不会执行这条冲突的语句。
  • F) 正确:创建备份时就使用 mysqldump--set-gtid-purged=OFF 选项。这个选项会告诉 mysqldump 不要在备份文件中包含 SET @@GLOBAL.gtid_purged 语句。这样得到的备份文件就可以直接在启用了 GR 的实例上恢复而不会报错。

试题 48:

Choose three.

Which three are types of InnoDB tablespaces?

  • A) data tablespaces [正确] (解释为通用术语)
  • B) schema tablespaces [错误]
  • C) redo tablespaces [错误]
  • D) temporary table tablespaces [正确]
  • E) undo tablespaces [正确]
  • F) encryption tablespaces [错误]

题解:

InnoDB 存储引擎使用的主要表空间类型:

  • System Tablespace (系统表空间): 存储数据字典、变更缓冲区、双写缓冲区,以及(可选地)用户表的 undo 日志和数据/索引。由 innodb_data_file_path 定义。
  • File-Per-Table Tablespaces (独立表空间): 如果 innodb_file_per_table=ON(默认),每个新创建的 InnoDB 表会存储在自己的 .ibd 文件中。
  • General Tablespaces (通用表空间): 使用 CREATE TABLESPACE 创建,可以存储多个表的数据和索引。
  • D) Temporary Tablespaces (临时表空间): 用于存储用户创建的 TEMPORARY 表和优化器在处理复杂查询时内部使用的临时表。可以是全局的或会话级的。
  • E) Undo Tablespaces (Undo 表空间): 专门用于存储 Undo 日志。可以配置为独立于系统表空间的文件。

分析选项:

  • A) 正确 (特定解释下): “Data tablespaces” 不是 InnoDB 的一个官方、精确的表空间类型名称。但它可以被理解为一个通用术语,指代那些主要用于存储用户表数据索引的表空间,即包括系统表空间、独立表空间和通用表空间。考虑到 D 和 E 是明确的类型,而题目要求选三个,A 很可能是指这个通用概念。
  • B) 错误: 没有“模式表空间”这种类型。模式(数据库)是一个逻辑概念。
  • C) 错误: Redo 日志存储在重做日志文件(redo log files)中,由 innodb_log_files_in_groupinnodb_log_file_size 等参数控制,不称为“重做表空间”。
  • D) 正确: 临时表空间是 InnoDB 的一种表空间类型。
  • E) 正确: Undo 表空间是 InnoDB 的一种表空间类型。
  • F) 错误: 加密(Encryption)是表空间的一个属性(可以对独立表空间、通用表空间进行加密),而不是一种独立的表空间类型

因此,最可能的答案是 A(作为通用术语)、D 和 E。

试题 49:

Choose two.

Examine this statement and output:

1
2
3
mysql> SELECT ROW_NUMBER() OVER() AS QN, query, exec_count, avg_latency, lock_latency
FROM sys.statement_analysis
ORDER BY exec_count;

(见下图)

1
<html><body><table><tr><td>QNquery</td><td></td><td></td><td>|exec_count|avg_latency |lock_latency</td><td></td></tr><tr><td>1 SELECTSUM(</td><td colspan="2">K)FROMmYSCh.()-INTERVAL?SOL_TSI_HOUR</td><td>381268131.44ms</td><td>11.01m</td></tr><tr><td>2</td><td colspan="2">SELECT id' val 'a' 'b updatedWHEREcreated<?</td><td>150317358.34us</td><td>30.06s</td></tr><tr><td>3 SELECT</td><td>empno 'val cre ated+INTERVAL?SOL_TSI_DAY</td><td></td><td>600523.32ms</td><td>120.24ms</td></tr><tr><td></td><td>b ?AND?ORKBETWEEN?AND?</td><td></td><td></td><td></td></tr><tr><td></td><td>C FROM m</td><td></td><td>20010.32s</td><td>40.19ms</td></tr><tr><td>SELECT b FROM</td><td colspan="2">myschem G emp_no WHEREval=?</td><td>1121.03s</td><td>274.00us</td></tr><tr><td colspan="2">A)QN=2[错误]</td><td colspan="3"></td></tr><tr><td colspan="2"></td><td colspan="3"></td></tr><tr><td colspan="2">B)QN=3[错误]</td><td colspan="3"></td></tr><tr><td colspan="2">E)QN=5[正确]</td><td colspan="3" rowspan="2"></td></tr><tr><td colspan="2"></td></tr><tr><td colspan="2">D)QN=1[错误]</td><td colspan="3"></td></tr><tr><td colspan="2">C)QN=4[正确]</td><td colspan="3"></td></tr><tr><td colspan="2"></td><td colspan="3"></td></tr></table></body></html>

(Interpreted output based on typical sys.statement_analysis columns and values)

1
2
3
4
5
6
7
8
QN | query                                       | exec_count | avg_latency | lock_latency
---+---------------------------------------------+------------+-------------+-------------
...| ... | ... | ... | ...
5 | SELECT b FROM myschem G emp_no WHERE val=? | 112 | 1.03s | 274.00us
4 | SELECT ... C FROM m ... BETWEEN ? AND ? | 200 | 10.32s | 40.19ms
2 | SELECT id, val, a, b, updated WHERE created<?| 150317 | 358.34us | 30.06s
3 | SELECT empno, val created+INTERVAL ? DAY... | 600 | 523.32ms | 120.24ms
1 | SELECT SUM(K) FROM ... - INTERVAL ? HOUR | 381268 | 131.44ms | 11.01ms

(Note: Output is ordered by exec_count ascending based on query)

You must try to reduce query execution time. Which two queries should you focus on?

  • A) QN=2 [错误]
  • B) QN=3 [错误]
  • C) QN=4 [正确]
  • D) QN=1 [错误]
  • E) QN=5 [正确]

解析: 看 avg_latency,执行次数多的 sql 语句已经没有优化的空间了。 (此解析不准确)

题解:

目标是减少查询执行时间,应该关注那些平均执行延迟 (avg_latency) 最高的查询,因为它们单次执行最慢,优化潜力最大。

分析 avg_latency 列:

  • QN=1: 131.44ms (毫秒)
  • QN=2: 358.34us (微秒) - 非常快
  • QN=3: 523.32ms (毫秒)
  • QN=4: 10.32s (秒) - 非常慢
  • QN=5: 1.03s (秒) - 比较慢

平均执行时间最长的两个查询是 QN=4 (10.32秒) 和 QN=5 (1.03秒)。因此,应该优先关注优化这两个查询。

  • A) QN=2: 平均延迟最低,不是优化重点。
  • B) QN=3: 平均延迟中等。
  • C) QN=4: 平均延迟最高,是首要优化目标。
  • D) QN=1: 平均延迟中等,但执行次数非常高 (exec_count=381268),总耗时 (total_latency = exec_count * avg_latency) 可能很高,也值得关注,但题目问的是减少单次执行时间,所以优先看 avg_latency
  • E) QN=5: 平均延迟第二高,是次要优化目标。

注意: 提供的“解析”说执行次数多的 SQL 没有优化空间,这是错误的。执行次数多的查询如果平均延迟不低,其总耗时可能非常高,优化它带来的整体性能提升可能更大。但题目要求“减少查询执行时间”,通常指减少单次查询的耗时,因此关注 avg_latency 是合理的。

试题 50:

Choose two.

You are asked to review possible options for a new MySQL instance. It will be a large, busy reporting data warehousing instance. Which two innodb_data_file_path configurations would satisfy long-term storage demands?

  • A) ibdata1:12M:autoextend [正确]
  • B) ibdata1:12M;ibdata2:12M:autoextend [正确]
  • C) ibdata1:12M;ibdata2:12M;ibdata3:12M [错误]
  • D) ibdata1:12M;/tmp/ibdata2:12M:autoextend [错误]
  • E) ibdata1:12M [错误]
  • F) ibdata1:12M:autoextend;ibdata2:12M:autoextend [错误]

答案: The autoextend attribute can be specified only for the last data file in the innodb_data_file_path setting.

题解:

场景:大型、繁忙的数据仓库实例,需要满足长期存储需求(意味着数据量会增长)。innodb_data_file_path 定义 InnoDB 系统表空间的布局。

关键在于 autoextend 属性,它允许指定的数据文件在空间不足时自动增长。对于需要长期增长的数据库,这是非常重要的。

规则:autoextend 属性只能用于 innodb_data_file_path 设置中列出的最后一个数据文件。

分析选项:

  • A) 正确: ibdata1:12M:autoextend - 定义了一个初始大小为 12MB 的系统表空间文件 ibdata1,并且允许它自动扩展。满足增长需求。
  • B) 正确: ibdata1:12M;ibdata2:12M:autoextend - 定义了两个系统表空间文件,ibdata1 初始 12MB(固定大小),ibdata2 初始 12MB 且允许自动扩展。由于最后一个文件可以自动扩展,整体空间可以增长。满足增长需求。
  • C) 错误: ibdata1:12M;ibdata2:12M;ibdata3:12M - 定义了三个固定大小的文件,总大小有限,没有自动扩展能力。不满足长期存储增长需求。
  • D) 错误: 将数据文件放在 /tmp 目录下是非常危险的,/tmp 中的内容通常在系统重启时会被清空。不适合长期存储。
  • E) 错误: ibdata1:12M - 定义了一个固定大小为 12MB 的文件,无法自动增长。不满足长期存储增长需求。
  • F) 错误: ibdata1:12M:autoextend;ibdata2:12M:autoextend - 语法错误。autoextend 只能用于最后一个文件。

因此,A 和 B 是能够满足长期存储增长需求的有效配置。