注册
DM8 表空间与数据文件管理
专栏/技术分享/ 文章详情 /

DM8 表空间与数据文件管理

anon 2025/09/26 343 0 0
摘要

在DM数据库的日常运维中,表空间与数据文件管理是DBA工作的核心模块。作为逻辑存储与物理存储的桥梁,表空间不仅决定了数据的存储隔离策略,更直接影响数据库的性能、可用性与可维护性。大多数都是默认MAIN表空间存储所有业务数据,导致后续出现性能瓶颈、备份恢复困难、空间管理混乱等问题。

一、DM表空间的核心逻辑

达梦表空间是一套融合了逻辑隔离、性能优化、空间管控的存储体系。

1.1 表空间与数据文件的关系

DM8的存储结构遵循数据库->表空间->数据文件->簇->页的层级模型,其中表空间是逻辑层与物理层的关键连接:

  • 逻辑层: 表空间作为逻辑容器,将数据库对象(表、索引、视图等)按业务或功能隔离。
  • 物理层: 每个表空间对应1个或多个数据文件(.DBF格式),数据文件直接存储在磁盘上,表空间通过映射关系管理数据文件的分配与使用。

**核心原则:**一个表空间可包含多个数据文件,一个数据文件只能属于一个表空间;数据文件的大小、拓展策略由表空间定义,而表空间的逻辑属性。

1.2 默认表空间

创建DM数据库时,系统会自动生成5个核心表空间,每个表空间的作用必须明确。

表空间名称 类型 核心作用 运维注意事项
SYSTEM 系统表空间 存储数据字典信息(表结构、列定义、权限) ① 不可手动创建对象(表、索引);② 不可删除或离线;③ 需监控空间使用率,避免满溢
ROLL 回滚表空间 存储事务回滚记录,保证读一致性 ① 系统自动维护,禁止手动干预;② 空间不足时自动扩展,需预留磁盘空间
RLOG 日志表空间 存储重做日志(.log文件),用于故障恢复 ① 默认 2 个日志文件循环使用;② 需定期归档,避免日志覆盖导致恢复失败
MAIN 混合表空间 默认用户表空间,支持普通表与HUGE表 ① 不建议存储核心业务数据(隔离性差);② 包含 HMAIN 目录,HUGE 数据文件存于此
TEMP 临时表空间 存储临时结果集(如排序、临时表) ① 系统自动释放临时段;② 空间满会导致排序失败,需监控并扩展

为什么不建议用MAIN表空间存储所有业务数据?

  • 隔离性差:业务数据与默认用户数据混存,备份时无法单独备份核心业务数据,恢复时易影响其他数据;
  • 性能风险:HUGE 表与普通表共享表空间,可能导致 IO 竞争;
  • 维护困难:无法按业务生命周期单独管理表空间。

1.3 普通表空间与混合表空间的核心差异

DM表空间分为普通表空间和混合表空间,两者核心区别在于是否支持HUGE表。

  • 普通表空间:仅支持普通表、索引等对象,无法存储 HUGE 表;
  • 混合表空间:可同时存储普通表与 HUGE 表,HUGE 表的物理文件存储在表空间指定的 “HUGE 数据文件路径” 下(如 MAIN 表空间的 HMAIN 目录)。

二、表空间的全生命周期管理

表空间的管理覆盖“创建->监控->扩展->维护->删除“全流程。每个环节都需要结合业务需求与性能目标设计操作方案。

2.1 表空间的创建

创建表空间时,需重点关注数据文件路径、大小、扩展策略、簇大小、填充因子这 5 个参数,它们直接决定后续的性能与可维护性。

以创建订单表空间ORDER_TBS为例,需求如下:

  • 存储订单相关表与索引,初始空间512M;
  • 支持自动扩展,避免频繁手动干预;
  • 预留更新空间,减少页分裂;
  • 簇大小与系统默认一致16页

创建SQL及参数说明:

CREATE TABLESPACE ORDER_TBS -- 定义第一个数据文件,路径需提前创建且权限为dmuser DATAFILE '/dm8/data/ORDER_TBS01.DBF' SIZE 512M -- 初始大小 AUTOEXTEND ON -- 开启自动扩展 NEXT 100M -- 每次扩展100M MAXSIZE 2048M; -- 最大扩展到2G(避免无限制占用磁盘)

