Skip to content

DB2 存储架构

存储架构概述

DB2数据库的存储架构是数据库物理存储管理的核心,它定义了数据如何在磁盘上组织和存储。理解DB2的存储架构对于数据库管理员来说至关重要,因为它直接影响数据库的性能、可用性和可管理性。

DB2的存储架构采用分层设计,从最高层的数据库到底层的物理存储设备,主要包括以下几个层次:

  1. 数据库(Database)
  2. 存储组(Storage Group)
  3. 表空间(Tablespace)
  4. 容器(Container)
  5. 物理存储设备(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.STOGROUP

2. 表空间

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.TABLESPACES

3. 容器

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 reset

2.2 与监控系统集成

将DB2存储监控集成到企业监控系统(如Zabbix、Prometheus等),实现实时监控和自动告警:

  1. Zabbix集成

    • 使用Zabbix Agent的自定义脚本监控表空间使用率
    • 配置触发器,当使用率超过阈值时发送告警
    • 创建存储使用趋势图和报表
  2. 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存储架构的核心组件(存储组、表空间、容器)、配置方法、管理操作和最佳实践,以及在企业级环境中的应用案例。

在实际生产环境中,建议根据业务需求和数据特点设计合适的存储架构,使用存储组简化存储管理,配置适当的监控和告警机制,定期优化和维护存储系统,确保数据库的稳定运行和良好性能。