我有以下疑问,也许有点傻,如果我有一个155GB的表空间,这个表空间是由5个数据文件组成,每个数据文件每个31 GB,而这些数据文件的使用率在3%到4%之间.我的问题是:我可以删除其中一些数据文件来缩小表空间的大小吗?这些数据文件所包含的信息将自动重新定位到其余的数据文件中?先谢谢你。
发布于 2019-11-15 10:23:23
您可以使用DROP DATAFILE从ALTER TABLESPACE删除数据文件,该数据文件是空的(没有从其中分配的区段)。
示例:
ALTER TABLESPACE <tablespace_name> DROP DATAFILE '/path/datafile_name';但是,如果数据文件不是空的,则需要运行类似于表空间映射的操作,以查看从中分配了哪些对象区段。您可以使用此脚本,但还有其他可搜索的脚本,它们提供了相当好的输出。
SELECT
'free space' owner, null OBJECT, null segment_type, file_id, block_id, blocks
FROM dba_free_space
WHERE tablespace_name = UPPER ('&Tblspc')
UNION
SELECT
owner, segment_name, segment_type, file_id, block_id, blocks
FROM dba_extents
WHERE tablespace_name = UPPER ('&Tblspc')
ORDER BY 4, 5;一旦在要删除的数据文件中找到对象,就可以将它们重新组织到相同的表空间(这可能会将它们放入其他数据文件中的空闲空间)或其他表空间。
下面是一些用于移动表和索引的示例命令。
ALTER TABLE <table_name> MOVE TABLESPACE <tablespace_name>;
ALTER INDEX <index_name> REBUILD TABLESPACE <tablespace_name>;使用这些示例时,不要忘记根据需要添加存储和统计子句。
您也可以尝试调整数据文件的大小,但这只会达到分配的范围。这意味着,如果有一个范围一半的数据文件,您将只能调整它的50%。您也可以使用表空间映射来检查这些数据,或者通过尝试和错误进行检查。
ALTER DATABASE DATAFILE '/path/datafile_name' RESIZE <new_size>;https://dba.stackexchange.com/questions/253214
复制相似问题