最近遇到一个问题
有一张日志表被写入了非常多数据, 直接导致磁盘满了
truncate清除了表数据,结果磁盘空间没变化
查询网上给出的回复:
在达梦数据库中,使用 TRUNCATE 命令删除表后,空间并不会立即释放到文件系统层面,而是被标记为可重用,供后续插入操作使用。这是因为 TRUNCATE 操作是一种快速清空表数据的方法,它不会逐行删除数据,而是直接删除整个表的数据,因此数据库并不会像使用 DELETE 命令一样逐行删除数据并释放空间。
达梦数据库提供了自动清理、回收回滚段空间的机制。这个机制会保留回滚段一段时间,然后自动清理回滚段空间。这个保留回滚段的时间长度由 UNDO_RETENTION 参数指定,默认数值是900秒,即15分钟。超过这个时间后,空间才会被释放。
-- 查询参数值
SELECT * FROM v$dm_ini WHERE para_name LIKE 'UNDO_RETENTION';
-- 修改参数
ALTER TABLESPACE tablespace_name RESIZE DATAFILE 'datafile_path' TO new_size;
返回字段:
- PARAMETER_NAME:参数名称,对应于
UNDO_RETENTION。 - PARAMETER_VALUE:参数的当前值,即
UNDO_RETENTION参数的值,表示事务提交后回滚页保持的时间,单位为秒。 - DEFAULT_VALUE:参数的默认值。
- IS_MODIFIED:表示参数值是否被修改过。
- IS_ADJUSTED:表示参数值是否被调整过。
- IS_INTERNAL:表示参数是否为内部参数。
- DATA_TYPE:参数的数据类型。
- MIN_VALUE:参数的最小值。
- MAX_VALUE:参数的最大值。
实际上表空间是释放掉了, 磁盘并没有释放掉
在达梦数据库中,TRUNCATE 操作后表空间缩小了,但磁盘空间占用没有变化,这是因为达梦数据库的表空间数据文件在删除表后,虽然内部空间被释放,但文件系统层面的文件大小并不会立即减小。这是因为达梦数据库用户表空间的数据文件是不能回缩的,即使删除掉表空间中的表,对应的数据文件在磁盘中的大小不会变小,但是数据文件中的可用空间会变大。
-- 查询空闲表空间
SELECT a.tablespace_name "表空间名称",
total / (1024 * 1024) "表空间大小(M)",
free / (1024 * 1024) "表空间剩余大小(M)",
(total - free) / (1024 * 1024 ) "表空间使用大小(M)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
-- 手动释放表空间, 千万注意这步不要随便执行, 一定先备份库, 缩减表空间有可能导致数据丢失的!
ALTER TABLESPACE tablespace_name RESIZE DATAFILE 'datafile_path' to new_size;