我有一个大小为 90GB 的 Oracle 12c 表空间。近 40GB 是免费的。
TB1 54 % 90880 41383 49497 46 98304 50 % ONLINE PERMANENT
表空间有 3 个数据文件。
E:\ORACLE\ORADATA\xx\TB1.DBF 33554416 True 100
F:\ORACLE\ORADATA\xx\TB1_2.DBF 33554416 True 100
G:\ORACLE\ORADATA\xx\TB1_3.DBF 25344000 True 100
如何缩小表空间以回收可用的 40GB(磁盘上的数据文件)?我不能有一个停机时间。
我同意 EdStevens 的评论,但这里有一些其他的想法:
AskTom 网站有一个脚本,该 脚本将准确列出您可以缩小现有数据文件的程度。
如果这不能节省太多,您可以在该表空间上找到最大的索引并重建它们;这是一个临时解决方案,索引最终会再次变大,但如果预算现在不允许更多磁盘空间,请尝试以下查询:
那么如果你发现一个名为
ind_big_stuff
巨大的索引,那么此外,如果您的应用程序是商业应用程序,则可能有多个零行表。或者如果你有分区表,你可能有一些零行的分区。您可以删除分配给他们的空间
您可以将
segment creation deferred
alter table 语句中的子句用于分区表或您知道不会有任何行的表。我认为有五种方法可以处理这个预言机维护问题:
我搜索了这个问题的答案,终于找到了:
PURGE TABLESPACE table_space_name;
ALTER TABLESPACE table_space_name COALESCE;
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/file1.dbf' RESIZE 100M;
PS:不确定停机时间,请有人检查。
PPS:对于 TEMP 表空间,请使用:
ALTER TABLESPACE TEMP SHRINK SPACE ;
(可选添加KEEP 512M
或类似)ALTER DATABASE TEMPFILE '/u02/oracle/rbdb1/temp01.dbf' RESIZE 512M;
非常有效的是将所有内容在线移动到另一个新表空间:
运行以下脚本,它将从相应表空间的数据文件中释放未使用的空间。
在https://orahow.com/reclaiming-unused-space-in-datafiles/查看详细信息
https://orahow.com/reclaim-unused-space-in-oracle/ 有两种方法来识别和回收空间。