-
问题描述
应用人员在进行业务跑批时出现报错,报错提示:“回滚表空间不足”
-
问题排查
根据报错,首先排查了ROLL表空间的大小,发现回滚表空间是自动扩展的,而咨询过应用人员,跑批业务是每2000条进行批量提交,正常情况下不会将回滚表空间占满,于是 df -h 查看磁盘空间,发现磁盘空间已经用满,只剩几MB,进一步查看数据文件目录下的文件大小,发现TEMP.DBF使用300多G,对于达梦的临时表空间,SQL在执行完后系统会自动释放占用的临时段,但临时文件所占用的磁盘空间并不会减少,由于临时表空间没有设置最大上限,因此临时文件会越来越大,将磁盘空间占满,导致回滚表空间无法继续扩展。
-
解决
达梦提供了函数SP_TRUNC_TS_FILE可以回收TEMP表空间功能说明:
将临时表空间文件截断到指定的大小,仅能截断文件空闲未使用的部分,如果在指定 to_size 后存在已使用数据页,则实际截断大小会大于 to_size参数说明:
ts_id:指定截断文件的临时表空间 ID
file_id:指定截断文件的文件 ID
to_size:指定将文件截断至多大,以 M 为单位;to_size 大小换算成页数后,值必须在 4096 到 2G 之间
查看临时表空间和文件ID
SQL> select id,name from v$tablespace;
LINEID ID NAME
---------- ----------- ------
1 0 SYSTEM
2 1 ROLL
3 3 TEMP
4 4 MAIN
used time: 0.601(ms). Execute id is 9006.
SQL> select file_id,tablespace_name from dba_data_files;
LINEID FILE_ID TABLESPACE_NAME
---------- ----------- ---------------
1 0 SYSTEM
2 0 MAIN
3 0 TEMP
4 0 ROLL
used time: 7.420(ms). Execute id is 9005.
可以确定临时表空间的 ts_id=3,file_id=0
将临时表空间文件号为 0 的文件截断到 1024M 大小
SQL> CALL SP_TRUNC_TS_FILE (3, 0, 1024);
修改参数 TEMP_SPACE_LIMIT 设置临时表空间最大上限100G
SQL> call sp_set_para_value(1,'TEMP_SPACE_LIMIT',102400);
通知应用人员再次进行跑批,结果运行正常。