参数:

  • **AUTOEXTEND:**生产环境建议开启,但需设置 MAXSIZE,防止数据文件无限制增长导致磁盘满溢

2.2 表空间的日常监控

表空间的核心监控指标是空间使用率和数据文件状态,需要定期检查,避免因空间满或数据文件损坏导致业务中断:

通过查询视图进行监控:

DM提供了V$TABLESPACE(表空间信息)和V$DATAFILE(数据文件信息)视图,可通过关联查询获取表空间的详细使用情况。

下列SQL可以用来查看表空间信息,例如数据文件路径,总空间大小,空闲空间大小,使用率等

SELECT T.NAME AS TABLESPACE_NAME, -- 表空间名称 D.PATH AS DATAFILE_PATH, -- 数据文件路径 -- 总大小(转换为MB,1页=8KB,1MB=1024KB) ROUND(D.TOTAL_SIZE * 8 / 1024, 2) AS TOTAL_MB, -- 空闲大小 ROUND(D.FREE_SIZE * 8 / 1024, 2) AS FREE_MB, -- 使用率 ROUND((1 - ROUND(D.FREE_SIZE * 8 / 1024, 2)/ ROUND(D.TOTAL_SIZE * 8 / 1024, 2))*100 ,2) AS USED_PERCENT, -- 数据文件状态(0=正常,1=失效) D.STATUS$ AS DATAFILE_STATUS FROM V$TABLESPACE T JOIN V$DATAFILE D ON T.ID = D.ID ORDER BY USED_PERCENT DESC; -- 按使用率降序,优先关注高使用率表空间

以下是通过该SQL查询出来的实例表空间信息,可以看出每个表空间的数据文件路径,总空间大小,空闲空间大小,使用率等。

image.png

监控阈值:

  • 普通表空间:使用率超过 85% 需预警,超过 95% 需立即扩展;
  • TEMP 表空间:使用率超过 90% 需扩展;
  • ROLL 表空间:使用率超过 90% 需检查是否有长事务。

2.3表空间的扩展

当表空间使用率超过阈值时,需要及时扩展。DM支持添加数据文件和扩展当前现有数据文件两种方式。

2.3.1 方案1:添加新的数据文件

若当前数据文件所在磁盘空间不足,或需分散 IO 压力(将新数据文件放在其他磁盘),建议添加新数据文件。以扩展 ORDER_TBS 为例:

ALTER TABLESPACE ORDER_TBS ADD DATAFILE '/dm8/data/ORDER_TBS02.DBF' -- 新数据文件路径(需在新磁盘) SIZE 1024 AUTOEXTEND ON NEXT 200 MAXSIZE 4096;

注意事项

  • 新数据文件的路径需提前创建,且 DM 数据库用户有读写权限;
  • 数据文件的大小建议与现有文件保持一致,便于管理;
  • 若表空间为混合表空间,添加 HUGE 数据文件需用ADD HUGE DATAFILE命令。

可以看到第二个数据文件被成功添加

image.png

2.3.2 方案2:扩展现有数据文件

若当前磁盘空间充足,可直接扩展现有数据文件的最大大小或初始大小。例如,将 ORDER_TBS01.DBF 的临时增大初始大小

ALTER TABLESPACE ORDER_TBS RESIZE DATAFILE '/dm8/data/ORDER_TBS01.DBF' TO 1024;

运行后可以看到ORDER_TBS01.DBF文件被成功扩展。
image.png

2.4 表空间的状态管理

在某些场景下,需要修改空间的状态。表空间有以下两种状态切换:表空间的在线/离线(OFFLINE/ONLINE)。

表空间的只读/可读写(READ ONLY/READ WRITE);

2.4.1 表空间在线/离线(OFFLINE/ONLINE)

当数据文件损坏或需维护时,可将表空间设为离线,避免业务访问出错;维护完成后再设为在线。
操作命令

-- 将ORDER_TBS设为离线(需确保无活跃事务访问该表空间) ALTER TABLESPACE ORDER_TBS OFFLINE; -- 维护完成后设为在线 ALTER TABLESPACE ORDER_TBS ONLINE;

关键限制

  • SYSTEM、ROLL、TEMP 表空间无法设为离线;
  • 离线表空间的对象(表、索引)无法访问,需提前通知业务暂停。

