Skip to content

DB2 - 存储组

本章介绍了自动存储(Automatic Storage)和存储组(Storage Groups),这是管理 Db2 数据库磁盘空间的现代方法。

过去,数据库管理员必须手动管理每个表空间(tablespace)的独立文件(容器)。自动存储极大地简化了这一过程。当数据库启用自动存储时,您只需为其提供一个或多个存储路径,Db2 便会负责在这些路径内创建、扩展和管理表空间容器。

存储组是这些存储路径的命名集合。这允许您将不同类型的数据分组到不同层级的物理存储上。例如,您可以为关键表和索引在 SSD 上创建一个 FAST_STORAGE 组,并为不经常访问的数据在传统 HDD 上创建一个 BULK_STORAGE 组。

当您创建数据库时,会自动创建一个名为 IBMSTOGROUP 的默认存储组,指向数据库路径。

您可以通过查询系统目录来查看现有的存储组及其关联路径。

SELECT SGNAME, SGPATH FROM SYSCAT.STOGROUPPATHS;

让我们来看看一个常见场景:将一套新的、更快的磁盘添加到您的服务器,并为它们创建一个新的存储组。

使用 CREATE STOGROUP 命令定义一个新的存储组。您必须提供一个或多个绝对路径。

-- 假设您在 /ssd/data 处有一个已挂载的文件系统
CREATE STOGROUP fast_storage ON '/ssd/data';

随着存储需求的增长,您可以轻松地向现有存储组添加新路径。这是一个非中断性的在线操作。

-- 向 fast_storage 组添加新路径
ALTER STOGROUP fast_storage ADD '/ssd/data2', '/ssd/data3';
-- 您也可以删除路径,但前提是它们未被任何表空间使用
-- 首先,您需要将数据从该路径上重新平衡(见下文)
ALTER STOGROUP fast_storage DROP '/ssd/data';

定义存储组后,您可以指示新的或现有的表空间使用它。

创建新表空间时,使用 USING STOGROUP 子句指定目标存储组。

-- 在快速存储上为重要应用程序数据创建新表空间
CREATE TABLESPACE app_data USING STOGROUP fast_storage;

将现有表空间移动到不同的存储组

Section titled “将现有表空间移动到不同的存储组”

您可以将整个表空间从一个存储组在线移动到另一个存储组。Db2 将在后台处理数据的移动。

-- 将 USERSPACE1 表空间从默认组移动到我们的新快速组
ALTER TABLESPACE USERSPACE1 USING STOGROUP fast_storage;

将新路径添加到存储组或移动表空间后,Db2 不会立即移动现有数据。它只会将新路径用于新的数据分配。为了将现有数据重新分发到所有可用路径以获得更好的 I/O 性能,您必须启动 REBALANCE 操作。

重新平衡是一个在线操作,但它可能会占用大量 I/O 资源。最好在非高峰时段运行它。

-- 移动 USERSPACE1 后,对其进行重新平衡以将其数据分散到 fast_storage 中的所有路径
ALTER TABLESPACE USERSPACE1 REBALANCE;

您可以使用 MON_GET_REBALANCE_STATUS 表函数监控重新平衡的进度。

仅当存储组未被任何表空间使用时,您才能删除它。您必须首先更改任何关联的表空间以使用不同的存储组。

-- 首先,将表空间移动到另一个组
-- ALTER TABLESPACE app_data USING STOGROUP IBMSTOGROUP;
-- 现在,可以删除存储组了
DROP STOGROUP fast_storage;

最佳实践:使用多个存储组是实现分层存储策略的强大方式,可有效提升性能并管理成本。请根据数据的访问模式和重要性规划您的存储布局。