Skip to content

DM 存储结构

存储层次结构

层次定义管理单位
数据库完整的数据集合,包含所有表空间数据库实例
表空间逻辑存储单元,包含一个或多个数据文件表空间名
数据文件物理存储文件,存储表空间的数据文件名
数据库对象在磁盘上的存储分配单位,如表段、索引段段名
连续的页组成的存储单元,是段的基本分配单位区大小
最小的存储单位,固定大小页大小

存储管理特点

  • 逻辑与物理分离:表空间是逻辑概念,数据文件是物理概念,便于管理和维护
  • 灵活的存储分配:支持多种页大小、区大小和段空间管理方式
  • 高效的空间利用:采用动态扩展和回收机制,提高存储空间利用率
  • 支持多种存储设备:适应不同类型的存储设备,如 HDD、SSD 等

表空间

表空间是 DM 数据库中的逻辑存储单元,用于组织和管理数据文件。每个表空间由一个或多个数据文件组成,所有数据库对象都存储在表空间中。

表空间类型

表空间类型用途默认名称
系统表空间存储系统表、数据字典和控制信息SYSTEM
回滚表空间存储事务回滚数据ROLL
临时表空间存储临时数据,如排序结果TEMP
主表空间默认用户表空间,存储用户数据MAIN
用户表空间自定义表空间,存储特定用户或应用的数据由用户定义

表空间属性

核心属性

属性说明默认值
名称表空间唯一标识符-
数据文件表空间包含的数据文件列表-
页大小数据文件的页大小8KB
区大小数据文件的区大小16页
段空间管理段空间管理方式AUTO
状态表空间状态(ONLINE/OFFLINE/READ ONLY)ONLINE

表空间状态

状态描述适用场景
ONLINE表空间在线,可正常访问正常运行状态
OFFLINE表空间离线,不可访问维护、备份或恢复
READ ONLY表空间只读,只能查询,不能修改历史数据、归档数据

表空间管理

创建表空间

sql
-- 创建用户表空间
CREATE TABLESPACE users
DATAFILE 'users01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 500M
PAGE_SIZE 8K
EXTENT_SIZE 16
SEGMENT_SPACE_MANAGEMENT AUTO;

修改表空间

sql
-- 添加数据文件
ALTER TABLESPACE users
ADD DATAFILE 'users02.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

-- 修改表空间状态
ALTER TABLESPACE users OFFLINE;
ALTER TABLESPACE users ONLINE;
ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE users READ WRITE;

-- 扩展数据文件
ALTER TABLESPACE users
RESIZE DATAFILE 'users01.dbf' TO 200M;

删除表空间

sql
-- 删除表空间及其数据文件
DROP TABLESPACE users INCLUDING DATAFILES;

查看表空间信息

sql
-- 查询所有表空间
SELECT * FROM DBA_TABLESPACES;

-- 查询表空间数据文件
SELECT * FROM DBA_DATA_FILES;

-- 查询表空间使用情况
SELECT TABLESPACE_NAME, FILE_NAME, BYTES, BLOCKS, STATUS
FROM DBA_DATA_FILES;

数据文件

数据文件是存储表空间数据的物理文件,每个数据文件属于一个且仅属于一个表空间。

数据文件属性

属性说明默认值
文件名数据文件的物理路径和名称-
大小数据文件的初始大小100M
自动扩展是否自动扩展OFF
扩展步长自动扩展时的步长10M
最大大小自动扩展的最大限制无限制
状态数据文件状态(ONLINE/OFFLINE)ONLINE

数据文件管理

创建数据文件

数据文件通常在创建表空间或修改表空间时创建:

sql
-- 创建表空间时指定数据文件
CREATE TABLESPACE users
DATAFILE 'users01.dbf' SIZE 100M;

-- 修改表空间时添加数据文件
ALTER TABLESPACE users
ADD DATAFILE 'users02.dbf' SIZE 100M;

维护数据文件

sql
-- 重命名数据文件
ALTER TABLESPACE users
RENAME DATAFILE 'users01.dbf' TO 'users_new01.dbf';

-- 移动数据文件(需要先离线表空间)
ALTER TABLESPACE users OFFLINE;
-- 操作系统层面移动文件
ALTER TABLESPACE users
RENAME DATAFILE 'users01.dbf' TO '/new_path/users01.dbf';
ALTER TABLESPACE users ONLINE;

-- 检查数据文件完整性
CHECK TABLESPACE users;

监控数据文件

sql
-- 查询数据文件状态
SELECT FILE_NAME, STATUS, BYTES, AUTOEXTENSIBLE, MAXBYTES
FROM DBA_DATA_FILES;

