当对一个表的结构进行改变后,需要reorg表,重新组织其目录统计信息,为数据库的访问计划提供信息,以便高效执行对其的操作。
在一次维护数据库中,因添加了表的一列后,对其作reorg操作,发生错误,通过db2 "? sql0xxx"查的错误原因为物理空间已满,然后在$DB2_INSTALL_DIR/sqllib/db2dump/查看db2diag.log可以发现是表空间大小不够。因为reorg table如果没有指定用哪个表空间来做reorg操作的话,会默认使用该表所在的表空间,而reorg table and index xxx即表和其上的索引一起reorg的话,会默认使用系统临时表空间。
我的这个表数据量特别大,所以我在一个空间很大的盘创建了新的临时表空间MYTEMPSPACE1,然后用这个表空间来做reorg操作reorg table $tablename index $indexname use MYTEMPSPACE1
这里创建这个表空间有将就,他的pagesize要和表的pagesize匹配,然后维护人员可以用原来db2 中创建表空间的语句来参照着创建自己新的表空间。用db2look -d $dbname -l -e -x -o $db.layout
这样查看db.layout就可以把原来创建表空间的一些参数复制来使用。
最后执行的时候因为我的表实在太大,还是出现问题,在我的临时表空间减小了40G左右的时候,就不用这个空间了(我的空间还有50多G的,不知道是不是创建表空间的时候制约了这点,还没有去查),又使用了默认的系统临时表空间(30G)把这个表空间用完后,又报错误空间不够。
当时快崩溃了,就尝试着只执行reorg table $tablename use MYTEMPSPACE1,执行快一个小时后,执行成功!!!