Skip to content

DM 数据库的物理结构:数据文件、日志文件、控制文件

一个数据库能正常运转,离不开三个「幕后英雄」:

  • 存放数据的地方——数据文件
  • 记录变更历史——日志文件
  • 记录数据库元信息——控制文件

今天我们就把这三者扒开来看。

数据文件(Data File)

数据文件是数据库中最重要的物理组件,所有的表、索引数据都存储在这里。

DM 数据文件的特点

  1. 文件扩展名.dbf
  2. 最小存储单位:页(Page),默认大小 8KB
  3. 文件结构:由头信息和数据页组成

数据文件的组织方式

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)

控制文件是数据库的「导航仪」——它记录了数据库的物理结构信息。

控制文件记录的内容

  1. 数据库名称和创建时间
  2. 数据文件的位置和大小
  3. 日志文件的位置和状态
  4. 检查点(Checkpoint)信息
  5. 归档日志信息

控制文件的重要性

控制文件损坏 = 数据库无法启动

这就是为什么 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. 控制文件记录检查点位置                                │
│                                                         │
└─────────────────────────────────────────────────────────┘

数据恢复的流程

当数据库异常崩溃时:

  1. 读取控制文件,获取数据文件位置
  2. 根据日志文件,从最后一个检查点开始恢复
  3. 重做所有已提交事务的修改
  4. 回滚未提交事务的修改

物理结构的日常维护

检查数据文件状态

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 的检查点机制是怎样的?
  • 日志文件的大小设置过大或过小会有什么影响?

这些问题涉及到数据库的可靠性和性能,值得深入研究。

基于 VitePress 构建