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. 最佳实践
- 分区基础:冷热分离
- 存储分层:SSD/HDD
- 压缩策略:OLTP/ARCHIVE
- 归档表空间:低成本
- ILM 自动:19c+
- Heat Map 监控:访问模式
- In-Memory 热数据:性能
- KEEP Pool:小热点
- 定期归档:管理
- TTS 迁移:归档
14. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Information Lifecycle Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/