外观
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 数据库采用以下区分配策略:
- 初始区:段创建时分配的第一个区
- 递增区:后续分配的区,大小可以递增
- 最大区:段可以分配的最大区大小
- 区重用:回收的区可以被重新分配给其他段
区监控
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 场景 |
页类型
| 页类型 | 用途 |
|---|---|
| 数据页 | 存储表数据 |
| 索引页 | 存储索引数据 |
| 大字段页 | 存储大字段数据 |
| 段目录页 | 存储段的目录信息 |
| 段映射页 | 存储段的映射信息 |
| 区映射页 | 存储区的映射信息 |
| 位图页 | 存储块使用情况的位图 |
页结构
每个页由以下几个部分组成:
- 页头:存储页的基本信息,如页类型、页号、上一页、下一页等
- 页目录:存储行记录的偏移量,便于快速定位行记录
- 行记录:存储实际的数据行
- 空闲空间:页中未使用的空间
- 页尾:存储页的校验和,用于数据完整性检查
页管理
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 7 | DM 8 |
|---|---|---|
| 页大小支持 | 4KB、8KB | 4KB、8KB、16KB、32KB |
| 段空间管理 | 支持 AUTO 和 MANUAL | 增强了 AUTO 管理,性能更好 |
| 区分配策略 | 简单的递增分配 | 更智能的区分配策略,减少碎片 |
| 数据文件格式 | 较简单 | 优化了数据文件格式,提高了存储效率 |
| 存储监控 | 基础监控视图 | 提供了更丰富的存储监控视图和指标 |
DM 8.1 新特性
- 优化了页结构,提高了数据存储密度
- 增强了段空间管理,减少了碎片产生
- 改进了区分配算法,提高了空间利用率
- 新增了存储监控指标,便于性能分析
- 支持更大的数据文件和表空间
存储结构与性能关系
存储结构对性能的影响
| 存储组件 | 对性能的影响 | 优化建议 |
|---|---|---|
| 页大小 | 影响 I/O 效率和空间利用率 | 根据业务场景选择合适的页大小 |
| 区大小 | 影响段的空间分配效率 | 大表使用大的区大小,小表使用小的区大小 |
| 段空间管理 | 影响并发性能和管理开销 | 使用 AUTO 管理方式 |
| 数据文件分布 | 影响 I/O 并行度 | 将数据文件分布在不同磁盘上 |
| 表空间设计 | 影响数据访问效率 | 分离不同类型的数据,合理规划表空间 |
性能优化建议
- 使用合适的页大小:根据业务场景选择最佳页大小
- 优化区大小:为不同类型的表设置合适的区大小
- 合理分布数据文件:提高 I/O 并行度
- 定期重组表和索引:消除碎片,提高查询性能
- 使用 SSD 存储:提高 I/O 性能,尤其是随机 I/O
常见问题(FAQ)
Q1: 如何查看 DM 数据库的页大小?
A1: 可以通过以下方式查看:
- SQL 查询:
SELECT PAGE_SIZE FROM V$DATABASE; - 配置文件:查看 dm.ini 文件中的 PAGE_SIZE 参数
- 管理工具:通过 DM 管理工具查看数据库属性
Q2: 如何修改表空间的区大小?
A2: 表空间的区大小在创建时指定,创建后无法直接修改。可以通过以下方式间接修改:
- 创建新的表空间,指定新的区大小
- 将原表空间中的对象迁移到新表空间
- 删除原表空间
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: 可以通过以下方式解决:
- 扩展数据文件大小:
ALTER TABLESPACE users RESIZE DATAFILE 'users01.dbf' TO 200M; - 启用数据文件自动扩展:
ALTER TABLESPACE users DATAFILE 'users01.dbf' AUTOEXTEND ON; - 添加新的数据文件:
ALTER TABLESPACE users ADD DATAFILE 'users02.dbf' SIZE 100M; - 清理表空间中的无用数据:删除过期数据或归档数据
Q5: 如何迁移表空间?
A5: 可以通过以下方式迁移表空间:
- 脱机迁移:将表空间离线,复制数据文件到新位置,然后修改表空间配置
- 联机迁移:使用 DM 提供的迁移工具,如 dmmigrate
- 导出导入:使用 dmp 工具导出表空间,然后在新位置导入
Q6: 如何监控存储碎片?
A6: 可以通过以下方式监控:
- 查询段的碎片情况:
SELECT SEGMENT_NAME, EXTENT_ID, BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME = 'TEST_TABLE'; - 使用 DBMS_SPACE 包:
CALL DBMS_SPACE.SPACE_USAGE('TEST_TABLE', 'USERS'); - 分析表和索引:
ANALYZE TABLE TEST_TABLE COMPUTE STATISTICS;
Q7: 如何减少存储碎片?
A7: 可以通过以下方式减少碎片:
- 使用自动段空间管理(AUTO)
- 为大表设置合适的区大小
- 定期重组表和索引:
ALTER TABLE TEST_TABLE MOVE;、ALTER INDEX TEST_INDEX REBUILD; - 使用合适的页大小
- 避免频繁的插入和删除操作
Q8: 如何优化临时表空间?
A8: 可以通过以下方式优化:
- 为临时表空间设置合适的大小
- 使用多个临时数据文件,分布在不同磁盘上
- 监控临时表空间使用率,及时扩展
- 优化排序操作,减少临时空间使用
- 考虑使用内存临时表空间
Q9: 如何备份表空间?
A9: 可以通过以下方式备份:
- 冷备份:关闭数据库,复制数据文件
- 热备份:使用
BACKUP TABLESPACE命令在线备份 - 增量备份:备份表空间的增量变化
- 数据泵导出:使用 dmp 工具导出表空间数据
Q10: 如何恢复表空间?
A10: 可以通过以下方式恢复:
- 完全恢复:使用备份恢复整个表空间
- 不完全恢复:恢复到指定时间点
- 表级恢复:只恢复表空间中的特定表
- 使用闪回技术:如果启用了闪回功能,可以快速恢复数据
