---
url: /courses/cloud-platform-build-management/lab-07/index.md
---
# 实训 07：MariaDB 复制、备份与恢复

所有数据库、卷和备份限定在 `~/cloud-course/lab-07`，Compose 项目名为 `cloud-course-lab-07`。

## 一、目标与最终证据

* 两项数据库服务健康，复制 IO 与 SQL 线程为 `Yes`；
* 主库写入后，从库查到同一条记录；
* `course_db.sql` 具有校验值；
* 删除测试库后，主从都能从备份恢复记录；
* `verify.sh` 通过，课程项目清理完成。

## 二、安全边界

* 不连接、查询或删除服务器上的其他数据库。
* 不映射宿主机 3306，不修改防火墙或安全组。
* `.env`、SQL 备份和数据卷不上传智慧职教。
* `DROP DATABASE` 前必须核对项目名、库名和校验结果。
* 只运行 `DROP DATABASE course_db`，不能使用变量、通配或批量删库脚本。

## 三、任务 1：准备配置

```bash
[ECS] mkdir -p ~/cloud-course/lab-07
[ECS] cd ~/cloud-course/lab-07
[ECS] cp .env.example .env
[ECS] chmod 600 .env
```

编辑 `.env`，为三项密码填入不同随机值。检查服务与配置：

```bash
[ECS] docker compose config --services
[ECS] docker compose config --quiet
```

截图 1：服务名和配置检查。\
说明：配置检查尚未证明哪些运行结果？

## 四、任务 2：预检并启动

```bash
[ECS] free -h
[ECS] df -hT /
[ECS] docker compose ls
```

确认资源和现有项目后启动：

```bash
[ECS] docker compose up -d
[ECS] docker compose ps
```

等待两项服务为 `healthy`。截图 2：两项服务状态和内部 3306。

## 五、任务 3：检查复制机制

```bash
[ECS] docker compose exec -T replica sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" -e "SHOW REPLICA STATUS\G"' \
  | grep -E 'Slave_(IO|SQL)_Running|Seconds_Behind_Master|Last_(IO|SQL)_Error'
```

截图 3：IO、SQL 线程和延迟。\
如果任一线程为 `No`，保留 `Last_IO_Error` 或 `Last_SQL_Error`，不要删除卷重来。

## 六、任务 4：主库写、从库读

```bash
[ECS] docker compose exec -T primary sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" course_db' \
  < seed.sql
```

```bash
[ECS] docker compose exec -T replica sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" course_db \
  -e "SELECT id,item FROM course_check ORDER BY id;"'
```

截图 4：主库写入命令和从库查询结果。\
说明：这项证据与复制线程状态有什么不同？

## 七、任务 5：创建并核对逻辑备份

```bash
[ECS] mkdir -p backup
[ECS] docker compose exec -T primary sh -lc \
  'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" \
  --single-transaction --routines --events --databases course_db' \
  > backup/course_db.sql
```

```bash
[ECS] ls -lh backup/course_db.sql
[ECS] sha256sum backup/course_db.sql | tee backup/course_db.sql.sha256
```

截图 5：备份文件、大小和校验值。不得截取 SQL 中的真实业务数据。

## 八、任务 6：三项确认后删除测试库

第一项确认项目：

```bash
[ECS] docker compose ls
```

第二项确认库名：

```bash
[ECS] docker compose exec -T primary sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" -Nse \
  "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME=\"course_db\";"'
```

第三项确认备份：

```bash
[ECS] sha256sum -c backup/course_db.sql.sha256
```

三项输出分别为 `cloud-course-lab-07`、`course_db` 和 `OK` 后，才执行：

```bash
[ECS] docker compose exec -T primary sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" -e "DROP DATABASE course_db;"'
```

等待复制后，分别在主库、从库确认目标库不存在。截图 6：三项确认与删除后的结果。

## 九、任务 7：恢复并回归

```bash
[ECS] docker compose exec -T primary sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"' \
  < backup/course_db.sql
```

```bash
[ECS] docker compose exec -T primary sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" course_db \
  -e "SELECT id,item FROM course_check ORDER BY id;"'
```

```bash
[ECS] docker compose exec -T replica sh -lc \
  'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" course_db \
  -e "SELECT id,item FROM course_check ORDER BY id;"'
```

截图 7：导入退出码、主库记录和从库记录。

## 十、验收与清理

在服务仍运行时执行：

```bash
[ECS] bash verify.sh
```

完成报告后清理：

```bash
[ECS] docker compose down
```

普通 `down` 会删除本课容器和网络，保留命名卷。是否删除个人实验卷由教师统一安排；不要触碰未知卷。

最终只上传：

```txt
班级_学号_姓名_第07次课_数据库复制与恢复报告.docx
```
