精读笔记(RHCA 英文教材)· RH358 Chapter 7 Configuring MariaDB SQL Databases
精读笔记(RHCA 英文教材)· RH358 Chapter 7 Configuring MariaDB SQL Databases
教材原文:RHCA 官方英文教材(教材第 15~17 页)(OCR 整书版已从本站移除,本页为章节精读) 口径更正:此前误记“手册正文止于第 6 章”——实际本手册文字层共 965 行 / 44 页,第 7/8/9 章均含同款 Structure 页(日程、目标、要点、讲师提示),可继续逐章精读;缺失的只是逐段讲解细节,故仍按“讲义要点 + 必要补充”双语整理。 关联知识:
02-08-Ansible自动化(自动化同款模块组合思路)、RHCE9 精读服务类章节;前置:RH358 Chapter 1(systemd 服务管理)+ 基本 SQL 概念。
Chapter 7 | Configuring MariaDB SQL Databases(配置 MariaDB SQL 数据库)
- 一句话目标:In this chapter you will cover the basics of managing MariaDB (MySQL) databases.(系统掌握管理 MariaDB(MySQL)数据库的基础:安装配置、SQL 操作、用户权限、备份恢复、自动化部署五件套)
Chapter Objectives(本章目标,双语)
By the end of this chapter, students should be able to:
- Install and perform basic configuration of a MariaDB relational database server.(安装并完成基础配置一个 MariaDB 关系型数据库服务器)
- Examine, search, create, and change database information using Structured Query Language (SQL) and MariaDB statements.(用 SQL / MariaDB 语句查看、搜索、创建、修改数据库信息)
- Configure database users and assign them access rights in MariaDB.(在 MariaDB 中配置数据库用户并分配访问权限)
- Back up a MariaDB database safely and restore that backup.(安全备份 MariaDB 数据库并恢复该备份)
- Automate the installation and configuration of a MariaDB database server.(自动化 MariaDB 数据库服务器的安装与配置)
Chapter Schedule(课时表,共 205 分钟)
| Section | 主题 | 方法(P:Lecture / A:Guided Exercise) |
|---|---|---|
| 1 | Installing a MariaDB Database | P 15 分钟 + A 15 分钟 |
| 2 | Working with SQL in MariaDB | P 25 分钟 + A 20 分钟 |
| 3 | Managing MariaDB Users and Access Rights | P 10 分钟 + A 20 分钟 |
| 4 | Creating and Restoring MariaDB Backups | P 10 分钟 + A 15 分钟 |
| 5 | Automating MariaDB Deployment | P 10 分钟 + A 40 分钟 |
| - | Lab Review(Performance Checklist) | 25 分钟 |
Key Takeaways(本章要点 6 条)
Describe basic relational database concepts.(能描述基本关系型数据库概念) Perform a MariaDB installation.(会执行 MariaDB 安装) Use SQL to create, examine, and search databases.(用 SQL 创建、查看、检索数据库) Create users, and grant, revoke, and flush privileges.(创建用户,并执行 grant / revoke / flush privileges) Back up and restore a MariaDB database.(备份并恢复 MariaDB 数据库) Automate the installation and configuration of MariaDB servers and clients.(自动化 MariaDB 服务器与客户端的安装和配置) 中文归纳考点:① 关系型数据库概念(表/行/列/主键/SQL);② MariaDB 安装与安全初始化;③ SQL 建库/查库/搜库;④ 用户 + grant/revoke/flush 权限;⑤ 备份与恢复;⑥ Ansible 自动化部署(无官方专用模块→基础模块组合)。
Instructor Tips and Suggestions(讲师提示 4 条原文要点)
- test 库(易错点):命令行 yum 或 Ansible 的 yum 模块安装 MariaDB 时默认不会装 test 库;但许多其它安装方式仍会装一个空的、权限全开的 test 库。因此鼓励学生:手动跑
mysql_secure_installation时对删除项答 Yes;自动化章节里也要专门写 playbook 任务把它删掉。 - 分号规则(易错点):SQL 语句以分号
;结尾很重要,但USE和EXIT带不带分号都能执行;MariaDB 允许一行写多条语句、以分号作分隔符。讲师演示输出:[root@servera ~]# mysql -uroot -p Enter password: redhat MariaDB [(none)]> use inventory; show tables; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed +---------------------+ | Tables_in_inventory | +---------------------+ | category | | manufacturer | | product | +---------------------+ 3 rows in set (0.000 sec) - 自动化章节的定位:本节的唯一目的是把前面手动做完的步骤自动化;因此讲义正文不展开讲 playbook 细节,解法作为参考答案放在 Guided Exercise 里(
-A关闭补全提示、分号写法可参考上一条)。 - Lab 注意事项:期末 Lab 学生可选手动、Ansible 或两者都做(都做要注意时间);grade 评分在任意环节都可运行;若在 Ansible 步骤之后先跑 finish 再跑 start,
~/database-review/group_vars/db_servers/会被删除——该目录影响任何ansible-playbook的 group_vars 加载(即使没有声明变量也会受影响),但~/database-review下其它文件会保留。
补充精讲 A:MariaDB 安装与基础配置(Section 1 对应知识)
- 定位与概念:MariaDB 是 MySQL 的社区分支,RHEL8 内置 MariaDB 10.3;C/S 架构=服务端守护进程
mariadbd(监听 3306/tcp)+ 客户端mysql。关系型数据库三件套:库 database(含表集合)→ 表 table(行 row × 列 column)→ 主键 primary key(行唯一标识),用 SQL 操作。 - 安装与服务管理:
dnf install -y mariadb-server # 服务端包,会带上客户端 mysql systemctl enable --now mariadb # 启动并开机自启 systemctl status mariadb mysql --version # 客户端可用性验证 mysqladmin -uroot -p ping # 服务连通性验证 - 配置文件与数据位置:主配置
/etc/my.cnf.d/mariadb-server.cnf;数据目录/var/lib/mysql;socket 默认/var/lib/mysql/mysql.sock;监听 3306/tcp 默认只绑 localhost。 - 远程访问放行(仅当客户端在其它主机):
firewall-cmd --permanent --add-service=mysql && firewall-cmd --reload(服务名 mysql 即 3306/tcp);本机访问无需放行。SELinux 对默认安装/默认端口无需额外配置,改动端口或数据目录才需 semanage 调整(点到)。 - 安全初始化
mysql_secure_installation(考点,对应 test 库 Tip):交互式执行四类动作——① 设置 root 密码;② 删除匿名用户;③ 禁止 root 远程登录(root 只留 localhost);④ 删除 test 库并重载权限表。讲师提示明确:yum/Ansible yum 模块装出的库本来没有 test 库,但为兼容“其它装法可能带空 test 且权限全开”的安全风险,一律执行并删掉。
补充精讲 B:用 SQL 操作数据库(Section 2 对应知识)
- 连接客户端:
mysql -uroot -p(-u用户、-p提示输密码);远程mysql -h host -u user -p db。交互提示符MariaDB [(none)]>里(none)表示尚未选库,USE后变为库名。 - 分号规则(讲师 Tip 2,考点):
- 标准写法:一条 SQL 语句以
;结尾回车才执行; - 例外:
USE、EXIT可省略分号(学生自己探索时容易疑惑,讲师专门提醒); - 一行多条:用分号作分隔符,如
use inventory; show tables;;EXIT之后不要跟后续命令; - 慢启动提示 “Reading table information…” 可用
-A关闭补全。
- 标准写法:一条 SQL 语句以
- 库级操作(DDL):
SHOW DATABASES;→CREATE DATABASE inventory;→USE inventory;→SHOW TABLES;→DROP DATABASE inventory; - 表级操作:
CREATE TABLE product ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, price DECIMAL(8,2) ); DESCRIBE product; -- 简写 DESC:查看表结构 ALTER TABLE product ADD COLUMN category_id INT; -- 加列/可 DROP/MODIFY DROP TABLE product; - 数据操作(DML):
INSERT INTO product (name, price) VALUES ('SSD 512G', 499.00); SELECT * FROM product WHERE price < 600 ORDER BY name; UPDATE product SET price = 459.00 WHERE name = 'SSD 512G'; DELETE FROM product WHERE id = 1; - 教材 demo 对照:
use inventory; show tables;输出 inventory 库三张表 category / manufacturer / product(三个表分别对应演示数据的分类/厂商/商品维度)。习惯上 SQL 关键字大写(不强制);Linux 上库名/表名大小写敏感,命名后保持一致。
补充精讲 C:用户与访问权限(Section 3 对应知识)
- 账号模型:用户=
用户名@主机二元组,账号信息存mysql.user表;host 用localhost(本机)、IP/域名、%(任意主机)。CREATE USER 'joe'@'localhost' IDENTIFIED BY 'redhat'; DROP USER 'joe'@'localhost'; -- 连权限一起删 - 授权分层:全局
*.*> 库inventory.*> 表inventory.product> 列/存储过程级。示例:GRANT SELECT, INSERT, UPDATE ON inventory.* TO 'joe'@'localhost'; GRANT ALL PRIVILEGES ON inventory.* TO 'joe'@'localhost' WITH GRANT OPTION; SHOW GRANTS FOR 'joe'@'localhost'; -- 查看某用户权限(排障必用) - 回收权限:
REVOKE DELETE ON inventory.* FROM 'joe'@'localhost';;整户回收REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'joe'@'localhost'; - FLUSH PRIVILEGES 时机(考点):
CREATE USER/GRANT/REVOKE/DROP USER这类账号管理语句由服务器即时生效,通常不需要 FLUSH;只有直接改mysql.user表(INSERT/UPDATE/DELETE)之后才必须执行FLUSH PRIVILEGES;重载授权表。教材 Key Takeaway 特意把“grant, revoke, and flush privileges”并列,考的就是这个区别。 - 安全基线(呼应 test 库 Tip):删匿名用户(
DELETE FROM mysql.user WHERE User='';后 FLUSH)、删 test 库、root 仅限 localhost、按业务最小授权。
补充精讲 D:备份与恢复(Section 4 对应知识)
- 逻辑备份(默认工具):
mariadb-dump把库导出成 SQL 语句文件(RHEL8 上mysqldump是它的别名):mariadb-dump inventory > /backup/inventory.sql # 单库备份 mariadb-dump --all-databases > /backup/all.sql # 全库备份 mariadb-dump --single-transaction inventory > inventory.sql # InnoDB 一致性快照、全程不锁全库 - 恢复:mysql 客户端把备份文件当 SQL 批处理执行,目标库必须已存在:恢复到空环境时先
mysql inventory < /backup/inventory.sql mysql -e "source /backup/inventory.sql" inventory # 等价写法CREATE DATABASE inventory;再导入。 - 要点:备份是“导出 SQL”,恢复是“灌回 SQL”;生产用
--single-transaction可免停机做一致备份(InnoDB 表),含存储过程/触发器可加--routines;定时任务用 systemd timer 或 cron;备份账号给最小权限(如 SELECT、RELOAD、LOCK TABLES)。
补充精讲 E:自动化 MariaDB 部署(Section 5 对应知识)
- 教学口径(讲师 Tip 3):本节目标是“把前面手动步骤自动化”,讲义不给 playbook 细节,参考答案放在 Guided Exercise 里——自测时重点考察模块选型思路而非背 playbook。
- RHEL8 现状:没有红帽官方支持的 MariaDB 专用安装模块(社区
community.mysql主要面向 MySQL、版本行为漂移大,生产慎用)→ 课程/生产推荐基础模块组合:# 思路示例(非讲义原文):dnf → 配置 → 服务 → 防火墙 → SQL 初始化 - name: Install MariaDB server dnf: name: mariadb-server state: present - name: Start and enable mariadb service: name: mariadb state: started enabled: yes - name: Open 3306 for clients firewalld: service: mysql permanent: yes state: enabled - name: Create database / run init SQL shell: mysql -e "CREATE DATABASE IF NOT EXISTS inventory;" # 导入更复杂的 SQL 文件:copy 上传文件后用 shell 重定向 - 安全清理自动化(代替交互式 mysql_secure_installation,呼应 Tip 1):直接执行等效 SQL 任务即可——
DROP DATABASE IF EXISTS test;、DELETE FROM mysql.user WHERE User='';、FLUSH PRIVILEGES;(把讲师提示里“写 playbook 任务删除 test 库”落到实处)。 - 密码处理:避免 playbook 明文写死 root 密码,用变量 +
ansible-vault加密(DO447 已覆盖 vault 用法)。 - Lab 排障点(讲师 Tip 4):先跑 finish 再跑 start 会删
~/database-review/group_vars/db_servers/,导致后续 ansible-playbook 少了该组变量目录(即使 playbook 未声明变量也影响 group_vars 装载逻辑);若 Lab 中 playbook 行为异常,先检查该目录是否被 finish/start 清理。
命令速查表
| 命令 | 用途 |
|---|---|
dnf install -y mariadb-server | 安装 MariaDB 服务端(含客户端 mysql) |
systemctl enable --now mariadb | 启动并设置开机自启 |
mysql -uroot -p | 本机以 root 交互登录 MariaDB |
mysqladmin -uroot -p ping / mysql --version | 验证服务连通 / 客户端版本 |
mysql_secure_installation | 安全初始化(root 密码/匿名用户/root 远程/test 库) |
firewall-cmd --permanent --add-service=mysql | 放行 3306/tcp(远程客户端才需要) |
SHOW DATABASES; / SHOW TABLES; | 列出库 / 列出当前库的表 |
CREATE DATABASE db; / USE db; / DROP DATABASE db; | 建库 / 切换 / 删库 |
CREATE TABLE ...; / DESCRIBE t; / ALTER TABLE ...; / DROP TABLE ...; | 建表 / 看结构 / 改表 / 删表 |
INSERT / SELECT / UPDATE / DELETE | 增、查、改、删数据(DML) |
CREATE USER 'u'@'h' IDENTIFIED BY 'p'; | 创建数据库用户 |
GRANT ... ON db.* TO 'u'@'h'; | 授权(可加 WITH GRANT OPTION) |
REVOKE ... ON db.* FROM 'u'@'h'; | 回收权限 |
SHOW GRANTS FOR 'u'@'h'; | 查看用户权限 |
FLUSH PRIVILEGES; | 重载授权表(直改 mysql.user 后必须) |
mariadb-dump db > file.sql | 逻辑备份:导出为 SQL 文件 |
mariadb-dump --single-transaction db > file.sql | InnoDB 一致性备份(不锁全库) |
mysql db < file.sql | 从 SQL 备份文件恢复 |
核心词汇表
| 英文 | 中文速记 |
|---|---|
| MariaDB | MySQL 社区分支(RHEL8 内置 10.3) |
| relational database (RDBMS) | 关系型数据库:库→表→行/列,主键标识行 |
| SQL | 结构化查询语言(DDL 建结构 / DML 增删改查) |
| mysql (client) | MariaDB 命令行客户端 |
| mariadbd / mariadb.service | 服务端守护进程 / systemd 服务名 |
| 3306/tcp | MariaDB 默认监听端口 |
| /var/lib/mysql | 数据目录 |
| mysql_secure_installation | 安全初始化脚本(设密码/删匿名/禁 root 远程/删 test) |
| test database | 空且权限全开的测试库(其它装法可能自带,应删) |
semicolon ; | SQL 语句结束符 / 一行多语句的分隔符 |
| USE / EXIT | 切换库 / 退出客户端(可省略分号) |
| CREATE USER / DROP USER | 创建 / 删除用户('user'@'host') |
host wildcard % | 用户主机段通配(任意主机) |
| GRANT / REVOKE | 授予 / 回收权限 |
| FLUSH PRIVILEGES | 重载授权表(直改 mysql.user 后必须) |
| SHOW GRANTS | 查看指定用户权限 |
| mariadb-dump(mysqldump) | 逻辑备份:导出 SQL 语句 |
restore(mysql db < file) | 恢复:把 SQL 批处理灌回库 |
| --single-transaction | InnoDB 一致性备份选项(免停机) |
| group_vars | Ansible 组变量目录(Lab 中可能被 finish/start 清理) |
本章自测
- RHEL8 上安装 MariaDB 服务端的包名与启动命令是什么?如何验证客户端可用、服务连通?
mysql_secure_installation完成哪四类安全动作?用 yum / Ansible yum 模块安装时默认装不装 test 库?为什么仍建议删除?- 分号规则三句话:什么命令可以省略分号?一行写多条语句怎么分隔?讲师演示
use inventory; show tables;的输出中 inventory 库有哪三张表? - 写出:建库 inventory → 切库 → 建 product 表(id 自增主键、name 非空 VARCHAR)→ DESCRIBE 查看结构的 SQL;再写一条把某商品涨价 10% 的 UPDATE。
- 创建 'joe'@'localhost' 并只授 inventory 库 SELECT、INSERT 权限的命令?如何查看他已有哪些权限?
- GRANT 之后需不需要马上 FLUSH PRIVILEGES?什么情况下才必须执行该语句?
- 备份单个库用什么命令?加
--single-transaction解决什么问题?恢复前对目标库有什么前提? - RHEL8 有没有官方专用的 MariaDB 安装 Ansible 模块?自动化部署推荐的模块组合是哪几个?为什么用 SQL 任务代替交互式 mysql_secure_installation?
- Lab 里先跑 finish 再跑 start 会删除哪个目录?对后续 ansible-playbook 有什么影响?
- 把 Objectives 五条与 Key Takeaways 六条一一对应(提示:概念一条没有独立 Objective,落在各节里);再用自己的话讲“表、主键、SQL”三个关系型数据库基础概念。
