db2 reorg table failed处理

本文介绍DB2数据库中表重组(reorg)的基本概念、常见错误处理及在线与离线重组的区别。针对reorg操作失败的情况,提供了具体的诊断步骤和解决方法,包括表空间扩展、指定表空间等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要:

当对一个表的结构进行改变后,需要reorg表,重新组织其目录统计信息,为数据库的访问计划提供信息,以便高效执行对其的操作。

对表作reorg操作,发生错误,通过db2 "? sql0xxx"查的错误原因为物理空间已满,然后在$DB2_INSTALL_DIR/sqllib/db2dump/查看db2diag.log可以发现是表空间大小不够。

因为reorg table如果没有指定用哪个表空间来做reorg操作的话,会默认使用该表所在的表空间,而reorg table and index xxx即表和其上的索引一起reorg的话,会默认使用系统临时表空间。

 

由于reorg table 失败导致的告警排查处理

$ db2 reorg table RMADMIN.RMMIGRATIONTASKS index SYSIBM.SQL120321193909130   use tempspace3

加参数use tablespaceName 指定表空间。不指定表空间,默认为reorg表所在表空间。

查询db2diag报错提示如下

MESSAGE : ZRC=0x85020021=-2063466463=SQLB_END_OF_CONTAINER 
"DMS Container space full"


ADM6044E The DMS tablespace "BASEDBS" (ID "3") is full

 符合报错信息为BASEDBS表空间所有表

Cause
If the SQL0289N is also reported at around the time of the DMS full error, then this suggests that the rebalance may be preventing an autoresize. In the SQL0289N error message reference, reasons 3 and 11 are relevant in this scenario:

**********

SQL0289N
Unable to allocate new pages in table space tablespace-name.
Explanation

3
A rebalance is in progress, but has not progressed far enough to enable the newly added space to be used. 

 

Diagnosing the problem

Look for a SQL0289N error in the db2diag.log file.

Collect a tablespace snapshot for that DMS tablespace, and check whether the "Last resize attempt failed = Yes"

db2pd -db UIDBSDNX -tablespaces

 

监视表重组:

select
       substr(tabname, 1, 15) as tab_name,
       substr(tabschema, 1, 15) as tab_schema,
       reorg_phase,reorg_max_phase,
       substr(reorg_type, 1, 20) as reorg_type,
       reorg_status,
       reorg_completion,
       dbpartitionnum
from sysibmadm.snaptab_reorg order by dbpartitionnum
或者通过db2 get snapshot for tables on DBName进行reorg监控:

db2 GET SNAPSHOT FOR TABLES on DBName

通过db2pd reorg选项获得当前正在执行和近期完成的重组信息:

db2pd -db DBName -reorg index

通过list history reorg all for DBName获得表或索引重组信息:

db2 list history reorg all for DBName

此外db2 list utilities show detail 可以监控 LOAD ,BACKUP ,RESTORE, RUNSTATS

总结

数据库在进行reorg时失败由于系统无法分配新的页,表空间方面可能存在问题,需要扩充表空间或reorg表时重新指定表空间。

创建临时表空间操作

注意 pagesize要和表的pagesize匹配,可以用原来db2 中创建表空间的语句来参照着创建自己新的表空间。

$db2look -d $dbname -l -e -x -o $db.layout

在线重组表:
在线reorg占用资源很少,对系统影响也很小。在线reorg也叫inplace reorg,不会创建数据副本,而是在原表空间进行,表数据的重组是分批次的,每批次只处理一部份数据,因此会比离线reorg慢很多。
在线reorg可以随时启动和终止,在线reorg会记录大量日志,保证其可恢复性。在线reorg是在后台异步执行的。
db2 reorg table db2inst2.staff inplace allow write access        可以通过db2 list applications show detail |grep db2reorg 查看是否有reorg正在执行

Reorg索引:
当离线reorg结束后,会重建表上的所有索引。在线reorg仅仅维护索引,而不会重建索引(聚集索引除外)。当在线索引reorg完成后,如需要进行索引单独重组,可以使用:db2 reorg indexes all for table tabname

 1.离线重组与在线重组对比:

 

 2.重组过程中出现以外(断电),对正在重组的表或索引有何影响?
离线重组:如果断电时reorg正在进行scan或build,崩溃恢复时改表将恢复到初始状态;如果reorg正在进行replace(copy),崩溃恢复将重新执行改阶段;如果reorg正在index create,崩溃恢复阶段将把索引失效,并延迟索引重建。
在线重组:如果断电时reorg正在进行,那么在执行reorg的那个事务会回滚(在线reorg采用增量的方式进行数据处理,已经完成的迁移不会收到影响)。但reorg的状态是终止(paused),可以重新恢复。

转载于:https://www.cnblogs.com/dahaoran/p/9254744.html

