外观
DB2 存储架构
存储架构概述
DB2数据库的存储架构是数据库物理存储管理的核心,它定义了数据如何在磁盘上组织和存储。理解DB2的存储架构对于数据库管理员来说至关重要,因为它直接影响数据库的性能、可用性和可管理性。
DB2的存储架构采用分层设计,从最高层的数据库到底层的物理存储设备,主要包括以下几个层次:
- 数据库(Database)
- 存储组(Storage Group)
- 表空间(Tablespace)
- 容器(Container)
- 物理存储设备(Physical Storage Device)
核心组件
1. 存储组
1.1 概述
存储组(Storage Group),也称为表空间容器组,是DB2 10.1及以上版本引入的概念,用于简化存储管理。存储组是逻辑上的存储单元,用于管理一组容器,并为表空间提供存储位置。
1.2 类型
- 自动存储组:系统自动管理容器的大小和数量
- 非自动存储组:管理员手动管理容器的大小和数量
1.3 配置方法
bash
# 创建自动存储组
CREATE STOGROUP stogroup1 ON '/path1', '/path2' AUTOMATIC;
# 创建非自动存储组
CREATE STOGROUP stogroup2 ON '/path3', '/path4' NOT AUTOMATIC;
# 修改存储组
ALTER STOGROUP stogroup1 ADD '/path5' DROP '/path1';
# 查看存储组信息
SELECT * FROM SYSIBMADM.STOGROUP2. 表空间
2.1 概述
表空间(Tablespace)是数据库中数据存储的逻辑单元,用于组织和管理数据库对象(如表、索引、大对象等)。每个数据库至少包含三个系统表空间:SYSCATSPACE、TEMPSPACE1和USERSPACE1。
2.2 类型
| 表空间类型 | 用途 | 特点 |
|---|---|---|
| 系统表空间 | 存储系统目录表 | 必须在数据库创建时创建,不可删除 |
| 用户表空间 | 存储用户数据和索引 | 可根据需求创建多个 |
| 临时表空间 | 存储临时数据 | 用于排序、分组等操作,可创建多个 |
| 大对象(LOB)表空间 | 存储大对象数据 | 用于存储超过32KB的大型数据 |
| XML表空间 | 存储XML数据 | 用于存储XML类型的数据 |
| 长字段表空间 | 存储长字段数据 | 用于存储LONG VARCHAR和LONG VARGRAPHIC类型的数据 |
2.3 配置方法
bash
# 创建自动存储表空间
CREATE TABLESPACE userspace2 USING STOGROUP stogroup1;
# 创建非自动存储表空间
CREATE TABLESPACE userspace3 MANAGED BY DATABASE USING (FILE '/path1/userspace3' 100M);
# 创建临时表空间
CREATE TEMPORARY TABLESPACE tempspace2 MANAGED BY DATABASE USING (FILE '/path1/tempspace2' 50M);
# 创建LOB表空间
CREATE TABLESPACE lobspace1 USING STOGROUP stogroup1;
# 查看表空间信息
SELECT * FROM SYSIBMADM.TABLESPACES3. 容器
3.1 概述
容器(Container)是表空间的物理存储单元,直接映射到物理存储设备上的文件或目录。每个表空间由一个或多个容器组成,数据在容器之间均匀分布。
3.2 类型
- 文件容器:映射到操作系统文件
- 目录容器:映射到操作系统目录
- 原始设备容器:映射到原始磁盘设备(不推荐使用)
3.3 配置方法
bash
# 添加文件容器到表空间
ALTER TABLESPACE userspace3 ADD (FILE '/path2/userspace3_2' 100M);
# 调整文件容器大小
ALTER TABLESPACE userspace3 RESIZE (FILE '/path1/userspace3' 200M);
# 添加目录容器到表空间
ALTER TABLESPACE userspace3 ADD (DIRECTORY '/path3/userspace3_dir');
# 查看容器信息
SELECT * FROM SYSIBMADM.CONTAINERS存储架构设计
1. 设计原则
- 分离原则:将不同类型的数据(如数据、索引、临时数据)存储在不同的表空间中
- 性能原则:将频繁访问的数据存储在高性能存储设备上
- 可用性原则:使用多个容器和存储设备,提高数据可用性
- 可管理性原则:使用存储组简化存储管理
- 扩展性原则:考虑未来的数据增长,设计可扩展的存储架构
2. 设计示例
bash
# 创建存储组
CREATE STOGROUP data_stogroup ON '/data1', '/data2' AUTOMATIC;
CREATE STOGROUP index_stogroup ON '/index1', '/index2' AUTOMATIC;
CREATE STOGROUP temp_stogroup ON '/temp1', '/temp2' AUTOMATIC;
CREATE STOGROUP lob_stogroup ON '/lob1', '/lob2' AUTOMATIC;
# 创建表空间
CREATE TABLESPACE data_ts USING STOGROUP data_stogroup;
CREATE TABLESPACE index_ts USING STOGROUP index_stogroup;
CREATE TEMPORARY TABLESPACE temp_ts MANAGED BY AUTOMATIC STORAGE USING STOGROUP temp_stogroup;
CREATE TABLESPACE lob_ts USING STOGROUP lob_stogroup;
# 创建表,指定数据和索引存储位置
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
sale_date DATE,
customer_id INT,
amount DECIMAL(10,2),
description CLOB(1M)
) IN data_ts INDEX IN index_ts LOB (description) IN lob_ts;存储管理操作
1. 表空间管理
1.1 监控表空间使用情况
bash
# 查看表空间使用情况
SELECT TBSP_NAME, TBSP_TYPE, TBSP_TOTAL_SIZE_KB, TBSP_USED_SIZE_KB,
TBSP_FREE_SIZE_KB, TBSP_USED_RATIO_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION
ORDER BY TBSP_USED_RATIO_PERCENT DESC;
# 监控表空间增长趋势
db2 "SELECT TBSP_NAME, SNAPSHOT_TIMESTAMP, TBSP_USED_SIZE_KB
FROM SYSIBMADM.TBSP_UTILIZATION_HISTORY
WHERE SNAPSHOT_TIMESTAMP > CURRENT TIMESTAMP - 7 DAYS
ORDER BY TBSP_NAME, SNAPSHOT_TIMESTAMP";1.2 扩展表空间
bash
# 自动扩展表空间(适用于自动存储表空间)
ALTER TABLESPACE userspace2 AUTORESIZE YES INCREASESIZE 100M MAXSIZE 10G;
# 手动扩展表空间(适用于非自动存储表空间)
ALTER TABLESPACE userspace3 ADD (FILE '/path4/userspace3_3' 200M);
# 调整容器大小
ALTER TABLESPACE userspace3 RESIZE (FILE '/path1/userspace3' 300M);1.3 重组表空间
bash
# 重组表空间中的所有表
REORG TABLESPACE userspace2;
# 重组表空间中的特定表
REORG TABLE sales IN userspace2;
# 在线重组表空间
REORG TABLESPACE userspace2 ONLINE;2. 存储组管理
2.1 监控存储组
bash
# 查看存储组信息
SELECT STOGROUP_NAME, DBPGNAME, PATH, FREE_PAGE_CNT, USED_PAGE_CNT
FROM SYSIBMADM.STOGROUP_CONTENTS;
# 查看存储组使用情况
SELECT STOGROUP_NAME, SUM(USED_SIZE_KB) AS TOTAL_USED_KB,
SUM(FREE_SIZE_KB) AS TOTAL_FREE_KB,
(SUM(USED_SIZE_KB) / (SUM(USED_SIZE_KB) + SUM(FREE_SIZE_KB))) * 100 AS USED_PERCENT
FROM SYSIBMADM.STOGROUP_UTILIZATION
GROUP BY STOGROUP_NAME;2.2 修改存储组
bash
# 添加路径到存储组
ALTER STOGROUP data_stogroup ADD '/data3';
# 从存储组中删除路径
ALTER STOGROUP data_stogroup DROP '/data1';
# 更改存储组的默认缓冲池
ALTER STOGROUP data_stogroup PAGESIZE 32K;存储性能优化
1. 存储设备优化
- 使用高性能存储设备(如SSD)存储频繁访问的数据
- 为不同类型的数据使用不同性能的存储设备
- 配置适当的RAID级别(如RAID 10用于事务日志,RAID 5用于数据)
- 优化存储设备的I/O调度算法
2. 表空间优化
- 为不同类型的数据创建独立的表空间
- 选择合适的页面大小(4KB、8KB、16KB或32KB)
- 配置适当的自动扩展参数
- 使用多个容器分布I/O负载
- 定期重组表空间,减少碎片
3. 容器优化
- 在多个物理设备上创建容器,实现I/O并行
- 避免在系统盘上创建容器
- 为容器预留足够的空间,减少扩展频率
- 使用相同大小的容器,确保数据均匀分布
4. 缓冲池优化
bash
# 创建缓冲池,匹配表空间页面大小
CREATE BUFFERPOOL bp32k SIZE 10000 PAGESIZE 32K;
# 关联缓冲池和表空间
ALTER TABLESPACE data_ts BUFFERPOOL bp32k;
# 监控缓冲池使用情况
SELECT BP_NAME, POOL_DATA_L_READS, POOL_DATA_P_READS,
(1 - (POOL_DATA_P_READS / NULLIF(POOL_DATA_L_READS, 0))) * 100 AS HIT_RATIO
FROM SYSIBMADM.BP_UTILIZATION;生产实践
1. 企业级存储架构设计
1.1 分层存储设计
在企业级环境中,通常采用分层存储设计,根据数据的访问频率和重要性将数据存储在不同性能的存储设备上:
- 热数据:频繁访问的数据,存储在高性能SSD上
- 温数据:偶尔访问的数据,存储在SAS硬盘上
- 冷数据:很少访问的数据,存储在SATA硬盘或磁带库上
1.2 实施示例
bash
# 创建不同性能级别的存储组
CREATE STOGROUP hot_stogroup ON '/ssd1', '/ssd2' AUTOMATIC;
CREATE STOGROUP warm_stogroup ON '/sas1', '/sas2' AUTOMATIC;
CREATE STOGROUP cold_stogroup ON '/sata1', '/sata2' AUTOMATIC;
# 创建对应的数据表空间
CREATE TABLESPACE hot_ts USING STOGROUP hot_stogroup;
CREATE TABLESPACE warm_ts USING STOGROUP warm_stogroup;
CREATE TABLESPACE cold_ts USING STOGROUP cold_stogroup;
# 创建表时指定存储位置
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100),
...
) IN hot_ts;
# 将旧数据移动到冷存储
CREATE TABLE customers_hist LIKE customers IN cold_ts;
INSERT INTO customers_hist SELECT * FROM customers WHERE last_activity_date < CURRENT DATE - 1 YEAR;
DELETE FROM customers WHERE last_activity_date < CURRENT DATE - 1 YEAR;2. 存储监控和告警
2.1 自动监控脚本
bash
#!/bin/bash
# DB2 存储监控脚本
DB_NAME="PRODDB"
THRESHOLD=80
EMAIL_RECIPIENTS="dba@company.com"
# 连接数据库并检查表空间使用情况
db2 connect to $DB_NAME
# 获取使用率超过阈值的表空间
HIGH_USAGE_TS=$(db2 "SELECT TBSP_NAME, TBSP_USED_RATIO_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_USED_RATIO_PERCENT > $THRESHOLD
ORDER BY TBSP_USED_RATIO_PERCENT DESC")
# 如果存在高使用率表空间,发送告警邮件
if [ -n "$HIGH_USAGE_TS" ]; then
SUBJECT="DB2 表空间使用率告警 - $DB_NAME"
BODY="以下表空间使用率超过 $THRESHOLD%:\n\n$HIGH_USAGE_TS\n\n请及时处理!"
echo "$BODY" | mail -s "$SUBJECT" $EMAIL_RECIPIENTS
echo "已发送表空间告警邮件"
else
echo "所有表空间使用率正常"
fi
db2 connect reset2.2 与监控系统集成
将DB2存储监控集成到企业监控系统(如Zabbix、Prometheus等),实现实时监控和自动告警:
Zabbix集成:
- 使用Zabbix Agent的自定义脚本监控表空间使用率
- 配置触发器,当使用率超过阈值时发送告警
- 创建存储使用趋势图和报表
Prometheus集成:
- 使用DB2 Exporter收集存储指标
- 配置PromQL查询监控表空间使用率
- 使用Grafana创建存储监控仪表板
- 配置Alertmanager发送告警
3. 存储故障处理
3.1 容器故障恢复
bash
# 1. 识别故障容器
SELECT TBSP_NAME, CONTAINER_NAME, CONTAINER_TYPE, CONTAINER_PATH
FROM SYSIBMADM.CONTAINERS
WHERE TBSP_ID IN (
SELECT TBSP_ID FROM SYSIBMADM.TBSP_UTILIZATION WHERE TBSP_STATE <> 'NORMAL'
);
# 2. 离线修复表空间
db2 connect to $DB_NAME
db2 quiesce tablespaces for table <table_name> exclusive;
db2 offline tablespace <tablespace_name>;
# 3. 替换故障容器
# 假设故障容器是文件容器,位于 /data1/container1
cp /backup/container1 /data1/container1
# 4. 恢复表空间
db2 online tablespace <tablespace_name>;
db2 unquiesce tablespaces for table <table_name>;
# 5. 验证修复结果
SELECT TBSP_NAME, TBSP_STATE FROM SYSIBMADM.TBSP_UTILIZATION;3.2 表空间损坏恢复
bash
# 1. 检查表空间完整性
db2 check tablespace <tablespace_name>;
# 2. 如果表空间损坏,从备份恢复
# 假设我们有一个完整的数据库备份
db2 restore database $DB_NAME from /backup taken at <timestamp> into $DB_NAME;
db2 rollforward database $DB_NAME to end of logs and stop;
# 3. 如果只有特定表空间损坏,可进行表空间级恢复
db2 restore database $DB_NAME tablespace <tablespace_name> from /backup taken at <timestamp>;
db2 rollforward database $DB_NAME to end of logs tablespace <tablespace_name> online;4. 存储扩展最佳实践
4.1 自动存储管理
- 对于新数据库,建议使用自动存储管理,简化存储管理
- 配置适当的自动扩展参数,避免频繁扩展
- 为不同类型的数据创建独立的存储组和表空间
4.2 手动存储管理
- 对于大型数据库,考虑使用手动存储管理,获得更好的性能控制
- 为每个表空间创建多个容器,分布在不同的物理设备上
- 定期监控和调整容器大小,避免空间不足
4.3 存储迁移
当需要迁移存储设备时,可使用以下方法:
bash
# 方法1:使用存储组迁移
# 添加新存储路径
ALTER STOGROUP data_stogroup ADD '/new_data1', '/new_data2';
# 重组表空间,将数据迁移到新路径
REORG TABLESPACE data_ts RECLAIM EXTENTS;
# 移除旧存储路径
ALTER STOGROUP data_stogroup DROP '/old_data1', '/old_data2';
# 方法2:使用表空间重定向恢复
# 备份数据库
db2 backup database $DB_NAME to /backup;
# 恢复数据库,重定向表空间容器
db2 restore database $DB_NAME from /backup taken at <timestamp> into $DB_NAME
REDIRECT GENERATE SCRIPT restore_script.sql;
# 编辑生成的脚本,修改容器路径
vi restore_script.sql;
# 执行恢复脚本
db2 -tvf restore_script.sql;
# 完成恢复
db2 rollforward database $DB_NAME to end of logs and stop;版本差异
| 版本 | 存储架构特性 |
|---|---|
| DB2 9.x | 支持自动存储、表空间重定向恢复 |
| DB2 10.x | 引入存储组、增强自动存储功能 |
| DB2 11.1 | 支持表空间级在线备份恢复、增强LOB存储 |
| DB2 11.5 | 支持BLU Acceleration列式存储、增强存储压缩 |
| Db2 12.x | 增强云存储支持、优化存储管理 |
常见问题(FAQ)
Q1: 如何选择合适的表空间页面大小?
A1: 表空间页面大小应根据表中最大行的大小选择:
- 4KB:适用于大多数OLTP系统
- 8KB:适用于包含较大行的表
- 16KB:适用于包含大对象的表
- 32KB:适用于包含非常大对象的表
页面大小一旦确定就无法更改,因此需要在创建表空间时仔细选择。
Q2: 自动存储和非自动存储有什么区别?
A2: 自动存储由系统自动管理容器的大小和数量,简化了存储管理;非自动存储需要管理员手动管理容器。对于大多数环境,建议使用自动存储,特别是对于新数据库。
Q3: 如何监控表空间增长趋势?
A3: 可以使用SYSIBMADM.TBSP_UTILIZATION_HISTORY视图查询历史使用情况,或使用第三方监控工具(如IBM Data Studio、Zabbix等)监控增长趋势。
Q4: 表空间满了怎么办?
A4: 表空间满了可以采取以下措施:
- 对于自动存储表空间,确保AUTORESIZE已启用
- 手动添加新容器或扩展现有容器
- 清理不必要的数据
- 将旧数据归档到其他存储设备
Q5: 如何优化表空间性能?
A5: 优化表空间性能的方法包括:
- 使用多个容器分布I/O负载
- 为不同类型的数据使用独立的表空间
- 选择合适的页面大小
- 配置适当的缓冲池
- 定期重组表空间,减少碎片
Q6: 如何实现表空间级别的备份和恢复?
A6: 可以使用以下命令进行表空间级别的备份和恢复:
bash
# 表空间备份
db2 backup database <dbname> tablespace <tablespace_name> to <backup_path>;
# 表空间恢复
db2 restore database <dbname> tablespace <tablespace_name> from <backup_path>;
db2 rollforward database <dbname> to end of logs tablespace <tablespace_name> online;Q7: 存储组和表空间的关系是什么?
A7: 存储组是表空间的逻辑容器,用于管理一组容器。一个存储组可以被多个表空间使用,一个表空间只能属于一个存储组。存储组简化了存储管理,允许管理员通过修改存储组来管理多个表空间的存储。
Q8: 如何迁移表空间中的数据?
A8: 迁移表空间中的数据可以使用以下方法:
- 使用REORG TABLESPACE命令重组表空间,将数据迁移到新的容器
- 使用表空间重定向恢复
- 创建新表空间,将数据复制到新表空间,然后删除旧表空间
总结
DB2的存储架构是数据库管理的核心组成部分,理解和优化存储架构对于提高数据库性能、可用性和可管理性至关重要。本文详细介绍了DB2存储架构的核心组件(存储组、表空间、容器)、配置方法、管理操作和最佳实践,以及在企业级环境中的应用案例。
在实际生产环境中,建议根据业务需求和数据特点设计合适的存储架构,使用存储组简化存储管理,配置适当的监控和告警机制,定期优化和维护存储系统,确保数据库的稳定运行和良好性能。
