/home/dmdba/dmdata/test/TESTDBTEST.EMPLOYEE(3 条记录)| 层级 | 概念 | 说明 | 当前实例值 |
|---|---|---|---|
| 第1层 | 页(Page) | 数据库最小的 I/O 单元 | 8KB(GLOBAL_PAGE_SIZE=8192) |
| 第2层 | 簇(Extent) | 由连续的页组成,是空间分配的基本单位 | 16 页(默认)→ 128KB |
| 第3层 | 段(Segment) | 由若干个簇组成,对应一个数据库对象 | TEST.EMPLOYEE 表占用 1 个段 |
| 第4层 | 表空间(Tablespace) | 逻辑容器,包含多个段,对应物理数据文件 | MAIN、SYSTEM、ROLL、TEMP、TEST_TS |
关系链:页 → 簇 → 段 → 表空间 → 数据文件
执行命令:
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 表示默认(记录日志) |
执行命令:
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(可用) |
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 个簇) |
执行命令:
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) |
关键理解:
HEADER_BLOCK=16),说明段头块也是簇的第一个块。执行命令:
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中显式设置。
执行命令(注意:达梦要求数据文件最小 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 授权 |
DATA_TS,索引放在 IDX_TS,减少 I/O 竞争AUTOEXTEND ON NEXT 10M MAXSIZE 2GSELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB
FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME;
-- 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';
文章
阅读量
获赞