<think>我们正在讨论DB2REORG操作期间的表锁定行为。根据引用[1]和引用[2]提供的信息,我们可以总结如下: 1. **REORG操作的一般锁定行为**: - 在重组过程中,REORG实用程序会发出频繁的内部COMMIT语句,因此通常不会产生大量活动日志(引用[1])。 - 但是,在截断阶段(truncate phase),REORG实用程序会请求一个S(共享)表锁(引用[1])。如果无法获取该锁,它将等待,而其他事务在此期间可能会迅速填满日志。 2. **REORG的不同阶段**: - 引用[2]提到REORG TABLE命令的四个阶段,但未详细说明。通常,REORG TABLE操作包括以下阶段: - 构建阶段:创建一个临时表,将数据按指定顺序(如索引顺序)重新插入。 - 替换阶段:将原表替换为重组后的表。 - 截断阶段:释放多余的空间(此阶段需要S表锁)。 - 索引重建阶段:重建索引(如果指定了索引)。 3. **锁定的影响**: - 在截断阶段需要S表锁,这意味着其他事务可以读取表,但不能修改表(因为S锁与X锁不兼容)。如果此时有其他事务持有该表的X锁(如写操作),则REORG会等待,直到获取S锁。 - 引用[1]特别指出,如果REORG在截断阶段无法获取S表锁,它将等待,而其他事务在此期间可能会继续产生日志,可能导致日志满。 4. **分区表的REORG**: - 引用[4]提到,对于分区表,可以同时对不同分区执行REORG操作(使用ON DATA PARTITION子句),但每个REORG命令必须指定不同的分区,并且必须使用ALLOW NO ACCESS方式(即重组期间不允许访问该分区)。同时,分区表必须只有分区索引(非分区索引,除了系统生成的XML路径索引,是不允许的)。 5. **锁监控**: - 引用[3]提到db2top工具的锁链分析功能,可以帮助监控锁等待关系,特别是在涉及多个应用程序的复杂锁场景中。 **总结REORG操作期间的表锁定行为**: - 在大多数阶段,REORG操作不会长时间锁定整个表,因为内部频繁提交。 - 关键阶段是截断阶段,此时REORG需要获取表的S锁(共享锁)。如果获取不到,则会等待,这可能导致阻塞其他需要写锁(X锁)的事务,也可能被其他事务阻塞(如果其他事务持有X锁)。 - 在分区表上,可以对不同分区并发执行REORG,每个分区在重组期间(使用ALLOW NO ACCESS)会锁定该分区,但其他分区仍可访问。 **建议**: - 在执行REORG时,应选择业务低峰期,以减少锁等待的可能性。 - 对于分区表,利用分区级REORG来减少对整个表的影响。 - 使用锁监控工具(如db2top)来观察REORG期间的锁等待情况。 **相关问题**: 1. 如何监控DB2 REORG操作期间的锁等待? 2. REORG操作在截断阶段等待锁超时会怎样? 3. 分区表上并发执行多个REORG操作有什么限制?</think>### DB2 REORG操作期间的表锁定行为详解 DB2REORG操作在执行过程中会涉及多种锁定行为,根据重组阶段和对象类型的不同,锁定策略存在显著差异。以下是关键锁定行为的分析: #### 一、常规表REORG锁定行为 1. **截断阶段的排他锁定** REORG操作在**截断阶段(truncate phase)** 会请求 **S表锁(共享锁)**: - 此阶段需要锁定整个表结构 - 若无法获取S锁,操作将进入等待状态 - 此时其他事务可能持续产生日志,导致日志空间快速耗尽[^1] 2. **重组阶段的增量锁定** ```sql REORG TABLE employee INPLACE ALLOW WRITE ACCESS ``` - 采用`ALLOW WRITE ACCESS`模式时: - 仅锁定当前处理的数据页 - 其他事务可并发读写未处理区域 - 默认`ALLOW NO ACCESS`模式: - 获取表级排他锁(X锁) - 阻塞所有读写操作直到重组完成[^2] 3. **索引重组的并发控制** ```sql REORG INDEXES ALL FOR TABLE employee ``` - 重建非分区索引:获取表级意向排他锁(IX) - 分区索引重建:仅锁定目标分区 - 系统生成的XML路径索引不受影响[^4] #### 二、分区表的特殊锁定机制 1. **分区级并发重组** ```sql REORG TABLE sales ON DATA PARTITION p1 ALLOW NO ACCESS; REORG TABLE sales ON DATA PARTITION p2 ALLOW NO ACCESS; ``` - 可同时对不同分区执行REORG - 每个操作仅锁定目标分区 - 需满足三个条件: (1) 每个REORG指定不同分区 (2) 必须使用`ALLOW NO ACCESS` (3) 表不能有非分区索引(系统XML索引除外)[^4] 2. **分区索引重组** ```sql REORG INDEXES ALL FOR TABLE sales ON DATA PARTITION p3 ``` - 仅目标分区不可写 - 其他分区保持可读状态 - 索引重建期间允许跨分区查询[^4] #### 三、锁冲突处理与监控 1. **锁等待机制** - 截断阶段S锁请求失败时: - REORG进入等待队列 - 等待超时后返回SQLCODE 68 (LOCK TIMEOUT) - 可通过调整`LOCKTIMEOUT`参数控制等待时间 2. **锁链分析工具** 使用`db2top`监控工具: ```bash db2top -d sample -m lock ``` - 动态绘制锁等待关系图[^3] - 识别阻塞REORG操作的事务链 - 支持实时查看锁超时预警 #### 四、最佳实践建议 1. **规避日志溢出风险** - 在业务低谷期执行REORG - 监控`LOGFULL`警告阈值 ```sql SELECT log_utilization_percent FROM TABLE(MON_GET_DATABASE(-2)) ``` 2. **最小化锁影响** - 分区表优先使用分区级REORG - 大型表采用`INPLACE`增量重组 - 配合`ALLOW WRITE ACCESS`减少业务中断 3. **锁优化配置** ```sql ALTER TABLE employee LOCKSIZE ROW; -- 行级锁替代表锁 SET CURRENT LOCK TIMEOUT 30; -- 设置合理等待时间 ``` > **关键结论**:REORG的锁定强度取决于重组对象(表/索引/分区)和访问模式参数。分区表重组可显著降低锁粒度,而截断阶段的S表锁是潜在阻塞点,需特别关注[^1][^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值