注册
达梦数据库表空间、段、簇、页的关系
技术分享/ 文章详情 /

达梦数据库表空间、段、簇、页的关系

何处惹尘埃 2026/07/31 222 1 0

问题一:达梦数据库表空间、段、簇、页的关系

一、环境信息

  • 实例:TESTDB(端口 5239)
  • 数据目录/home/dmdba/dmdata/test/TESTDB
  • 测试表TEST.EMPLOYEE(3 条记录)

二、核心概念

层级 概念 说明 当前实例值
第1层 页(Page) 数据库最小的 I/O 单元 8KB(GLOBAL_PAGE_SIZE=8192
第2层 簇(Extent) 由连续的页组成,是空间分配的基本单位 16 页(默认)→ 128KB
第3层 段(Segment) 由若干个簇组成,对应一个数据库对象 TEST.EMPLOYEE 表占用 1 个段
第4层 表空间(Tablespace) 逻辑容器,包含多个段,对应物理数据文件 MAINSYSTEMROLLTEMPTEST_TS

关系链:页 → 簇 → 段 → 表空间 → 数据文件

三、实操过程与输出解读

3.1 查看所有表空间

执行命令

SELECT TABLESPACE_NAME, STATUS, CONTENTS, LOGGING FROM DBA_TABLESPACES;

输出

行号  TABLESPACE_NAME STATUS  CONTENTS    LOGGING
----- --------------- ------ ----------- -------
1     SYSTEM          ONLINE PERMANENT   NULL
2     ROLL            ONLINE UNDO        NULL
3     TEMP            ONLINE TEMPORARY   NULL
4     MAIN            ONLINE PERMANENT   NULL

各列含义

列名 含义 当前值说明
TABLESPACE_NAME 表空间名称 SYSTEM、ROLL、TEMP、MAIN
STATUS 表空间状态 ONLINE(在线可用)
CONTENTS 表空间类型 PERMANENT(永久数据)、UNDO(回滚数据)、TEMPORARY(临时数据)
LOGGING 是否记录日志 NULL 表示默认(记录日志)

3.2 查看表空间对应的数据文件

执行命令

SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB, STATUS FROM DBA_DATA_FILES;

输出

行号  FILE_NAME                                    TABLESPACE_NAME  SIZE_MB  STATUS
----- -------------------------------------------- ---------------- -------- ----------
1     /home/dmdba/dmdata/test/TESTDB/MAIN.DBF      MAIN             128      AVAILABLE
2     /home/dmdba/dmdata/test/TESTDB/ROLL.DBF      ROLL             128      AVAILABLE
3     /home/dmdba/dmdata/test/TESTDB/SYSTEM.DBF    SYSTEM           160      AVAILABLE
4     /home/dmdba/dmdata/test/TESTDB/TEMP.DBF      TEMP             32       AVAILABLE

各列含义

列名 含义 当前值说明
FILE_NAME 数据文件的物理路径 所有文件位于实例数据目录下
TABLESPACE_NAME 所属表空间 与上面查询一一对应
SIZE_MB 数据文件大小(MB) SYSTEM 最大(160MB),TEMP 最小(32MB)
STATUS 文件状态 AVAILABLE(可用)

3.3 查看 TEST.EMPLOYEE 表对应的段信息

执行命令

SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BYTES/1024/1024 AS SIZE_MB FROM DBA_SEGMENTS WHERE OWNER='TEST' AND SEGMENT_NAME='EMPLOYEE';

输出

行号  SEGMENT_NAME  SEGMENT_TYPE  TABLESPACE_NAME  HEADER_FILE  HEADER_BLOCK  SIZE_MB
----- ------------- ------------- ---------------- ------------ ------------- --------
1     EMPLOYEE      TABLE         MAIN             0            16            0

各列含义

列名 含义 当前值说明
SEGMENT_NAME 段名称 与表名相同
SEGMENT_TYPE 段类型 TABLE(表段)、INDEX(索引段)等
TABLESPACE_NAME 所在表空间 MAIN(默认用户表空间)
HEADER_FILE 段头所在文件编号 0 表示第一个数据文件(MAIN.DBF)
HEADER_BLOCK 段头所在块号 16 表示从第 16 块开始存储该表的元数据
SIZE_MB 段占用空间大小 0 MB(极小表,实际占用了 1 个簇)

3.4 查看该表段占用的簇(扩展)信息

执行命令

SELECT EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER='TEST' AND SEGMENT_NAME='EMPLOYEE' ORDER BY EXTENT_ID;

输出

行号  EXTENT_ID  FILE_ID  BLOCK_ID  BLOCKS
----- ---------- -------- --------- -------
1     1          0        16        3

各列含义

列名 含义 当前值说明
EXTENT_ID 簇编号 从 1 开始编号(0 号簇通常用于系统元数据)
FILE_ID 所在文件编号 0 表示 MAIN.DBF 文件
BLOCK_ID 簇起始块号 从第 16 块开始分配
BLOCKS 该簇包含的页数 3 页(约 24KB)

关键理解

  • 表的第一个簇从第 16 块开始,正好对应段头位置(HEADER_BLOCK=16),说明段头块也是簇的第一个块。
  • 虽然表只有 3 条记录,但仍分配了 1 个簇(3 个页),因为空间分配的最小单位是

3.5 查看页大小和簇大小参数

执行命令

SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME LIKE '%PAGE%';

输出(相关行提取)

行号  PARA_NAME            PARA_VALUE
----- -------------------- ----------
13    GLOBAL_PAGE_SIZE     8192

查看簇大小(操作系统命令):

grep -i "extent_size" /home/dmdba/dmdata/test/TESTDB/dm.ini

输出

MEMORY_EXTENT_SIZE = 32    # Memory extent size (MB)

注意MEMORY_EXTENT_SIZE 是内存扩展大小,磁盘簇大小(EXTENT_SIZE)默认 16 页,未在 dm.ini 中显式设置。

3.6 创建新表空间并验证(表空间规划实操)

执行命令(注意:达梦要求数据文件最小 32MB):

CREATE TABLESPACE TEST_TS DATAFILE 'TEST_TS01.DBF' SIZE 32 AUTOEXTEND ON NEXT 1 MAXSIZE 128;

输出

操作已执行

验证新表空间

SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TEST_TS';

输出

行号  TABLESPACE_NAME  STATUS
----- ---------------- ------
1     TEST_TS          ONLINE

在新表空间中创建表

CREATE TABLE TEST.TEST_TS_TABLE (ID INT) TABLESPACE TEST_TS;

输出操作已执行

查看新表的段信息

SELECT SEGMENT_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME='TEST_TS_TABLE' AND OWNER='TEST';

输出

行号  SEGMENT_NAME    TABLESPACE_NAME  SIZE_MB
----- --------------- ---------------- --------
1     TEST_TS_TABLE   TEST_TS          0

查看新表占用的簇

SELECT EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER='TEST' AND SEGMENT_NAME='TEST_TS_TABLE';

输出

行号  EXTENT_ID  FILE_ID  BLOCK_ID  BLOCKS
----- ---------- -------- --------- -------
1     65         0        1040      3

结论:新表在 TEST_TS 表空间中分配了一个簇,起始块号为 1040,占 3 个页,验证了表空间规划的有效性。

四、概念关系验证总结

验证内容 查询视图 结果
页大小 V$DM_INI 8192 字节(8KB)
簇大小 默认值 16 页(128KB)
段信息 DBA_SEGMENTS TEST.EMPLOYEE 段位于 MAIN 表空间,段头在第 16 块
簇信息 DBA_EXTENTS TEST.EMPLOYEE 占用 1 个簇,3 个页,从第 16 块开始
表空间创建 CREATE TABLESPACE TEST_TS 表空间创建成功,数据文件 32MB
新表段/簇 DBA_SEGMENTS/DBA_EXTENTS 新表在 TEST_TS 表空间中分配了簇,起始块 1040

关系链验证

页 (8KB) → 簇 (16页 = 128KB) → 段 (1个簇起步) → 表空间 (MAIN/TEST_TS) → 数据文件 (.DBF)

五、错误记录与处理方法

错误 原因 解决方法
[-2111]:无效的列名[PAGE_SIZE] V$DATABASE 不包含 PAGE_SIZE 改用 V$DM_INI 查询 GLOBAL_PAGE_SIZE
未选定行PARA_NAME='PAGE_SIZE' 参数名大小写或实际名称不同 使用模糊查询 LIKE '%PAGE%'
[-2007]:语法分析出错 SQL 语句中有不可见字符或多余的符号 重新输入,确保语句以 ; 结尾
[-2422]:数据文件大小无效 数据文件小于 32MB 将 SIZE 改为 32 或更大
CREATE TABLESPACE 失败 目录权限不足 chown dmdba:dinstall 授权

六、表空间规划建议

  1. 数据与索引分离:将表放在 DATA_TS,索引放在 IDX_TS,减少 I/O 竞争
  2. 大表独立表空间:便于备份、恢复和监控
  3. 开启自动扩展AUTOEXTEND ON NEXT 10M MAXSIZE 2G
  4. 定期监控使用率
    SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME;
  5. 合理设置初始大小:达梦要求数据文件最小 32MB,规划时预留足够空间

七、完整操作命令清单

-- 1. 查看所有表空间 SELECT TABLESPACE_NAME, STATUS, CONTENTS, LOGGING FROM DBA_TABLESPACES; -- 2. 查看数据文件 SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB, STATUS FROM DBA_DATA_FILES; -- 3. 查看表的段信息 SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BYTES/1024/1024 AS SIZE_MB FROM DBA_SEGMENTS WHERE OWNER='TEST' AND SEGMENT_NAME='EMPLOYEE'; -- 4. 查看表的簇信息 SELECT EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER='TEST' AND SEGMENT_NAME='EMPLOYEE' ORDER BY EXTENT_ID; -- 5. 查看页大小 SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='GLOBAL_PAGE_SIZE'; -- 6. 创建表空间(最小 32MB) CREATE TABLESPACE TEST_TS DATAFILE 'TEST_TS01.DBF' SIZE 32 AUTOEXTEND ON NEXT 1 MAXSIZE 128; -- 7. 在新表空间中创建表并验证 CREATE TABLE TEST.TEST_TS_TABLE (ID INT) TABLESPACE TEST_TS; SELECT SEGMENT_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME='TEST_TS_TABLE' AND OWNER='TEST'; SELECT EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER='TEST' AND SEGMENT_NAME='TEST_TS_TABLE';
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服