DB2删数据空间不释放问题处理办法
1、问题描述:
客户微信描述数据库删除表不释放空间
2、问题分析:
DB2数据库删除数据或drop表并不会释放磁盘空间,涉及到高水位问题
DB2 v11.1.3.3
1.查看是否为自动存储
db2pd -d dbname -tablespaces
2.筛选出表空间的高水位大于已使用表空间的表和大小
db2 -x "select tbsp_name,sum((TBSP_PAGE_TOP-TBSP_USED_PAGES)*(TBSP_PAGE_SIZE/1024)/1024/1024) as HW_GB from sysibmadm.TBSP_UTILIZATION as t where t.tbsp_page_top >t.tbsp_used_pages group by t.tbsp_name order by HW_GB desc "
3.对表空间进行降低高水位操作
db2 "alter tablespace xxx reduce MAX"
提示: 要最大化 ALTER TABLESPACE 语句回收的空间量,请首先对表空间中的表和索引执行 REORG 操作。
使用系统临时表空间 TEMPSPACE1 作为工作区来重组表,请输入
db2 reorg table tabschema.tabname use tempspace1
4.监视表空间USERSPACE1移动情况:
db2 "SELECT varchar(TBSP_NAME, 20) AS TBSP_NAME, NUM_EXTENTS_MOVED, NUM_EXTENTS_LEFT, TOTAL_MOVE_TIME from TABLE(MON_GET_EXTENT_MOVEMENT_STATUS('USERSPACE1',-2)) AS t"
5.查看表空间状态信息,确认是否已降低高水位。
db2 list tablespace show detail
此外针对自动存储和非自动存储表空间提供如下脚本方便使用
****查看是否为自动存储
db2pd -d dbname -tablespaces
db2 "alter tablespace xxx lower high water mark" &(非自动存储)
nohup db2 "alter tablespace xxx reduce (all $resu M)" &
nohup db2 "alter tablespace xxx reduce MAX" & (自动存储)
****自动存储算出可降高水位大小脚本
db2 connect to smaple
>red_hwm.sql
>hwm.txt
db2 -x "select tbsp_name,sum((TBSP_PAGE_TOP-TBSP_USED_PAGES)*(TBSP_PAGE_SIZE/1024)/1024/1024) as HW_GB from sysibmadm.TBSP_UTILIZATION as t where t.tbsp_page_top >t.tbsp_used_pages group by t.tbsp_name order by HW_GB desc " >hwm.txt
while read i_system
do
{
tbs=`echo $i_system|awk '{print $1}'`
size=`echo $i_system|awk '{print $2}'`
echo "alter tablespace $tbs reduce MAX;" >>red_hwm.sql
}
done <hwm.txt
db2 -tvf red_hwm.sql >red_hwm.out
db2 terminate
****非自动存储算出可降高水位大小脚本(需要除容器个数)
>hwm.txt
>lower.sql
>reduce.sql
db2 connect to sample
db2 -x "select varchar(tbsp_name,60) as tbsp_name, (TBSP_PAGE_TOP-TBSP_USED_PAGES)*(TBSP_PAGE_SIZE/1024/1024) from table(mon_get_tablespace('',-1)) as t where t.tbsp_page_top>t.tbsp_used_pages" >hwm.txt
while read i_system
do
{
tbs=`echo $i_system|awk '{print $1}'`
size=`echo $i_system|awk '{print $2}'`
resu=`echo "${size}/3"|bc`
echo "alter tablespaces $tbs lower high water mark;">>lower.sql
echot "alter tablespaces $tbs reduce(all $resu M);">>reduce.sql
}
done <hwm.txt
@查询表空间使用情况:
db2 "select char(TBSP_NAME,20) as TBSP_NAME, TBSP_USABLE_PAGES, TBSP_USED_PAGES, rtrim(100*TBSP_USED_PAGES/TBSP_USABLE_PAGES)||'%' as USED_RATE from sysibmadm.SNAPTBSP_PART where TBSP_USABLE_PAGES>0 order by TBSP_NAME,DBPARTITIONNUM"
@查询筛选出所有高水位标记大于已使用页的表空间:
db2 "SELECT char(TBSP_NAME,20) as TBSP_NAME, RECLAIMABLE_SPACE_ENABLED,TBSP_USED_PAGES, TBSP_FREE_PAGES, TBSP_PAGE_TOP from TABLE (MON_GET_TABLESPACE('',-2)) AS t where t.TBSP_PAGE_TOP > t.TBSP_USED_PAGES"
RECLAIMABLE_SPACE_ENABLED 是表空间的 可回收存储器 属性;如果值是1,表示空间可回收。
@监视表空间USERSPACE1移动情况:
db2 "SELECT varchar(TBSP_NAME, 20) AS TBSP_NAME, NUM_EXTENTS_MOVED, NUM_EXTENTS_LEFT, TOTAL_MOVE_TIME from TABLE(MON_GET_EXTENT_MOVEMENT_STATUS('USERSPACE1',-2)) AS t"
表空间USERSPACE1 降低高水位标记,释放空闲空间;当前显示已经移动了 1113 个数据块,还剩下2931028个数据块,共花费 64634ms 的时间。如果在非移动状态下,所有值为 -1。
更多知识查询官方说明:
https://www.ibm.com/docs/zh/db2/11.1?topic=management-reclaimable-storage
使用系统临时表空间 TEMPSPACE1 作为工作区来重组表,请输入
db2 reorg table tabschema.tabname use tempspace1