2.4.1 表空间只读 / 可读写(READ ONLY/READ WRITE)

对于冷数据(如历史订单表),可将表空间设为只读,防止误修改,同时提升查询性能(只读表空间的缓存策略更高效)。
操作命令

-- 将历史表空间HISTORY_TBS设为只读 ALTER TABLESPACE HISTORY_TBS READ ONLY; -- 需修改数据时,恢复为可读写 ALTER TABLESPACE HISTORY_TBS READ WRITE;

适用场景

  • 冷数据归档:如超过 1 年的订单数据;
  • 报表查询:报表表空间设为只读,避免业务修改影响报表准确性。

2.5 表空间的删除

删除表空间需谨慎,一旦删除,表空间中的所有对象(表、索引)和数据文件将被删除。

-- 删除ORDER_TBS表空间,同时删除数据文件(默认) DROP TABLESPACE ORDER_TBS; -- 删除表空间,但保留数据文件(用于后续恢复) DROP TABLESPACE ORDER_TBS KEEP DATAFILES;

删除前的必要检查:

  1. 确认表空间是否有业务对象
  2. 确认是否有活跃事务访问
  3. 备份表空间

三、表空间的优化

3.1按业务模块与数据特性分表空间

**核心思路:**将不同业务模块、不同生命周期的数据隔离到独立表空间,便于备份、恢复与性能优化。

规划方案举例:

业务模块 / 数据类型 表空间名称 数据文件配置 特殊设置
订单模块(热数据) ORDER_TBS 2 个数据文件,分布在不同磁盘(IO 分散) BUFFER_POOL=KEEP,FILLFACTOR=80
用户模块(热数据) USER_TBS 2 个数据文件,与 ORDER_TBS 不在同一磁盘 BUFFER_POOL=KEEP,FILLFACTOR=80
历史数据(冷数据) HISTORY_TBS 1 个大数据文件,存储在低成本磁盘 READ ONLY(归档后),FILLFACTOR=100
HUGE 表(列存储) HUGE_TBS 混合表空间,HUGE 数据文件路径独立 EXTENT SIZE=64(大簇减少分配次数)
索引专用 INDEX_TBS 2 个数据文件,存储在高速磁盘(如 SSD) BUFFER_POOL=KEEP,提升索引访问速度

3.2 数据文件的IO优化

DM8 的 IO 性能瓶颈常源于数据文件集中在单一磁盘,导致 IO 竞争。优化方案如下:

  1. 数据文件跨磁盘分布:将同一表空间的多个数据文件放在不同物理磁盘(如 ORDER_TBS01.DBF 在 /dev/sdb,ORDER_TBS02.DBF 在 /dev/sdc);
  2. 区分 IO 类型:将日志表空间(RLOG)的数据文件放在高速磁盘(SSD),因为重做日志是顺序写,高速磁盘可提升刷盘速度;将 TEMP 表空间放在独立磁盘,避免临时操作占用业务 IO;

3.3 簇大小的优化

簇是 DM的空间分配单位(由连续的页组成),簇大小的设置需结合表的大小与访问模式:

  • 小表(<100MB):使用默认簇大小(16 页 = 128KB),避免空间浪费;
  • 中大型表(100MB~10GB):簇大小设为 32 或 64 页,减少簇分配次数(如 ORDER 表,EXTENT SIZE=32);
  • HUGE 表(>10GB):簇大小设为 64 或 128 页,提升批量数据加载速度(如 HUGE_TBS 的 EXTENT SIZE=64)。

修改簇大小的命令(仅新建表空间或表时生效,已创建的表无法修改):

-- 新建表时指定簇大小 CREATE TABLE ORDER_INFO ( ORDER_ID INT PRIMARY KEY, ORDER_TIME DATETIME ) TABLESPACE ORDER_TBS STORAGE (EXTENT SIZE 32);

四、总结

  1. 隔离优先:拒绝 “所有数据放 MAIN 表空间”,按业务、数据生命周期隔离,提升可维护性;
  2. 监控前置:通过脚本自动化监控空间使用率,避免 “空间满了才发现”;
  3. 性能与安全平衡:数据文件分布需平衡 IO 与成本;
  4. 故障预案:提前备份表空间,熟悉数据文件损坏的恢复流程,减少故障停机时间。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服