Skip to content

DM 存储管理

表空间管理

1. 表空间类型

DM数据库中的表空间分为以下几种类型:

  • 系统表空间:存储系统数据和字典信息,如SYSTEM、ROLL、TEMP等
  • 用户表空间:存储用户数据,由用户创建和管理
  • 临时表空间:存储临时数据,如排序结果、临时表等
  • 回滚表空间:存储事务回滚信息

2. 表空间创建

sql
-- 创建用户表空间
CREATE TABLESPACE USERS 
    DATAFILE '/dm/data/DAMENG/users01.dbf' SIZE 100M 
    AUTOEXTEND ON NEXT 10M MAXSIZE 1000M;

-- 创建临时表空间
CREATE TEMPORARY TABLESPACE TEMP2 
    TEMPFILE '/dm/data/DAMENG/temp02.dbf' SIZE 50M 
    AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

-- 创建大文件表空间
CREATE TABLESPACE BIG_DATA 
    DATAFILE '/dm/data/DAMENG/big_data01.dbf' SIZE 10G 
    AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;

3. 表空间管理

sql
-- 查看表空间信息
SELECT * FROM V$TABLESPACE;

-- 查看表空间使用情况
SELECT T.NAME AS TABLESPACE_NAME,
       ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS USED_MB,
       ROUND(T.FREE_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS FREE_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * 100 / T.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$TABLESPACE T, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE';

-- 修改表空间状态
-- 联机表空间
ALTER TABLESPACE USERS ONLINE;

-- 脱机表空间
ALTER TABLESPACE USERS OFFLINE;

-- 删除表空间
DROP TABLESPACE USERS INCLUDING CONTENTS AND DATAFILES;

数据文件管理

1. 数据文件创建

sql
-- 向现有表空间添加数据文件
ALTER TABLESPACE USERS ADD DATAFILE '/dm/data/DAMENG/users02.dbf' SIZE 100M;

-- 添加自动扩展的数据文件
ALTER TABLESPACE USERS ADD DATAFILE '/dm/data/DAMENG/users03.dbf' 
    SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

2. 数据文件管理

sql
-- 查看数据文件信息
SELECT * FROM V$DATAFILE;

-- 修改数据文件大小
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf' RESIZE 200M;

-- 启用数据文件自动扩展
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf' 
    AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

-- 禁用数据文件自动扩展
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf' AUTOEXTEND OFF;

-- 重命名数据文件
ALTER TABLESPACE USERS OFFLINE;
ALTER DATABASE RENAME FILE '/dm/data/DAMENG/users01.dbf' TO '/dm/data/DAMENG/new_users01.dbf';
ALTER TABLESPACE USERS ONLINE;

存储参数配置

1. 页面大小配置

页面大小是DM数据库的重要存储参数,影响数据库的性能和存储效率。

配置方法

  • 数据库创建时指定,默认为8KB
  • 支持的页面大小:4KB、8KB、16KB、32KB
  • 页面大小一旦确定,无法修改

选择原则

  • 小页面(4KB、8KB)适合OLTP系统,减少I/O开销
  • 大页面(16KB、32KB)适合OLAP系统,提高大查询性能

2. extent大小配置

extent是数据库存储分配的基本单位,由多个连续的页面组成。

sql
-- 查看当前extent大小
SELECT PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'EXTENT_SIZE';

-- 修改extent大小(需要重启数据库)
ALTER SYSTEM SET EXTENT_SIZE = 16 SCOPE = SPFILE;

3. 存储参数优化

根据业务需求和系统特点,优化存储参数可以提高数据库性能:

  • DB_CACHE_SIZE:调整数据库缓存大小,提高数据访问速度
  • LOG_BUFFER:调整日志缓冲区大小,提高日志写入性能
  • SORT_BUF_SIZE:调整排序缓冲区大小,提高排序性能
  • TEMP_SPACE_LIMIT:调整临时表空间大小限制

存储优化策略

1. 表空间优化

  • 合理规划表空间:根据业务特点和数据类型,创建不同的表空间
  • 设置合适的自动扩展策略:避免频繁的空间扩展操作
  • 定期监控表空间使用情况:及时扩展表空间,避免空间不足
  • 定期进行表空间碎片整理:提高存储利用率和查询性能

2. 数据文件优化

  • 合理分布数据文件:将数据文件分布在不同的磁盘上,提高I/O并行度
  • 设置合适的数据文件大小:避免数据文件过大或过小
  • 使用大文件表空间:对于大数据量场景,使用大文件表空间提高管理效率

3. 存储结构优化

  • 使用分区表:对于大表,使用分区表提高查询性能和管理效率
  • 使用索引组织表:对于频繁按主键访问的表,使用索引组织表提高访问速度
  • 合理设置存储参数:根据表的特点,设置合适的存储参数,如PCTFREE、PCTUSED等

存储监控与维护

1. 存储监控

sql
-- 监控表空间使用情况
SELECT T.NAME AS TABLESPACE_NAME,
       ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS USED_MB,
       ROUND(T.FREE_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS FREE_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * 100 / T.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$TABLESPACE T, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE'
ORDER BY USED_PERCENT DESC;

-- 监控数据文件I/O情况
SELECT DF.NAME AS FILE_NAME,
       FI.PHY_READS,
       FI.PHY_WRITES,
       FI.PHY_READ_TIME,
       FI.PHY_WRITE_TIME
FROM V$DATAFILE DF, V$FILE_IOSTAT FI
WHERE DF.ID = FI.FILE_ID
ORDER BY (FI.PHY_READ_TIME + FI.PHY_WRITE_TIME) DESC;

2. 存储维护

  • 定期进行表空间碎片整理

    sql
    ALTER TABLESPACE USERS COALESCE;
  • 定期重建表和索引

    sql
    -- 重建表
    ALTER TABLE EMP MOVE;
    
    -- 重建索引
    ALTER INDEX PK_EMP REBUILD;
  • 定期检查存储完整性

    sql
    -- 检查表空间完整性
    DBMS_DBHELP.CHECK_TABLESPACE('USERS');
    
    -- 检查数据文件完整性
    DBMS_DBHELP.CHECK_DATAFILE('/dm/data/DAMENG/users01.dbf');

存储故障处理

1. 表空间空间不足

症状

  • 应用程序报错:"表空间不足"
  • 数据库日志中出现表空间满的错误信息
  • V$TABLESPACE视图中表空间使用率接近100%

处理方法

sql
-- 方法1:扩展数据文件大小
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf' RESIZE 200M;

-- 方法2:添加新的数据文件
ALTER TABLESPACE USERS ADD DATAFILE '/dm/data/DAMENG/users02.dbf' SIZE 100M;

-- 方法3:启用数据文件自动扩展
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf' 
    AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

2. 数据文件损坏

症状

  • 数据库无法启动
  • 查询时出现数据文件损坏错误
  • 错误日志中出现数据文件损坏信息

处理方法

  1. 尝试使用dmrman工具修复数据文件:

    shell
    dmrman CTLSTMT="REPAIR DATAFILE '/dm/data/DAMENG/users01.dbf'";
  2. 如果修复失败,使用备份恢复数据文件:

    shell
    -- 还原数据文件
    dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' DATAFILE '/dm/data/DAMENG/users01.dbf' FROM BACKUPSET '/dm/backup/full_backup_20230101'";
    
    -- 恢复数据文件
    dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' DATAFILE '/dm/data/DAMENG/users01.dbf' FROM BACKUPSET '/dm/backup/full_backup_20230101'";

3. 存储I/O性能问题

症状

  • 查询响应时间变长
  • 数据库负载升高
  • V$DISK_IO视图中I/O等待时间增加

处理方法

  • 分析I/O热点:

    sql
    SELECT DF.NAME AS FILE_NAME, FI.PHY_READS, FI.PHY_WRITES, FI.PHY_READ_TIME, FI.PHY_WRITE_TIME
    FROM V$DATAFILE DF, V$FILE_IOSTAT FI
    WHERE DF.ID = FI.FILE_ID
    ORDER BY (FI.PHY_READ_TIME + FI.PHY_WRITE_TIME) DESC;
  • 将热点数据文件分布到不同的磁盘上

  • 优化查询语句,减少I/O操作

  • 增加数据库缓存大小,减少物理I/O

  • 考虑使用高性能存储设备,如SSD

存储备份与恢复

1. 表空间备份

sql
-- 备份表空间
BACKUP TABLESPACE USERS BACKUPSET '/dm/backup/tablespace_users_backup';

-- 备份多个表空间
BACKUP TABLESPACE SYSTEM, USERS, TEMP BACKUPSET '/dm/backup/multiple_tablespaces_backup';

2. 表空间恢复

sql
-- 还原表空间
RESTORE TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';

-- 恢复表空间
RECOVER TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';

-- 还原并恢复表空间
RESTORE TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';
RECOVER TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';
ALTER TABLESPACE USERS ONLINE;

3. 数据文件备份与恢复

sql
-- 备份数据文件
BACKUP DATAFILE '/dm/data/DAMENG/users01.dbf' BACKUPSET '/dm/backup/datafile_users01_backup';

-- 还原数据文件
RESTORE DATAFILE '/dm/data/DAMENG/users01.dbf' FROM BACKUPSET '/dm/backup/datafile_users01_backup';

-- 恢复数据文件
RECOVER DATAFILE '/dm/data/DAMENG/users01.dbf' FROM BACKUPSET '/dm/backup/datafile_users01_backup';

版本差异

版本存储管理功能差异
DM 8.1.1.41 及以上支持基本的存储管理功能
DM 8.1.1.133 及以上增强了表空间管理功能,支持大文件表空间
DM 8.1.2.126 及以上支持更灵活的存储参数配置和优化策略

常见问题(FAQ)

Q1: 如何选择合适的页面大小?

A1: 选择页面大小需要考虑以下因素:

  • 业务类型:OLTP系统适合小页面(4KB、8KB),OLAP系统适合大页面(16KB、32KB)
  • 数据大小:大页面适合存储大型数据,减少I/O操作
  • 内存大小:大页面需要更多的内存支持
  • 应用兼容性:某些应用可能对页面大小有特定要求

Q2: 如何监控表空间使用情况?

A2: 可以通过以下方法监控表空间使用情况:

sql
SELECT T.NAME AS TABLESPACE_NAME,
       ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS USED_MB,
       ROUND(T.FREE_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS FREE_MB,
       ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * 100 / T.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$TABLESPACE T, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE'
ORDER BY USED_PERCENT DESC;

Q3: 如何处理表空间碎片?

A3: 处理表空间碎片的方法包括:

  • 表空间碎片整理:ALTER TABLESPACE USERS COALESCE;
  • 重建表:ALTER TABLE EMP MOVE;
  • 重建索引:ALTER INDEX PK_EMP REBUILD;
  • 导出导入表数据:通过导出导入操作重建表,消除碎片

Q4: 如何优化存储性能?

A4: 优化存储性能的方法包括:

  • 合理规划表空间和数据文件
  • 将数据文件分布在不同的磁盘上
  • 使用合适的页面大小和extent大小
  • 优化数据库缓存参数
  • 使用SSD等高性能存储设备
  • 定期进行存储维护和优化

Q5: 如何备份和恢复表空间?

A5: 可以使用以下命令备份和恢复表空间:

sql
-- 备份表空间
BACKUP TABLESPACE USERS BACKUPSET '/dm/backup/tablespace_users_backup';

-- 还原表空间
RESTORE TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';

-- 恢复表空间
RECOVER TABLESPACE USERS FROM BACKUPSET '/dm/backup/tablespace_users_backup';

Q6: 如何处理数据文件损坏?

A6: 处理数据文件损坏的步骤包括:

  1. 尝试使用dmrman工具修复数据文件
  2. 如果修复失败,使用备份恢复数据文件
  3. 恢复后验证数据完整性
  4. 分析损坏原因,采取预防措施