-- 查询数据文件使用情况
SELECT TABLESPACE_NAME, FILE_NAME, 
       BYTES/1024/1024 AS FILE_SIZE_MB,
       (BYTES - BLOCKS*8192/1024/1024) AS USED_MB,
       (BLOCKS*8192/1024/1024) AS FREE_MB
FROM DBA_DATA_FILES;

段是数据库对象在磁盘上的存储分配单位,每个数据库对象对应一个或多个段。

段类型

段类型用途示例
表段存储表数据普通表、分区表
索引段存储索引数据B树索引、位图索引
大字段段存储大字段数据CLOB、BLOB 类型数据
回滚段存储事务回滚数据系统回滚段、用户回滚段
临时段存储临时数据排序结果、临时表数据

段空间管理

DM 数据库支持两种段空间管理方式:

自动段空间管理(AUTO)

  • 由数据库自动管理段空间的分配和回收
  • 使用位图跟踪块的使用情况
  • 适用于大多数场景,尤其是高并发环境
  • 支持自动扩展和收缩

手动段空间管理(MANUAL)

  • 由数据库管理员手动管理段空间
  • 使用空闲列表跟踪块的使用情况
  • 适用于特殊场景,如批量加载数据
  • 需要更多的管理开销

段管理操作

sql
-- 创建表时指定段空间管理方式
CREATE TABLE test_table (
    id INT PRIMARY KEY,
    name VARCHAR(100)
) TABLESPACE users
STORAGE (SEGMENT_SPACE_MANAGEMENT AUTO);

-- 查询段信息
SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME = 'USERS';

-- 收缩段
ALTER TABLE test_table SHRINK SPACE;

-- 重建段
ALTER TABLE test_table MOVE TABLESPACE users;

区是由连续的页组成的存储单元,是段的基本分配单位。当段需要更多空间时,数据库会为其分配一个或多个区。

区属性

属性说明默认值
区大小区包含的页数16页
区数量段包含的区数动态增长
分配方式区的分配策略连续分配

区管理

区大小设置

区大小可以在表空间级别或段级别设置:

sql
-- 创建表空间时指定区大小
CREATE TABLESPACE users
DATAFILE 'users01.dbf' SIZE 100M
EXTENT_SIZE 32;

-- 创建表时指定区大小
CREATE TABLE test_table (
    id INT PRIMARY KEY,
    name VARCHAR(100)
) TABLESPACE users
STORAGE (EXTENT_SIZE 32);

区分配策略

DM 数据库采用以下区分配策略:

  1. 初始区:段创建时分配的第一个区
  2. 递增区:后续分配的区,大小可以递增
  3. 最大区:段可以分配的最大区大小
  4. 区重用:回收的区可以被重新分配给其他段

区监控

sql
-- 查询段的区信息
SELECT SEGMENT_NAME, EXTENT_ID, FILE_ID, BLOCK_ID, BYTES
FROM DBA_EXTENTS
WHERE SEGMENT_NAME = 'TEST_TABLE';

-- 查询表空间的区使用情况
SELECT TABLESPACE_NAME, COUNT(*) AS EXTENT_COUNT, 
       SUM(BYTES)/1024/1024 AS TOTAL_SIZE_MB
FROM DBA_EXTENTS
GROUP BY TABLESPACE_NAME;

页是 DM 数据库中最小的存储单位,固定大小。所有数据都存储在页中,数据库 I/O 操作的最小单位也是页。

页大小

DM 数据库支持多种页大小,可在创建数据库时指定:

页大小适用场景
4KB小数据量、高并发场景
8KB默认值,适用于大多数场景
16KB大数据量、复杂查询场景
32KB超大数据量、OLAP 场景

页类型

页类型用途
数据页存储表数据
索引页存储索引数据
大字段页存储大字段数据
段目录页存储段的目录信息
段映射页存储段的映射信息
区映射页存储区的映射信息
位图页存储块使用情况的位图

页结构

每个页由以下几个部分组成:

  1. 页头:存储页的基本信息,如页类型、页号、上一页、下一页等
  2. 页目录:存储行记录的偏移量,便于快速定位行记录
  3. 行记录:存储实际的数据行
  4. 空闲空间:页中未使用的空间
  5. 页尾:存储页的校验和,用于数据完整性检查

页管理

sql
-- 查询数据库页大小
SELECT PAGE_SIZE FROM V$DATABASE;

-- 设置表的页大小(需要与表空间页大小一致)
CREATE TABLE test_table (
    id INT PRIMARY KEY,
    name VARCHAR(100)
) TABLESPACE users
STORAGE (PAGE_SIZE 8);

