OceanBase教程FG112-OceanBase DBA数据仓库实战
本文档风哥主要介绍OceanBase DBA的数据仓库实战,包括数据仓库的概念与意义、OceanBase数据仓库特性、数据仓库架构与设计、数据仓库规划、数据建模策略、ETL策略制定、数据仓库实施、ETL实施、数据仓库监控与维护、实战案例等内容,风哥教程参考OceanBase官方文档数据仓库指南、系统管理员手册等内容编写,适合DBA人员和数据仓库工程师在学习和工作中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 数据仓库的概念与意义
数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。数据仓库的意义包括:
- 数据分析:支持复杂的数据分析和报表生成
- 决策支持:为企业决策提供数据支持
- 数据整合:整合来自不同系统的数据
- 历史分析:存储历史数据,支持趋势分析
- 性能优化:针对分析查询进行优化
1.2 OceanBase数据仓库特性
OceanBase作为数据仓库的特性包括:
- 高性能:支持高并发查询和大规模数据处理
- 可扩展性:支持水平扩展,适应数据量增长
- 兼容性:兼容SQL标准,支持复杂查询
- 可靠性:支持数据备份和恢复
- 多租户:支持多租户架构,隔离不同业务数据
- 实时性:支持实时数据处理和分析
1.3 数据仓库架构与设计
数据仓库的架构包括:
- 数据源层:包括业务系统、日志系统等数据源
- 数据获取层:负责从数据源获取数据
- 数据存储层:存储原始数据和处理后的数据
- 数据处理层:包括ETL(提取、转换、加载)过程
- 数据服务层:提供数据查询和分析服务
- 应用层:包括报表、分析工具等
数据仓库的设计方法:
- 维度建模:以维度表和事实表为核心的建模方法
- 星型模型:一个事实表连接多个维度表
- 雪花模型:维度表之间存在层次关系
- 星座模型:多个事实表共享维度表
Part02-生产环境规划与建议
2.1 数据仓库规划
数据仓库的规划方法:
## 1. 需求分析
– 业务需求:明确数据仓库的业务目标和使用场景
– 数据需求:确定需要的数据来源和数据类型
– 性能需求:确定查询性能和响应时间要求
– 规模需求:预估数据量和增长趋势
## 2. 架构设计
– 技术选型:选择合适的技术栈,风哥提示:。
– 存储设计:设计数据存储方案
– 计算设计:设计数据处理和分析方案
– 安全设计:设计数据安全和访问控制方案
## 3. 数据模型设计
– 维度建模:设计维度表和事实表
– 数据粒度:确定数据的粒度级别
– 数据关系:设计表之间的关系
– 数据字典:建立数据字典,描述数据结构和含义
## 4. ETL规划
– 数据提取:确定数据提取的方式和频率
– 数据转换:设计数据转换规则和流程
– 数据加载:确定数据加载的方式和策略
– 数据质量:设计数据质量检查和处理方案
## 5. 性能规划
– 索引设计:设计合适的索引
– 分区设计:设计表分区策略
– 缓存设计:设计数据缓存策略
– 并行处理:设计并行处理方案
## 6. 监控与维护规划
– 监控指标:确定需要监控的指标
– 告警机制:设计告警机制
– 维护计划:制定定期维护计划
– 备份策略:设计数据备份策略
2.2 数据建模策略
,学习交流加群风哥微信: itpux-com。
数据建模的策略:
## 1. 维度建模
– 事实表:存储业务度量数据
– 维度表:存储描述性数据
– 维度属性:维度的描述性属性
– 事实属性:业务度量值
## 2. 星型模型
– 中心事实表:存储核心业务度量
– 维度表:围绕事实表,提供描述性信息
– 优点:查询简单,性能好
– 缺点:数据冗余
## 3. 雪花模型
– 维度表层次化:维度表之间存在层次关系
– 优点:数据冗余少
– 缺点:查询复杂,性能相对较差
## 4. 星座模型
– 多个事实表:共享维度表
– 优点:支持复杂的业务场景
– 缺点:设计和维护复杂
## 5. 数据粒度
– 确定数据的详细程度
– 细粒度:数据详细,分析灵活
– 粗粒度:数据汇总,查询性能好
– 多粒度:同时支持不同粒度的数据
## 6. 缓慢变化维度
– 类型1:覆盖旧值
– 类型2:添加新记录
– 类型3:添加新列
– 类型4:历史表
## 7. 快速变化维度,学习交流加群风哥QQ113257174。
– 维度值频繁变化
– 处理方法:使用代理键,历史表等
2.3 ETL策略制定
ETL(提取、转换、加载)的策略制定:
- 提取策略:
- 全量提取:提取所有数据
- 增量提取:只提取新增或变化的数据
- 变更数据捕获(CDC):捕获数据变更
- 转换策略:
- 数据清洗:处理缺失值、异常值等
- 数据转换:格式转换、计算等
- 数据集成:整合来自不同源的数据
- 数据验证:验证数据的完整性和一致性
- 加载策略:
- 全量加载:覆盖原有数据
- 增量加载:追加新数据
- merge加载:合并新数据和旧数据
- 调度策略:
- 批处理:定期执行ETL作业
- 实时处理:实时捕获和处理数据
- 混合处理:批处理和实时处理结合
Part03-生产环境项目实施方案
3.1 数据仓库实施
3.1.1 OceanBase数据仓库创建
# 数据仓库实施
## 1. 创建租户
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE RESOURCE UNIT dw_unit MAX_CPU = 8, MIN_CPU = 8, MEMORY_SIZE = ’32G’, MAX_IOPS = 20000, MIN_IOPS = 20000, IOPS_WEIGHT = 100;”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE RESOURCE POOL dw_pool UNIT ‘dw_unit’, UNIT_NUM 3, ZONE_LIST = (‘zone1’, ‘zone2’, ‘zone3’);”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE TENANT fgedudw RESOURCE_POOL_LIST = (‘dw_pool’) SET charset = ‘utf8mb4’, collation = ‘utf8mb4_unicode_ci’;”
## 2. 创建数据库
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE DATABASE fgedudw;”
## 3. 创建维度表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_date (
date_id INT PRIMARY KEY,
date DATE NOT NULL,
year INT NOT NULL,
month INT NOT NULL,
day INT NOT NULL,
quarter INT NOT NULL,
week INT NOT NULL,
is_weekend INT NOT NULL,
is_holiday INT NOT NULL
);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_product (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
brand VARCHAR(50) NOT NULL,
price DECIMAL(10,2) NOT NULL
);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_store (
store_id INT PRIMARY KEY,
store_name VARCHAR(100) NOT NULL,
city VARCHAR(50) NOT NULL,
district VARCHAR(50) NOT NULL,
address VARCHAR(200) NOT NULL
);”,更多学习教程公众号风哥教程itpux_com。
## 4. 创建事实表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.fact_sales (
sales_id INT PRIMARY KEY,
date_id INT NOT NULL,
product_id INT NOT NULL,
store_id INT NOT NULL,
quantity INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (date_id) REFERENCES fgedu.dim_date(date_id),
FOREIGN KEY (product_id) REFERENCES fgedu.dim_product(product_id),
FOREIGN KEY (store_id) REFERENCES fgedu.dim_store(store_id)
);”
## 5. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_date_id ON fgedu.fact_sales(date_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_product_id ON fgedu.fact_sales(product_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_store_id ON fgedu.fact_sales(store_id);”
## 6. 插入测试数据
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_date (date_id, date, year, month, day, quarter, week, is_weekend, is_holiday) VALUES
(1, ‘2026-01-01’, 2026, 1, 1, 1, 1, 1, 1),
(2, ‘2026-01-02’, 2026, 1, 2, 1, 1, 1, 0),
(3, ‘2026-01-03’, 2026, 1, 3, 1, 1, 0, 0);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_product (product_id, product_name, category, brand, price) VALUES
(1, ‘Product A’, ‘Category 1’, ‘Brand A’, 100.00),
(2, ‘Product B’, ‘Category 1’, ‘Brand B’, 200.00),
(3, ‘Product C’, ‘Category 2’, ‘Brand A’, 150.00);”,from DB视频:www.itpux.com。
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_store (store_id, store_name, city, district, address) VALUES
(1, ‘Store 1’, ‘Beijing’, ‘Haidian’, ‘Address 1’),
(2, ‘Store 2’, ‘Shanghai’, ‘Pudong’, ‘Address 2’),
(3, ‘Store 3’, ‘Guangzhou’, ‘Tianhe’, ‘Address 3’);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.fact_sales (sales_id, date_id, product_id, store_id, quantity, amount) VALUES
(1, 1, 1, 1, 10, 1000.00),
(2, 1, 2, 1, 5, 1000.00),
(3, 2, 1, 2, 8, 800.00),
(4, 2, 3, 2, 6, 900.00),
(5, 3, 2, 3, 12, 2400.00),
(6, 3, 3, 3, 10, 1500.00);”
3.2 ETL实施
3.2.1 ETL脚本开发
## 1. 数据提取脚本
#!/bin/bash
# extract.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 提取销售数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p”password” -e “SELECT * FROM fgedu.sales;” > /ob/etl/data/sales.csv
# 提取产品数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p”password” -e “SELECT * FROM fgedu.product;” > /ob/etl/data/product.csv
# 提取 store 数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p”password” -e “SELECT * FROM fgedu.store;” > /ob/etl/data/store.csv
## 2. 数据转换脚本
#!/bin/bash
# transform.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 处理销售数据
awk -F”,” ‘BEGIN {OFS=”,”} {print $1, $2, $3, $4, $5, $6}’ /ob/etl/data/sales.csv > /ob/etl/data/sales_transformed.csv
# 处理产品数据
awk -F”,” ‘BEGIN {OFS=”,”} {print $1, $2, $3, $4, $5}’ /ob/etl/data/product.csv > /ob/etl/data/product_transformed.csv
# 处理 store 数据
awk -F”,” ‘BEGIN {OFS=”,”} {print $1, $2, $3, $4, $5}’ /ob/etl/data/store.csv > /ob/etl/data/store_transformed.csv
## 3. 数据加载脚本
#!/bin/bash
# load.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 加载销售数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p”password” -e “LOAD DATA INFILE ‘/ob/etl/data/sales_transformed.csv’ INTO TABLE fgedu.fact_sales FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’;”
# 加载产品数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p”password” -e “LOAD DATA INFILE ‘/ob/etl/data/product_transformed.csv’ INTO TABLE fgedu.dim_product FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’;”
# 加载 store 数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p”password” -e “LOAD DATA INFILE ‘/ob/etl/data/store_transformed.csv’ INTO TABLE fgedu.dim_store FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’;”
## 4. ETL调度脚本
#!/bin/bash
# etl.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
echo “开始执行ETL作业…”
# 执行提取
./extract.sh
if [ $? -ne 0 ]; then
echo “提取失败”
exit 1
fi
echo “提取完成”
# 执行转换
./transform.sh
if [ $? -ne 0 ]; then
echo “转换失败”
exit 1
fi
echo “转换完成”
# 执行加载
./load.sh
if [ $? -ne 0 ]; then
echo “加载失败”
exit 1
fi
echo “加载完成”
echo “ETL作业执行成功”
3.3 数据仓库监控与维护
3.3.1 数据仓库监控
## 1. 监控数据仓库状态
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT tenant_id, tenant_name, status FROM oceanbase.__all_tenant WHERE tenant_name = ‘fgedudw’;”
## 2. 监控资源使用情况
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_tenant_resource_usage WHERE tenant_name = ‘fgedudw’;”
## 3. 监控查询性能
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_slow_stat WHERE tenant_id = 1002 ORDER BY start_time DESC LIMIT 10;”
## 4. 监控存储使用情况
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_tenant_storage WHERE tenant_name = ‘fgedudw’;”
## 5. 监控ETL作业
– 监控ETL作业执行状态
– 监控ETL作业执行时间
– 监控ETL作业错误
## 6. 监控数据质量
– 检查数据完整性
– 检查数据一致性
– 检查数据准确性
## 7. 设置告警
– 资源使用告警
– 查询性能告警
– ETL作业失败告警
– 数据质量告警
3.3.2 数据仓库维护
## 1. 数据备份
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ALTER SYSTEM BACKUP TENANT fgedudw FULL;”
## 2. 索引维护
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ALTER TABLE fgedu.fact_sales REBUILD INDEX idx_fact_sales_date_id;”
## 3. 统计信息更新
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ANALYZE TABLE fgedu.fact_sales;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ANALYZE TABLE fgedu.dim_date;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ANALYZE TABLE fgedu.dim_product;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “ANALYZE TABLE fgedu.dim_store;”
## 4. 数据清理
– 清理过期数据
– 清理临时表
– 清理日志文件
## 5. 性能优化
– 调整索引
– 调整分区
– 调整参数
– 优化查询
## 6. 容量规划
– 监控数据增长趋势
– 预测存储需求
– 规划扩容方案
## 7. 安全管理
– 审查用户权限
– 监控异常访问
– 更新安全策略
Part04-生产案例与实战讲解
4.1 OceanBase数据仓库创建实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 需求:创建一个销售数据仓库,用于分析销售情况
## 实施步骤
### 1. 创建租户和资源池
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE RESOURCE UNIT dw_unit MAX_CPU = 8, MIN_CPU = 8, MEMORY_SIZE = ’32G’, MAX_IOPS = 20000, MIN_IOPS = 20000, IOPS_WEIGHT = 100;”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE RESOURCE POOL dw_pool UNIT ‘dw_unit’, UNIT_NUM 3, ZONE_LIST = (‘zone1’, ‘zone2’, ‘zone3’);”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “CREATE TENANT fgedudw RESOURCE_POOL_LIST = (‘dw_pool’) SET charset = ‘utf8mb4’, collation = ‘utf8mb4_unicode_ci’;”
### 2. 创建数据库和表结构
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE DATABASE fgedudw;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_date (
date_id INT PRIMARY KEY,
date DATE NOT NULL,
year INT NOT NULL,
month INT NOT NULL,
day INT NOT NULL,
quarter INT NOT NULL,
week INT NOT NULL,
is_weekend INT NOT NULL,
is_holiday INT NOT NULL
);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_product (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
brand VARCHAR(50) NOT NULL,
price DECIMAL(10,2) NOT NULL
);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.dim_store (
store_id INT PRIMARY KEY,
store_name VARCHAR(100) NOT NULL,
city VARCHAR(50) NOT NULL,
district VARCHAR(50) NOT NULL,
address VARCHAR(200) NOT NULL
);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.fact_sales (
sales_id INT PRIMARY KEY,
date_id INT NOT NULL,
product_id INT NOT NULL,
store_id INT NOT NULL,
quantity INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (date_id) REFERENCES fgedu.dim_date(date_id),
FOREIGN KEY (product_id) REFERENCES fgedu.dim_product(product_id),
FOREIGN KEY (store_id) REFERENCES fgedu.dim_store(store_id)
);”
### 3. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_date_id ON fgedu.fact_sales(date_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_product_id ON fgedu.fact_sales(product_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_store_id ON fgedu.fact_sales(store_id);”
### 4. 插入测试数据
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_date (date_id, date, year, month, day, quarter, week, is_weekend, is_holiday) VALUES
(1, ‘2026-01-01’, 2026, 1, 1, 1, 1, 1, 1),
(2, ‘2026-01-02’, 2026, 1, 2, 1, 1, 1, 0),
(3, ‘2026-01-03’, 2026, 1, 3, 1, 1, 0, 0),
(4, ‘2026-01-04’, 2026, 1, 4, 1, 1, 0, 0),
(5, ‘2026-01-05’, 2026, 1, 5, 1, 1, 0, 0),
(6, ‘2026-01-06’, 2026, 1, 6, 1, 2, 1, 0),
(7, ‘2026-01-07’, 2026, 1, 7, 1, 2, 1, 0);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_product (product_id, product_name, category, brand, price) VALUES
(1, ‘Product A’, ‘Category 1’, ‘Brand A’, 100.00),
(2, ‘Product B’, ‘Category 1’, ‘Brand B’, 200.00),
(3, ‘Product C’, ‘Category 2’, ‘Brand A’, 150.00),
(4, ‘Product D’, ‘Category 2’, ‘Brand B’, 120.00),
(5, ‘Product E’, ‘Category 3’, ‘Brand A’, 300.00);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.dim_store (store_id, store_name, city, district, address) VALUES
(1, ‘Store 1’, ‘Beijing’, ‘Haidian’, ‘Address 1’),
(2, ‘Store 2’, ‘Shanghai’, ‘Pudong’, ‘Address 2’),
(3, ‘Store 3’, ‘Guangzhou’, ‘Tianhe’, ‘Address 3’),
(4, ‘Store 4’, ‘Shenzhen’, ‘Nanshan’, ‘Address 4’),
(5, ‘Store 5’, ‘Hangzhou’, ‘Xihu’, ‘Address 5’);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “INSERT INTO fgedu.fact_sales (sales_id, date_id, product_id, store_id, quantity, amount) VALUES
(1, 1, 1, 1, 10, 1000.00),
(2, 1, 2, 1, 5, 1000.00),
(3, 2, 1, 2, 8, 800.00),
(4, 2, 3, 2, 6, 900.00),
(5, 3, 2, 3, 12, 2400.00),
(6, 3, 3, 3, 10, 1500.00),
(7, 4, 4, 4, 15, 1800.00),
(8, 4, 5, 4, 8, 2400.00),
(9, 5, 1, 5, 20, 2000.00),
(10, 5, 4, 5, 12, 1440.00);”
### 5. 测试查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT d.year, d.month, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales f
JOIN fgedu.dim_date d ON f.date_id = d.date_id
GROUP BY d.year, d.month
ORDER BY d.year, d.month;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT p.category, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales f
JOIN fgedu.dim_product p ON f.product_id = p.product_id
GROUP BY p.category
ORDER BY total_sales DESC;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT s.city, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales f
JOIN fgedu.dim_store s ON f.store_id = s.store_id
GROUP BY s.city
ORDER BY total_sales DESC;”
## 案例总结
– 成功创建了销售数据仓库
– 设计了合理的维度表和事实表
– 验证了数据仓库的查询功能
– 掌握了数据仓库创建的基本操作
4.2 ETL实施实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 需求:从业务系统提取数据,转换后加载到数据仓库
## 实施步骤
### 1. 准备数据源
– 在业务系统创建销售表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.sales (
sales_id INT PRIMARY KEY,
sales_date DATE NOT NULL,
product_id INT NOT NULL,
store_id INT NOT NULL,
quantity INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);”
– 插入测试数据
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.sales (sales_id, sales_date, product_id, store_id, quantity, amount) VALUES
(1, ‘2026-01-08’, 1, 1, 5, 500.00),
(2, ‘2026-01-08’, 2, 1, 3, 600.00),
(3, ‘2026-01-09’, 1, 2, 10, 1000.00),
(4, ‘2026-01-09’, 3, 2, 8, 1200.00);”
### 2. 创建ETL脚本
– 提取脚本(extract.sh)
#!/bin/bash
# extract.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 提取销售数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p”password” -e “SELECT sales_id, sales_date, product_id, store_id, quantity, amount FROM fgedu.sales;” > /ob/etl/data/sales.csv
– 转换脚本(transform.sh)
#!/bin/bash
# transform.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 处理销售数据
awk -F”\t” ‘BEGIN {OFS=”,”} NR>1 {print $1, $2, $3, $4, $5, $6}’ /ob/etl/data/sales.csv > /ob/etl/data/sales_transformed.csv
– 加载脚本(load.sh)
#!/bin/bash
# load.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 加载销售数据
obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p”password” -e “LOAD DATA INFILE ‘/ob/etl/data/sales_transformed.csv’ INTO TABLE fgedu.fact_sales FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’;”
– 调度脚本(etl.sh)
#!/bin/bash
# etl.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
echo “开始执行ETL作业…”
# 执行提取
./extract.sh
if [ $? -ne 0 ]; then
echo “提取失败”
exit 1
fi
echo “提取完成”
# 执行转换
./transform.sh
if [ $? -ne 0 ]; then
echo “转换失败”
exit 1
fi
echo “转换完成”
# 执行加载
./load.sh
if [ $? -ne 0 ]; then
echo “加载失败”
exit 1
fi
echo “加载完成”
echo “ETL作业执行成功”
### 3. 执行ETL作业
$ chmod +x extract.sh transform.sh load.sh etl.sh
$ ./etl.sh
### 4. 验证数据加载
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT * FROM fgedu.fact_sales WHERE sales_id > 10;”
### 5. 调度ETL作业
– 使用crontab设置定时任务
0 2 * * * /ob/etl/etl.sh >> /ob/etl/log/etl.log 2>&1
## 案例总结
– 成功创建了ETL脚本
– 实现了从业务系统到数据仓库的数据提取、转换和加载
– 验证了ETL作业的执行效果
– 掌握了ETL实施的基本操作
4.3 数据仓库性能调优实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 问题:数据仓库查询性能较慢,需要进行性能调优
## 实施步骤
### 1. 分析慢查询
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_slow_stat WHERE tenant_id = 1002 ORDER BY start_time DESC LIMIT 10;”
### 2. 查看执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “EXPLAIN SELECT d.year, d.month, p.category, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales f
JOIN fgedu.dim_date d ON f.date_id = d.date_id
JOIN fgedu.dim_product p ON f.product_id = p.product_id
GROUP BY d.year, d.month, p.category
ORDER BY total_sales DESC;”
### 3. 优化索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE INDEX idx_fact_sales_date_product ON fgedu.fact_sales(date_id, product_id);”
### 4. 优化表结构
– 分区表设计
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “CREATE TABLE fgedu.fact_sales_partition (
sales_id INT PRIMARY KEY,
date_id INT NOT NULL,
product_id INT NOT NULL,
store_id INT NOT NULL,
quantity INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (date_id) REFERENCES fgedu.dim_date(date_id),
FOREIGN KEY (product_id) REFERENCES fgedu.dim_product(product_id),
FOREIGN KEY (store_id) REFERENCES fgedu.dim_store(store_id)
) PARTITION BY RANGE (date_id) (
PARTITION p202601 VALUES LESS THAN (32),
PARTITION p202602 VALUES LESS THAN (60),
PARTITION p202603 VALUES LESS THAN (91),
PARTITION p202604 VALUES LESS THAN (121),
PARTITION p202605 VALUES LESS THAN (152),
PARTITION p202606 VALUES LESS THAN (182),
PARTITION p202607 VALUES LESS THAN (213),
PARTITION p202608 VALUES LESS THAN (244),
PARTITION p202609 VALUES LESS THAN (274),
PARTITION p202610 VALUES LESS THAN (305),
PARTITION p202611 VALUES LESS THAN (335),
PARTITION p202612 VALUES LESS THAN (366)
);”
### 5. 调整参数
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET memory_limit = ’48G’ TENANT ‘fgedudw’;”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET parallel_execution_threads = 8 TENANT ‘fgedudw’;”
### 6. 优化查询
– 优化前
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT d.year, d.month, p.category, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales f
JOIN fgedu.dim_date d ON f.date_id = d.date_id
JOIN fgedu.dim_product p ON f.product_id = p.product_id
GROUP BY d.year, d.month, p.category
ORDER BY total_sales DESC;”
– 优化后
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudw -p -e “SELECT d.year, d.month, p.category, SUM(f.amount) AS total_sales
FROM fgedu.fact_sales_partition f
JOIN fgedu.dim_date d ON f.date_id = d.date_id
JOIN fgedu.dim_product p ON f.product_id = p.product_id
WHERE d.year = 2026
GROUP BY d.year, d.month, p.category
ORDER BY total_sales DESC;”
### 7. 测试性能
– 执行查询,记录响应时间
– 比较优化前后的性能差异
## 案例总结
– 成功优化了数据仓库查询性能
– 创建了合适的索引和分区表
– 调整了数据库参数
– 提高了查询响应速度
Part05-风哥经验总结与分享
5.1 数据仓库最佳实践
数据仓库的最佳实践:
- 合理设计数据模型:使用维度建模,设计合适的维度表和事实表
- 优化存储结构:使用分区表,提高查询性能
- 创建合适的索引:根据查询需求创建索引,提高查询速度
- 优化ETL流程:提高数据加载效率,确保数据质量
- 监控和维护:建立完善的监控体系,定期维护数据仓库
- 性能调优:定期分析慢查询,进行性能调优
- 数据质量:确保数据的完整性、一致性和准确性
- 安全管理:加强数据安全,保护敏感信息
5.2 ETL最佳实践
ETL的最佳实践:
- 增量提取:使用增量提取,减少数据处理量
- 并行处理:使用并行处理,提高ETL效率
- 数据质量检查:在ETL过程中进行数据质量检查
- 错误处理:建立完善的错误处理机制
- 日志记录:记录ETL过程的详细日志
- 调度管理:使用调度工具管理ETL作业
- 监控告警:监控ETL作业的执行状态,设置告警
- 版本控制:对ETL脚本进行版本控制
5.3 数据仓库管理技巧
数据仓库管理的技巧:
- 容量规划:定期进行容量规划,确保存储充足
- 数据归档:对历史数据进行归档,减少存储压力
- 元数据管理:建立完善的元数据管理体系
- 用户培训:对用户进行培训,提高数据仓库的使用效率
- 文档管理:建立完善的文档,记录数据仓库的设计和使用方法
- 性能监控:实时监控数据仓库的性能,及时发现问题
- 灾备方案:建立数据仓库的灾备方案,确保数据安全
- 持续优化:根据业务需求的变化,持续优化数据仓库
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
