DM 数据库的物理结构:数据文件、日志文件、控制文件
一个数据库能正常运转,离不开三个「幕后英雄」:
- 存放数据的地方——数据文件
- 记录变更历史——日志文件
- 记录数据库元信息——控制文件
今天我们就把这三者扒开来看。
数据文件(Data File)
数据文件是数据库中最重要的物理组件,所有的表、索引数据都存储在这里。
DM 数据文件的特点
- 文件扩展名:
.dbf - 最小存储单位:页(Page),默认大小 8KB
- 文件结构:由头信息和数据页组成
数据文件的组织方式
DM 的数据文件按表空间进行组织:
表空间 TS_USER_DATA
├── users01.dbf (数据文件 1)
├── users02.dbf (数据文件 2)
└── users03.dbf (数据文件 3)查看数据文件信息
sql
-- 查看所有数据文件
SELECT * FROM V$DATAFILE;
-- 查看表空间对应的数据文件
SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 AS SIZE_MB
FROM DBA_DATA_FILES;关键参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| PAGE_SIZE | 页大小 | 8KB(可选 4KB/8KB/16KB/32KB) |
| MAX_SIZE | 文件最大大小 | 无限制 |
| AUTOEXTEND | 是否自动扩展 | ON |
sql
-- 创建表空间时指定数据文件
CREATE TABLESPACE TS_TEST
DATAFILE '/dm/datafile/test01.dbf' SIZE 128M
AUTOEXTEND ON NEXT 32M MAXSIZE 4G;数据文件的 I/O 优化
- 将数据文件分布在不同磁盘,减少 I/O 竞争
- 高频访问的数据放在 SSD 磁盘
- 冷数据归档到普通磁盘
重做日志文件(Redo Log)
日志文件是数据库的「生命线」——所有数据修改都会先记录到日志。
DM 日志的工作原理
事务提交 → 写入日志缓存 → 日志刷盘 → 数据修改写入数据文件
(必须) (必须)这是一个 Write-Ahead Logging(WAL) 机制:日志必须先刷盘,数据才能落盘。
日志文件结构
DM 的日志文件采用「循环覆盖」的方式工作:
┌────────────────────────────────────────┐
│ LOG_FILE_01 │ LOG_FILE_02 │ LOG_FILE_03 │
└────────────────────────────────────────┘
写入中 ─────────────────────────▶
循环覆盖 ◀────当 LOG_FILE_03 写满时,会切换到 LOG_FILE_01(如果已归档)。
日志相关视图
sql
-- 查看当前日志状态
SELECT GROUP#, STATUS, MEMBER FROM V$LOGFILE;
-- 查看日志序列号和状态
SELECT SEQUENCE#, STATUS, FIRST_TIME FROM V$LOG;日志文件配置建议
| 场景 | 建议 |
|---|---|
| 普通业务 | 日志组 3 个,每个 256MB |
| 高并发业务 | 日志组 5 个,每个 512MB |
| 核心交易系统 | 日志组 5-7 个,每个 1GB+ |
sql
-- 添加新的日志文件组
ALTER DATABASE ADD LOGFILE
('/dm/datafile/log1_01.dbf', '/dm/datafile/log1_02.dbf') SIZE 256M;控制文件(Control File)
控制文件是数据库的「导航仪」——它记录了数据库的物理结构信息。
控制文件记录的内容
- 数据库名称和创建时间
- 数据文件的位置和大小
- 日志文件的位置和状态
- 检查点(Checkpoint)信息
- 归档日志信息
控制文件的重要性
控制文件损坏 = 数据库无法启动
这就是为什么 DM 会自动维护多个控制文件副本。
查看控制文件信息
sql
-- 查看控制文件位置
SELECT NAME FROM V$CONTROLFILE;控制文件的备份
sql
-- 使用 DM 控制台工具备份控制文件
./dmctlcvt TYPE=0 SRC=/dm/data/DAMENG/dm.ctl DEST=/backup/ctl_20240101.bak三者的协作关系
应用程序
│
▼
┌─────────────────────────────────────────────────────────┐
│ 事务开始 │
│ │
│ 1. 先在日志文件中记录「我要改什么」 │
│ 2. 修改数据页 │
│ 3. 控制文件记录检查点位置 │
│ │
└─────────────────────────────────────────────────────────┘数据恢复的流程
当数据库异常崩溃时:
- 读取控制文件,获取数据文件位置
- 根据日志文件,从最后一个检查点开始恢复
- 重做所有已提交事务的修改
- 回滚未提交事务的修改
物理结构的日常维护
检查数据文件状态
sql
-- 查看数据文件是否正常
SELECT FILE_NAME, STATUS, BYTES
FROM DBA_DATA_FILES
WHERE STATUS != 'AVAILABLE';监控表空间使用
sql
-- 查看各表空间使用情况
SELECT TS.NAME AS TABLESPACE,
DF.TOTAL_SIZE/1024/1024 AS TOTAL_MB,
DF.FREE_SIZE/1024/1024 AS FREE_MB,
(DF.TOTAL_SIZE - DF.FREE_SIZE)*100/DF.TOTAL_SIZE AS USED_PCT
FROM V$TABLESPACE TS, V$DATAFILE DF
WHERE TS.FID = DF.FID;常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 表空间不足 | 数据文件未自动扩展 | 扩展数据文件或添加新文件 |
| 日志频繁切换 | 日志文件太小 | 增大日志文件大小 |
| 控制文件丢失 | 磁盘故障 | 从备份恢复 |
面试追问方向
- 如果数据文件和日志文件同时损坏,能恢复到什么程度?
- DM 的检查点机制是怎样的?
- 日志文件的大小设置过大或过小会有什么影响?
这些问题涉及到数据库的可靠性和性能,值得深入研究。
