Oracle 数据库冷热数据分离

Oracle 数据库冷热数据分离

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

冷热数据分离是存储优化关键[1]:

目的

  • 性能优化
  • 存储成本
  • 管理简化

2. 冷热数据定义

2.1 热数据

  • 频繁访问
  • 在线业务
  • 高性能存储

2.2 冷数据

  • 历史数据
  • 归档数据
  • 低成本存储

2.3 区分标准

  • 访问频率
  • 时间
  • 业务价值

3. 分区实现

3.1 Range 分区

CREATE TABLE sales (
  id NUMBER,
  sale_date DATE,
  amount NUMBER
)
PARTITION BY RANGE (sale_date) (
  PARTITION p2020 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')),
  PARTITION p2021 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')),
  PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
  PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
  PARTITION p_current VALUES LESS THAN (MAXVALUE)
);

3.2 Interval 分区

CREATE TABLE sales (...) 
PARTITION BY RANGE (sale_date) 
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
  PARTITION p_old VALUES LESS THAN (TO_DATE('2020-01-01', 'YYYY-MM-DD'))
);

详细见:Oracle 分区表性能优化


4. 存储分层

4.1 ASM 磁盘组

+DATA_HOT  - SSD,热数据
+DATA_COLD - HDD,冷数据
+ARCHIVE   - 大容量,归档

4.2 表空间分离

-- 热数据表空间
CREATE TABLESPACE ts_hot DATAFILE '+DATA_HOT' SIZE 100G;

-- 冷数据表空间
CREATE TABLESPACE ts_cold DATAFILE '+DATA_COLD' SIZE 500G;

-- 归档表空间
CREATE TABLESPACE ts_archive DATAFILE '+ARCHIVE' SIZE 1T;

4.3 分区存储

-- 不同分区不同表空间
CREATE TABLE sales (...)
PARTITION BY RANGE (sale_date) (
  PARTITION p2020 VALUES LESS THAN (...) TABLESPACE ts_archive,
  PARTITION p2021 VALUES LESS THAN (...) TABLESPACE ts_cold,
  PARTITION p_current VALUES LESS THAN (MAXVALUE) TABLESPACE ts_hot
);

5. 压缩策略

5.1 热数据

-- OLTP 压缩
ALTER TABLE sales MODIFY PARTITION p_current COMPRESS FOR OLTP;

5.2 冷数据

-- ARCHIVE HIGH
ALTER TABLE sales MODIFY PARTITION p2020 COMPRESS FOR ARCHIVE HIGH;
ALTER TABLE sales MODIFY PARTITION p2021 COMPRESS FOR ARCHIVE LOW;

详细见:Oracle 表压缩技术


6. 数据归档

6.1 分区交换

-- 创建归档表
CREATE TABLE sales_archive_2020 (...) TABLESPACE ts_archive;

-- 交换分区
ALTER TABLE sales 
  EXCHANGE PARTITION p2020 
  WITH TABLE sales_archive_2020;

-- 删除分区
ALTER TABLE sales DROP PARTITION p2020;

6.2 分区 TRUNCATE

-- 清理历史数据
ALTER TABLE sales DROP PARTITION p2020 UPDATE GLOBAL INDEXES;

6.3 Transportable

-- 归档表空间传输到其他库
ALTER TABLESPACE archive_tbs READ ONLY;
expdp ... transport_tablespaces=archive_tbs ...

详细见:Oracle TTS 传输表空间


7. In-Memory 加速

7.1 热数据 In-Memory

ALTER TABLE sales MODIFY PARTITION p_current INMEMORY;

7.2 冷数据禁用

ALTER TABLE sales MODIFY PARTITION p2020 NO INMEMORY;

详细见:Oracle 12c In-Memory Column Store


8. KEEP Pool

8.1 热数据 KEEP

ALTER TABLE small_hot_table STORAGE (BUFFER_POOL KEEP);
ALTER INDEX idx_hot STORAGE (BUFFER_POOL KEEP);

8.2 KEEP Pool 大小

ALTER SYSTEM SET db_keep_cache_size = 4G;

9. ILM(Information Lifecycle Management)

9.1 19c+ ILM 策略

-- 压缩策略
ALTER TABLE sales ILM ADD POLICY 
  COMPRESS SEGMENT AFTER 30 DAYS OF NO MODIFICATION;

-- 分层策略
ALTER TABLE sales ILM ADD POLICY 
  TIER TO ts_cold READ ONLY AFTER 90 DAYS OF NO MODIFICATION;

-- 归档策略
ALTER TABLE sales ILM ADD POLICY 
  TIER TO ts_archive READ ONLY AFTER 1 YEAR OF NO MODIFICATION;

9.2 启用 ADO

-- Heat Map
ALTER SYSTEM SET heat_map = ON;

-- ILM
EXEC DBMS_ILM.ADMIN_ILM;

10. 监控

10.1 数据访问热度

-- Heat Map(12c+)
SELECT * FROM dba_heat_map_segment;
SELECT * FROM dba_heat_map_seg_hash;

10.2 分区使用

SELECT 
  table_name, 
  partition_name, 
  num_rows, 
  last_analyzed
FROM user_tab_partitions
WHERE table_name = 'SALES';

10.3 表空间

SELECT 
  tablespace_name,
  ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS gb
FROM dba_data_files
GROUP BY tablespace_name;

11. 实战案例

11.1 案例:电商订单

1. 分区:按月 Range
2. 热数据:近 3 月,SSD,OLTP 压缩,In-Memory
3. 冷数据:3-12 月,HDD,ARCHIVE LOW
4. 归档:1 年以上,ARCHIVE HIGH,TTS 迁移
5. 监控:Heat Map

11.2 案例:日志表

1. 分区:按天 Range
2. 热数据:7 天,本地存储
3. 冷数据:30 天,归档表空间
4. 删除:90 天,DROP PARTITION

12. 常见坑与排错

12.1 归档失败

-- 1. 表空间不足
-- 2. 全局索引失效
-- 3. UPDATE GLOBAL INDEXES

12.2 性能下降

-- 1. 检查分区裁剪
-- 2. 检查索引
-- 3. 检查统计信息

12.3 ILM 不生效

-- 1. heat_map = ON
-- 2. ADO 启用
-- 3. 策略正确

13. 最佳实践

  1. 分区基础:冷热分离
  2. 存储分层:SSD/HDD
  3. 压缩策略:OLTP/ARCHIVE
  4. 归档表空间:低成本
  5. ILM 自动:19c+
  6. Heat Map 监控:访问模式
  7. In-Memory 热数据:性能
  8. KEEP Pool:小热点
  9. 定期归档:管理
  10. TTS 迁移:归档

14. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Information Lifecycle Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/