-- 查看表使用的页信息
SELECT TABLE_NAME, BLOCKS, EMPTY_BLOCKS, NUM_ROWS
FROM DBA_TABLES
WHERE TABLE_NAME = 'TEST_TABLE';

存储参数配置

核心存储参数

参数名用途默认值优化建议
PAGE_SIZE数据库默认页大小8KB根据业务场景选择,OLTP 选 8KB,OLAP 选 16-32KB
EXTENT_SIZE数据库默认区大小16页大表建议 32-64 页,小表建议 16 页
SEGMENT_SPACE_MANAGEMENT默认段空间管理方式AUTO建议使用 AUTO,减少管理开销
AUTO_EXTEND_SIZE数据文件自动扩展步长100MB根据存储设备性能调整,SSD 可以更大
MAX_DATA_FILE_SIZE单个数据文件最大大小无限制根据存储设备大小设置

存储参数设置

sql
-- 创建数据库时设置存储参数
CREATE DATABASE "DAMENG" 
PAGE_SIZE 8 
EXTENT_SIZE 16 
CASE_SENSITIVE Y 
CHARSET 1 
DB_NAME DAMENG 
INSTANCE_NAME DMSERVER 
PORT_NUM 5236 
BUFFER 100 
TIME_ZONE '+08:00' 
UNICODE_FLAG 0 
LENGTH_IN_CHAR Y 
SYSTEM_PATH 'SYSTEM.DBF' 
ROLL_PATH 'ROLL.DBF' 
TEMP_PATH 'TEMP.DBF' 
MAIN_PATH 'MAIN.DBF' 
LOG_SIZE 256;

-- 修改存储参数(部分参数需要重启实例)
ALTER SYSTEM SET "PAGE_SIZE" = 16 SPFILE;

存储管理最佳实践

1. 表空间设计

  • 分离不同类型的数据:将系统数据、用户数据、索引数据、临时数据分开存储
  • 合理规划表空间大小:根据业务增长预测设置合适的初始大小和自动扩展参数
  • 使用多个数据文件:将表空间分布在多个数据文件上,提高 I/O 并行度
  • 考虑存储设备特性:根据存储设备的性能和容量调整表空间配置

2. 数据文件管理

  • 使用合适的文件大小:单个数据文件大小建议不超过 2GB,便于管理和备份
  • 合理设置自动扩展参数:避免频繁的文件扩展,影响性能
  • 将数据文件分布在不同磁盘:减少磁盘 I/O 争用
  • 定期监控数据文件使用情况:及时发现和处理空间不足问题

3. 段和区管理

  • 使用自动段空间管理:减少管理开销,提高并发性能
  • 为大表设置合适的区大小:减少区数量,提高查询性能
  • 定期重组段:消除碎片,提高空间利用率和查询性能
  • 监控段增长趋势:预测存储空间需求,提前规划扩容

4. 页大小选择

  • OLTP 场景:建议使用 8KB 页大小,平衡 I/O 效率和空间利用率
  • OLAP 场景:建议使用 16-32KB 页大小,提高大数据量查询性能
  • 混合场景:根据主要业务类型选择合适的页大小
  • 考虑兼容性:页大小一旦确定,无法修改,需要谨慎选择

5. 存储监控

  • 定期检查表空间使用率:设置告警阈值,如使用率超过 80% 时告警
  • 监控数据文件增长:分析数据增长趋势,预测存储需求
  • 检查存储碎片:定期重组碎片较多的表和索引
  • 监控 I/O 性能:分析存储 I/O 瓶颈,优化存储配置

存储结构版本差异

DM 7 vs DM 8 存储结构差异

差异点DM 7DM 8
页大小支持4KB、8KB4KB、8KB、16KB、32KB
段空间管理支持 AUTO 和 MANUAL增强了 AUTO 管理,性能更好
区分配策略简单的递增分配更智能的区分配策略,减少碎片
数据文件格式较简单优化了数据文件格式,提高了存储效率
存储监控基础监控视图提供了更丰富的存储监控视图和指标

DM 8.1 新特性

  • 优化了页结构,提高了数据存储密度
  • 增强了段空间管理,减少了碎片产生
  • 改进了区分配算法,提高了空间利用率
  • 新增了存储监控指标,便于性能分析
  • 支持更大的数据文件和表空间

存储结构与性能关系

存储结构对性能的影响

存储组件对性能的影响优化建议
页大小影响 I/O 效率和空间利用率根据业务场景选择合适的页大小
区大小影响段的空间分配效率大表使用大的区大小,小表使用小的区大小
段空间管理影响并发性能和管理开销使用 AUTO 管理方式
数据文件分布影响 I/O 并行度将数据文件分布在不同磁盘上
表空间设计影响数据访问效率分离不同类型的数据,合理规划表空间

