学习自测与解析:MySQL第五、六、七期核心知识点详解

`# 学习自测与解析:MySQL第五、六、七期核心知识点详解

本笔记为第五期(用户管理与权限控制)、第六期(备份与恢复)、第七期(高可用架构与综合项目)的配套自测题解析。共 20 题,每题包含:题目回顾、考查知识点、详细解答与分析。


题目一:MySQL 用户账号的组成与主机通配符

题目 :MySQL 中用户账号由哪两部分组成?主机通配符 %_ 分别代表什么?请给出只允许从 192.168.1.0/24 网段连接的用户创建语句。

考查知识点

  • 用户账号格式 'user'@'host'(第五期 §1.1)
  • 主机通配符含义
  • CREATE USER 语句

详细解答

组成用户名 + 主机,格式为 'username'@'host'。用户名和主机组合唯一标识一个用户。

通配符

  • %:匹配任意长度的任意字符(0 个或多个)
  • _:匹配单个任意字符

允许 192.168.1.0/24 网段连接的用户创建

sql

复制代码
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'password';

注意:192.168.1.% 会匹配 192.168.1.0 ~ 192.168.1.255 之间的所有 IP。


题目二:权限的授予与回收

题目 :现需要给用户 'report'@'10.0.0.%' 授予对数据库 sales 中所有表的 SELECTINSERT 权限,并允许该用户将这些权限转授给其他用户。请写出授权语句。随后,需要撤销该用户的 INSERT 权限但保留 SELECT,请写出回收语句。

考查知识点

  • GRANT 语法与 WITH GRANT OPTION(第五期 §4.2)
  • REVOKE 语法(第五期 §4.4)

详细解答

授权语句

sql

复制代码
GRANT SELECT, INSERT ON sales.* TO 'report'@'10.0.0.%' WITH GRANT OPTION;

回收 INSERT 权限

sql

复制代码
REVOKE INSERT ON sales.* FROM 'report'@'10.0.0.%';

验证:SHOW GRANTS FOR 'report'@'10.0.0.%'; 应只显示 SELECT 权限。


题目三:忘记 root 密码的处理方法

题目:如果忘记了 MySQL 的 root 密码,且希望保留现有数据,请写出完整的恢复步骤(包括配置文件修改、SQL 命令和服务重启)。

考查知识点

  • 跳过授权表启动(第五期 §3.2)
  • 修改 authentication_string 字段

详细解答

步骤

  1. 编辑 MySQL 配置文件(如 /etc/my.cnf/etc/my.cnf.d/mysql-server.cnf),在 [mysqld] 段添加:

    ini

    复制代码
    skip-grant-tables
    skip-networking   # 可选,禁止远程连接提高安全性
  2. 重启 MySQL:

    bash

    复制代码
    systemctl restart mysqld
  3. 无密码登录:

    bash

    复制代码
    mysql
  4. 清空 root 密码(设为空字符串):

    sql

    复制代码
    UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost';
    FLUSH PRIVILEGES;
  5. 退出 MySQL,移除配置文件中的 skip-grant-tablesskip-networking,重启服务:

    bash

    复制代码
    systemctl restart mysqld
  6. 使用空密码登录,设置新密码:

    sql

    复制代码
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_strong_password';

注意:生产环境中需谨慎操作,建议先在测试环境演练。


题目四:冷备份与逻辑备份的区别

题目:请解释冷备份和逻辑备份的区别,并分别说明各自的优缺点及适用场景。

考查知识点

  • 物理冷备 vs 逻辑备份(第六期 §二)

详细解答

特性 冷备份(物理备份) 逻辑备份(mysqldump)
备份方式 直接复制数据目录的物理文件 导出 SQL 语句
数据库状态 需要停机(或锁表) 在线进行,不影响读写
备份速度 慢(尤其数据量大时)
恢复速度 快(直接拷贝文件) 慢(逐条执行 SQL)
跨平台性 差(受操作系统、MySQL 版本影响) 好(SQL 文本通用)
备份文件可读性 不可读 可读(SQL 语句)
适用场景 大数据量、要求快速恢复 小数据量、跨版本/跨平台迁移

示例命令

bash

复制代码
# 冷备份
systemctl stop mysqld
tar czf backup.tar.gz /var/lib/mysql

# 逻辑备份
mysqldump -u root -p --all-databases > all.sql

题目五:mysqldump 全量备份与恢复

题目 :使用 mysqldump 备份数据库 erp 的所有表,并将备份文件压缩存储。请写出备份命令。之后,需要从该压缩备份中恢复数据到新的数据库 erp_restore,请写出完整步骤。

考查知识点

  • mysqldump 备份单个数据库(第六期 §4.1)
  • 备份压缩与解压恢复

详细解答

备份命令

bash

复制代码
mysqldump -u root -p erp | gzip > /backup/erp_$(date +%Y%m%d).sql.gz

恢复步骤

bash

复制代码
# 1. 创建新数据库(如果需要)
mysql -u root -p -e "CREATE DATABASE erp_restore;"

# 2. 解压并恢复
gunzip < /backup/erp_20251208.sql.gz | mysql -u root -p erp_restore

也可以分两步:先 gzip -d file.sql.gz,再 mysql < file.sql


题目六:二进制日志(binlog)的作用与查看

题目:MySQL 的二进制日志(binlog)主要记录什么内容?如何查看当前是否开启了 binlog?如何查看 binlog 文件中的事件(以可读形式)?

考查知识点

  • binlog 的作用(第六期 §5.1)
  • 查看 binlog 状态与内容

详细解答

binlog 作用:记录所有数据变更操作(INSERT、UPDATE、DELETE、DDL 等),用于主从复制和时间点恢复。

查看是否开启 binlog

sql

复制代码
SHOW VARIABLES LIKE 'log_bin';
-- 值为 ON 表示开启

查看 binlog 文件列表

sql

复制代码
SHOW BINARY LOGS;

以可读形式查看 binlog 内容

bash

复制代码
mysqlbinlog --no-defaults --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000001

题目七:基于 binlog 的时间点恢复

题目 :某公司每周日 00:00 进行全量备份,并开启了 binlog。周三下午 14:30 误删除了一个重要表。请写出恢复步骤,假设全量备份文件为 full_backup.sql,binlog 文件从周日 00:00 到周三 14:29 的为 mysql-bin.000010

考查知识点

  • 全量 + 增量恢复流程(第六期 §5.3)
  • 时间点恢复参数

详细解答

恢复步骤

  1. 恢复全量备份

    bash

    复制代码
    mysql -u root -p < full_backup.sql
  2. 应用 binlog 到误删除之前的时间点(例如误删发生在 14:30:00,恢复到 14:29:59):

    bash

    复制代码
    mysqlbinlog --stop-datetime="2025-12-11 14:29:59" /var/lib/mysql/mysql-bin.000010 | mysql -u root -p
  3. 验证数据是否完整

注意 :如有多个 binlog 文件,需按顺序逐个应用。可使用 --start-datetime--stop-datetime 精确定位。


题目八:主从复制中 I/O 线程和 SQL 线程的作用

题目:在 MySQL 主从复制中,I/O 线程和 SQL 线程分别负责什么工作?如何检查两个线程的状态是否正常?

考查知识点

  • 主从复制组件(第七期 §1.2)
  • SHOW SLAVE STATUS 关键字段

详细解答

I/O 线程:运行在从库上,负责连接主库,请求 binlog,并将接收到的内容写入从库的中继日志(relay log)。

SQL 线程:运行在从库上,负责读取中继日志,重放其中的 SQL 语句,使从库数据与主库保持一致。

状态检查:在从库执行:

sql

复制代码
SHOW SLAVE STATUS\G

关键字段:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

两者均为 Yes 表示复制正常。


题目九:配置主从复制时,CHANGE MASTER TO 语句需要指定哪些关键信息?

题目 :请写出完整的 CHANGE MASTER TO 语句,假设主库 IP 为 192.168.1.101,复制用户为 repl,密码 repl123,当前主库的 binlog 文件为 master-bin.000005,位置为 987

考查知识点

  • 从库配置主从连接的语法(第七期 §2.3)

详细解答

sql

复制代码
CHANGE MASTER TO
    MASTER_HOST='192.168.1.101',
    MASTER_USER='repl',
    MASTER_PASSWORD='repl123',
    MASTER_LOG_FILE='master-bin.000005',
    MASTER_LOG_POS=987;

执行后,使用 START SLAVE; 启动复制。


题目十:Amoeba 读写分离的工作原理

题目:Amoeba 是什么?它如何实现读写分离?写出 Amoeba 配置文件中指定写池和读池的参数名称。

考查知识点

  • Amoeba 代理中间件(第七期 §3.1)
  • amoeba.xml 中的配置项

详细解答

Amoeba:基于 Java 开发的 MySQL 数据库代理中间件,对应用透明,自动识别 SQL 类型并路由到不同的 MySQL 节点。

读写分离原理

  • 应用连接 Amoeba(端口 8066),Amoeba 解析 SQL 语句
  • 写操作(INSERT/UPDATE/DELETE)→ 转发到 writePool 指定的主库
  • 读操作(SELECT)→ 转发到 readPool 指定的从库池,从库池可实现负载均衡(轮询/权重)

配置文件 amoeba.xml 中的关键参数

xml

复制代码
<property name="writePool">master</property>
<property name="readPool">slaves</property>
<property name="defaultPool">master</property>

题目十一:MHA 的组成与故障切换流程

题目:MHA 由哪两部分组成?故障切换时,MHA 选择新主库的优先级规则是什么?

考查知识点

  • MHA 架构(第七期 §4.1)
  • 候选主库选择逻辑(第七期 §5.6 配置文件中 candidate_mastercheck_repl_delay

详细解答

组成

  • MHA Manager:管理节点,负责监控和触发切换
  • MHA Node:数据节点,运行在每个 MySQL 服务器上,执行日志保存和恢复操作

新主库选择优先级

  1. 如果设置了 candidate_master=1 且数据差异不超出限制(或 check_repl_delay=0 忽略延迟),则该从库优先被选为新主库。
  2. 否则,选择数据最接近主库(binlog 位置/GTID 最新)的从库。
  3. 若数据一致,按配置文件 [serverN] 的顺序选择。

题目十二:MHA 的 VIP 切换脚本作用

题目 :在 MHA 配置中,master_ip_failover_script 指定的脚本通常用来做什么?请简述脚本中 startstop 命令的功能。

考查知识点

  • MHA 虚拟 IP 管理(第七期 §5.6 脚本内容)

详细解答

该脚本用于在主库发生故障切换时,自动将虚拟 IP(VIP)从原主库漂移到新主库,使应用可以继续使用同一 IP 访问数据库,无需修改配置。

  • stop 命令 :在原主库上禁用 VIP(ifconfig ens33:1 down
  • start 命令 :在新主库上启用 VIP(ifconfig ens33:1 <VIP>

脚本中关键变量示例

perl

复制代码
my $vip = '192.168.108.200';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

题目十三:LAMP 环境搭建中 PHP 与 MySQL 的连接

题目:在 LAMP 架构中,PHP 通过哪个扩展连接 MySQL?WordPress 安装时,需要填写哪些数据库连接信息?

考查知识点

  • PHP MySQL 扩展(第七期 §9.2)
  • WordPress 安装配置(第七期 §9.7)

详细解答

PHP 连接 MySQL 的扩展 :推荐使用 php-mysqlnd(MySQL Native Driver),它支持 MySQL 5.6+ 的新特性,性能更好。

WordPress 安装需要填写的数据库信息

  • 数据库名(如 wordpress
  • 数据库用户名(如 wordpresser
  • 数据库密码
  • 数据库主机(可以是 IP 或域名,如 192.168.108.101
  • 数据表前缀(默认 wp_,可用于同一数据库安装多个 WordPress)

题目十四:源码编译 MySQL 时,CMake 常用的关键参数

题目:源码安装 MySQL 5.7 时,使用 CMake 配置。请写出至少 5 个常用 CMake 参数,并说明其含义。

考查知识点

  • 源码安装 CMake 配置(第七期 §10.5)

详细解答

常用 CMake 参数及含义:

参数 含义
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 安装路径
-DMYSQL_DATADIR=/usr/local/mysql/data 数据文件目录
-DDEFAULT_CHARSET=utf8 默认字符集
-DDEFAULT_COLLATION=utf8_general_ci 默认排序规则
-DWITH_INNOBASE_STORAGE_ENGINE=1 启用 InnoDB 存储引擎
-DWITH_BOOST=/usr/local/boost 指定 Boost 库路径(MySQL 5.7 需要)
-DWITH_SYSTEMD=1 启用 systemd 支持(便于 systemctl 管理)
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock socket 文件路径

题目十五:MySQL 主从复制中 relay_log_purge 参数的作用

题目 :在 MHA 环境检查时,可能会收到 relay_log_purge=0 is not set 的警告。relay_log_purge 参数的作用是什么?MHA 为什么建议设置为 0?

考查知识点

  • relay log 管理
  • MHA 对中继日志的要求

详细解答

relay_log_purge 作用:控制从库是否自动删除已执行过的中继日志文件。默认值为 1(自动删除)。

MHA 建议设为 0 的原因

  • 当主库故障时,MHA 可能需要的从库中继日志来恢复其他从库。如果自动删除了,可能导致数据丢失或恢复失败。
  • 设为 0 后,需要手动或通过 MHA 脚本清理中继日志,以确保在切换时日志可用。

配置方法 (在从库 /etc/my.cnf 中):

ini

复制代码
relay_log_purge = 0

注意 :长期不清理会导致磁盘空间耗尽,需要配合 purge_relay_logs 工具定期清理。


题目十六:Amoeba 后端从库负载均衡的配置方法

题目 :在 dbServers.xml 中,如何定义多个从库组成的池,并设置负载均衡算法为轮询?请写出关键配置片段。

考查知识点

  • Amoeba 从库池定义(第七期 §3.4)
  • loadbalance 参数值含义

详细解答

关键配置片段:

xml

复制代码
<dbServer name="slaves" virtual="true">
    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
        <!-- 负载均衡算法:1=轮询,2=权重,3=高可用 -->
        <property name="loadbalance">1</property>
        <!-- 池中包含的从库名称,用逗号分隔 -->
        <property name="poolNames">slave1,slave2</property>
    </poolConfig>
</dbServer>

其中 slave1slave2 是之前定义的具体后端服务器节点。


题目十七:MHA 故障切换后的配置文件自动更新

题目 :MHA 启动时使用了 --remove_dead_master_conf 参数,这个参数的作用是什么?切换完成后,原主库的配置信息被如何对待?

考查知识点

  • MHA 启动参数(第七期 §5.8)

详细解答

--remove_dead_master_conf 作用 :当发生故障切换后,MHA 会自动从配置文件(如 app1.cnf)中删除已宕机的主库对应的 [serverN] 段。

原主库配置的处理

  • 配置文件中该主库的条目被删除,避免后续 MHA 监控到它(因为该节点已不再是主库)。
  • 如果需要将原主库重新加入集群(作为从库),需要手动编辑配置文件,添加回 [serverN] 段,并确保其角色为从库(通常保留作为备份)。

题目十八:MySQL 5.7 源码安装后初始化失败常见原因

题目 :源码安装 MySQL 5.7 后,执行 mysqld --initialize 初始化时报错 error while loading shared libraries: libaio.so.1,应如何解决?

考查知识点

  • 源码安装依赖问题
  • libaio 库的作用

详细解答

错误原因 :MySQL 需要异步 I/O 库 libaio,但系统未安装。

解决方法

bash

复制代码
# CentOS / RHEL
yum install -y libaio

# Ubuntu / Debian
apt-get install -y libaio1

安装后重新执行初始化命令:

bash

复制代码
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

其他常见初始化失败原因:数据目录权限不正确(需 chown -R mysql:mysql)、缺少依赖包(如 numactl)等。


题目十九:WordPress 连接远程数据库时常见的权限问题

题目:WordPress 安装时,填写数据库主机为另一台服务器的 IP,但提示"数据库连接错误"。请列出可能的原因及排查步骤。

考查知识点

  • MySQL 远程连接授权
  • 网络与防火墙

详细解答

可能原因

  1. MySQL 用户未授权从 Web 服务器的 IP 连接。
  2. MySQL 绑定地址(bind-address)未设为 0.0.0.0 或正确 IP,导致仅允许本地连接。
  3. 防火墙阻止了 3306 端口。
  4. 数据库主机 IP 填写错误。
  5. 密码错误。

排查步骤

bash

复制代码
# 1. 在数据库服务器上检查用户授权
mysql> SELECT host, user FROM mysql.user WHERE user='wordpresser';

# 2. 检查 bind-address
mysql> SHOW VARIABLES LIKE 'bind_address';

# 3. 测试网络连通性(从 Web 服务器)
telnet 192.168.108.101 3306

# 4. 检查防火墙(数据库服务器)
systemctl status firewalld
firewall-cmd --list-ports

# 5. 临时授权测试(若以上均正确,尝试通配符主机)
mysql> GRANT ALL ON wordpress.* TO 'wordpresser'@'%' IDENTIFIED BY '123456';

题目二十:综合场景题------主从故障恢复全流程

题目 :某主从集群(一主两从)中,主库突然宕机,MHA 已自动将 slave01 提升为新主库,slave02 自动指向新主库。现在原主库已修复,需要将其重新加入集群作为从库。请写出详细的操作步骤。

考查知识点

  • MHA 切换后的修复流程(第七期 §七)
  • CHANGE MASTER TO 重新指向

详细解答

步骤

  1. 在原主库(已修复)上停止并重置复制

    sql

    复制代码
    STOP SLAVE;
    RESET SLAVE ALL;
  2. 在新主库(原 slave01)上查看当前 binlog 坐标

    sql

    复制代码
    SHOW MASTER STATUS;
    +---------------------+----------+
    | File                | Position |
    +---------------------+----------+
    | master-bin.000002   | 2210     |
    +---------------------+----------+
  3. 在原主库上执行 CHANGE MASTER TO,指向新主库

    sql

    复制代码
    CHANGE MASTER TO
        MASTER_HOST='192.168.108.132',   -- 新主库 IP
        MASTER_USER='myslave',
        MASTER_PASSWORD='123',
        MASTER_LOG_FILE='master-bin.000002',
        MASTER_LOG_POS=2210;
    START SLAVE;
  4. 验证复制状态

    sql

    复制代码
    SHOW SLAVE STATUS\G

    确保 Slave_IO_RunningSlave_SQL_Running 均为 Yes

  5. (可选)更新 MHA 配置文件 :手动编辑 /etc/masterha/app1.cnf,添加回原主库的 [server1] 段(可根据需要设为普通从库或候选主库)。之后重启 MHA Manager。

  6. 测试同步:在新主库上插入测试数据,检查原主库是否同步。


附:知识点对应总表

题号 主要考查知识点(对应笔记章节)
1 第五期 §1.1 用户账号组成与主机通配符
2 第五期 §4.2~4.4 GRANT / REVOKE
3 第五期 §3.2 忘记 root 密码处理
4 第六期 §二 冷备份 vs 逻辑备份
5 第六期 §4.1 mysqldump 备份与恢复
6 第六期 §5.1 binlog 作用与查看
7 第六期 §5.3 时间点恢复
8 第七期 §1.2 I/O 线程与 SQL 线程
9 第七期 §2.3 CHANGE MASTER TO
10 第七期 §3.1 Amoeba 原理与配置
11 第七期 §4.1 MHA 组成与切换规则
12 第七期 §5.6 VIP 切换脚本
13 第七期 §9.2, §9.7 LAMP + WordPress
14 第七期 §10.5 CMake 参数
15 第七期 §2.3 relay_log_purge 与 MHA
16 第七期 §3.4 Amoeba 负载均衡配置
17 第七期 §5.8 --remove_dead_master_conf
18 第七期 §10.6 源码安装依赖问题
19 第七期 §9.4 远程连接权限问题
20 第七期 §七 MHA 故障恢复流程

学习建议:对于答错的题目,请回看第五、六、七期对应章节,并动手在环境中验证。高可用架构涉及较多配置细节,建议搭建完整实验环境(可使用虚拟机)逐项测试,加深理解。

相关推荐
无限进步_1 小时前
从零实现一个迷你Shell——深入理解Linux命令行解释器
linux·运维·服务器·开发语言·c++·chrome
阿标在干嘛1 小时前
政策平台的推送系统:消息队列、定时任务、AB测试的工程实践
服务器·数据库·ab测试
niuniuyi~1 小时前
QT学习笔记
笔记·qt·学习
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
咸甜适中1 小时前
rust语言学习笔记Trait(十六)Error(错误)
笔记·学习·rust
Adorable老犀牛2 小时前
nginx_exporter:Prometheus 监控 Nginx 基础指标
运维·nginx·prometheus
山里幽默的程序员2 小时前
DevOps 必备:盘点2026 年最强RESTful API 接口测试方案
运维·restful·devops·api开发·api开发工具
happymaker06262 小时前
Linux常见命令总结
linux·运维·服务器
加农炮手Jinx2 小时前
Flutter for OpenHarmony:pub_updater 命令行工具自动更新专家(DevOps 运维必备) 深度解析与鸿蒙适配指南
android·运维·网络·flutter·华为·harmonyos·devops