一、DB2表空间介绍
每个DB2数据库都必须要有最小的一组表空间,这些表空间用于存储系统数据、用户数据和临时数据。一个数据库至少必须包含三个表空间:目录表空间、一个或多个用户表空间、一个或多个临时表空间。
TBSPACE | 作用 |
SYSCATSPACE | 系统目录表空间,数据字典,系统信息不可更改和不可删除 |
TEMPSPACE1 | 临时表空间,排序时需要额外空间的操作 |
USERSPACE1 | 创建表时没指定表空间,默认的用户表空间 |
SYSTOOLSPACE | 在首次使用先前所列任意工具和 SQL 管理例程时创建的 |
表空间存储类型:
- 系统管理的空间(system managed space,SMS):由操作系统的文件系统管理器和管理空间。在DB2 V9之前,如果不带任何参数创建数据库或表空间,就会导致所有表空间作为SMS对象创建。
- 数据库管理的表空间(database managed space,DMS):由DB2数据库管理程序控制存储空间。表空间容器可使用文件系统或裸设备。需要更多的维护
- DMS的自动存储(automatic storage with DMS):自动存储实际上不是一种单独的表空间类型,而是一种处理DMS存储的不同方式。
存储类型 | 表空间类型 | 注释 |
DMS | All permanent data. Regular table space. | 系统表空间 |
SMS | System Temporary data | 系统临时空间 |
DMS | All permanent data. Large table space | 用户表空间 |
DMS | User Temporary data | 用户临时空间 |
SMS | All permanent data. Regular table space. | 用户表空间 |
表空间存储空间上限:
表空间存储上限64GB到64TB。
表空间类型 | 4KB | 8KB | 16KB | 32KB |
SMS表空间 | 64GB | 128GB | 256GB | 512GB |
临时SMS和临时自动存储器 | 8TB | 16TB | 32TB | 64TB |
DMS和非临时自动存储器表空间(常规) | 64GB | 128GB | 256GB | 512GB |
DMS、临时DMS和非临时自动存储器表空间(大型) | 8TB | 16TB | 32TB | 64TB |
借助自动存储器表空间,可以自动管理存储器。数据库管理器将根据需要自动创建和扩展容器,直到达到与数据库相关联的存储器路径所确定的限制为止。
二、环境描述
有台老业务系统由于业务应用设计问题导致,没有按照规划表空间设计使用而一直使用USERSPACE1表空间导致最近频繁满,监控频繁告警。
无法从业务端修改,本着最小化处理原则,评估一月增量,修改表空间扩展大小来解决问题。本文通过测试环境模拟演示变更流程。
三、扩容步骤
1、测试环境确认是否DMS自动存储管理管理
[db2inst1@dbnode1 ~]$ db2pd -d testdb -tablespaces|more
2、查看当前表空间使用情况
USERSPACE1 空间32MB
3、通过调整空间增加大小整数百分比或增加大小整数K | M | G
[db2inst1@dbnode1 ~]$ db2 "alter TABLESPACE USERSPACE1 INCREASESIZE 50M "
也可以设置百分比
[db2inst1@dbnode1 ~]$ db2 "alter TABLESPACE USERSPACE1 INCREASESIZE 5 PERCENT”
4、模拟业务导入模拟数据
5、查看是否符合预期
确认表空间扩充了50M
四、总结
事后可以通过迁移数据重建表空间等解决,不过处理会很被动,还是建议上线业务之前,确认好是否规划好数据库用户、表空间等信息。
五、其他
alter tablespace 参数说明
>>-ALTER TABLESPACE--tablespace-name---------------------------->
+-INCREASESIZE--integer--+-PERCENT-+--------------------------------------------------------------------+ | '-+-K-+---' | | +-M-+ | | '-G-' |
测试数据
创建测试表
CREATE TABLE mydb2user.test_table (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100),
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) IN USERSPACE1;
简单测试数据库100M
BEGIN
DECLARE v_count INT DEFAULT 0;
WHILE v_count < 100000000 DO
INSERT INTO mydb2user.test_table (name, age)
VALUES ('Test Name ' || v_count, MOD(v_count, 100));
SET v_count = v_count + 1;
END WHILE;
END;
其他报错
AS自动存储管理无法直接手动扩展表空间
[db2inst1@dbnode1 ~]$ db2 "alter tablespace USERSPACE1 extend (all 100M)"
活动日志满问题
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0964C The transaction log for the database is full. SQLSTATE=57011
提示活动日志满,由于测试环境初始配置低,重新调整LOG参数,注意主日志调整需要重启数据库生效。
[db2inst1@dbnode1 ~]$ db2 update db cfg for testdb using LOGPRIMARY 25
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.
SQL1363W One or more of the parameters submitted for immediate modification
were not changed dynamically. For these configuration parameters, the database
must be shutdown and reactivated before the configuration parameter changes
become effective.
[db2inst1@dbnode1 ~]$ db2 update db cfg for testdb using LOGSECOND 50
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.