性能优化建议

  1. 使用合适的页大小:根据业务场景选择最佳页大小
  2. 优化区大小:为不同类型的表设置合适的区大小
  3. 合理分布数据文件:提高 I/O 并行度
  4. 定期重组表和索引:消除碎片,提高查询性能
  5. 使用 SSD 存储:提高 I/O 性能,尤其是随机 I/O

常见问题(FAQ)

Q1: 如何查看 DM 数据库的页大小?

A1: 可以通过以下方式查看:

  1. SQL 查询:SELECT PAGE_SIZE FROM V$DATABASE;
  2. 配置文件:查看 dm.ini 文件中的 PAGE_SIZE 参数
  3. 管理工具:通过 DM 管理工具查看数据库属性

Q2: 如何修改表空间的区大小?

A2: 表空间的区大小在创建时指定,创建后无法直接修改。可以通过以下方式间接修改:

  1. 创建新的表空间,指定新的区大小
  2. 将原表空间中的对象迁移到新表空间
  3. 删除原表空间

Q3: 如何查看表空间的使用率?

A3: 可以使用以下 SQL 查询:

sql
SELECT TABLESPACE_NAME, 
       SUM(BYTES)/1024/1024 AS TOTAL_SIZE_MB, 
       SUM(BYTES - FREE_SPACE)/1024/1024 AS USED_SIZE_MB, 
       SUM(FREE_SPACE)/1024/1024 AS FREE_SIZE_MB, 
       ROUND((SUM(BYTES - FREE_SPACE)/SUM(BYTES))*100, 2) AS USAGE_PERCENT
FROM (SELECT TABLESPACE_NAME, BYTES, 
             CASE WHEN STATUS = 'ONLINE' THEN BYTES - USED_SPACE ELSE 0 END AS FREE_SPACE
      FROM V$TABLESPACE) 
GROUP BY TABLESPACE_NAME;

Q4: 表空间满了怎么办?

A4: 可以通过以下方式解决:

  1. 扩展数据文件大小:ALTER TABLESPACE users RESIZE DATAFILE 'users01.dbf' TO 200M;
  2. 启用数据文件自动扩展:ALTER TABLESPACE users DATAFILE 'users01.dbf' AUTOEXTEND ON;
  3. 添加新的数据文件:ALTER TABLESPACE users ADD DATAFILE 'users02.dbf' SIZE 100M;
  4. 清理表空间中的无用数据:删除过期数据或归档数据

Q5: 如何迁移表空间?

A5: 可以通过以下方式迁移表空间:

  1. 脱机迁移:将表空间离线,复制数据文件到新位置,然后修改表空间配置
  2. 联机迁移:使用 DM 提供的迁移工具,如 dmmigrate
  3. 导出导入:使用 dmp 工具导出表空间,然后在新位置导入

Q6: 如何监控存储碎片?

A6: 可以通过以下方式监控:

  1. 查询段的碎片情况:SELECT SEGMENT_NAME, EXTENT_ID, BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME = 'TEST_TABLE';
  2. 使用 DBMS_SPACE 包:CALL DBMS_SPACE.SPACE_USAGE('TEST_TABLE', 'USERS');
  3. 分析表和索引:ANALYZE TABLE TEST_TABLE COMPUTE STATISTICS;

Q7: 如何减少存储碎片?

A7: 可以通过以下方式减少碎片:

  1. 使用自动段空间管理(AUTO)
  2. 为大表设置合适的区大小
  3. 定期重组表和索引:ALTER TABLE TEST_TABLE MOVE;ALTER INDEX TEST_INDEX REBUILD;
  4. 使用合适的页大小
  5. 避免频繁的插入和删除操作

Q8: 如何优化临时表空间?

A8: 可以通过以下方式优化:

  1. 为临时表空间设置合适的大小
  2. 使用多个临时数据文件,分布在不同磁盘上
  3. 监控临时表空间使用率,及时扩展
  4. 优化排序操作,减少临时空间使用
  5. 考虑使用内存临时表空间

Q9: 如何备份表空间?

A9: 可以通过以下方式备份:

  1. 冷备份:关闭数据库,复制数据文件
  2. 热备份:使用 BACKUP TABLESPACE 命令在线备份
  3. 增量备份:备份表空间的增量变化
  4. 数据泵导出:使用 dmp 工具导出表空间数据

Q10: 如何恢复表空间?

A10: 可以通过以下方式恢复:

  1. 完全恢复:使用备份恢复整个表空间
  2. 不完全恢复:恢复到指定时间点
  3. 表级恢复:只恢复表空间中的特定表
  4. 使用闪回技术:如果启用了闪回功能,可以快速恢复数据