我们如何在oracle中缩小临时表空间?并且为什么它增加到高达25 GB,因为数据库中只有一个模式用于应用程序,数据表空间大小为2 GB,索引表空间大小为1 GB.
Phi*_*ump 104
哦,我的天啊!看看我的临时表空间的大小!或者......如何缩小Oracle中的临时表空间.
是的,我运行了一个查询,看看我的临时表空间有多大:
SQL> SELECT tablespace_name, file_name, bytes
2 FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
TABLESPACE_NAME FILE_NAME BYTES
----------------- -------------------------------- --------------
TEMP /the/full/path/to/temp01.dbf 13,917,200,000
Run Code Online (Sandbox Code Playgroud)
您要问的第一个问题是临时表空间如此之大的原因.你可能会从脑海中知道答案.这可能是由于一个大型查询,你只是运行了一个错误的类型(我不止一次.)这可能是由于一些其他特殊情况.如果是这种情况,那么您需要做的就是清理临时表空间并继续生活.
但是,如果你不知道怎么办?在您决定缩小之前,您可能需要对大型表空间的原因进行一些调查.如果这种情况经常发生,那么您的数据库可能只需要那么多空间.
动态性能视图
V$TEMPSEG_USAGE
Run Code Online (Sandbox Code Playgroud)
在确定原因时非常有用.
也许你只是不关心原因,你只需要缩小它.这是你上班的第三天.如果数据和临时表空间是13GiB,数据库中的数据只有200MiB - 只需收缩它并继续前进.如果它再次增长,那么我们将调查原因.与此同时,我在该磁盘卷上的空间不足,我只需要空间.
我们来看看缩小它.它将取决于您运行的Oracle版本以及临时表空间的设置方式.
Oracle会尽最大努力避免犯下任何可怕的错误,因此我们只会尝试命令,如果它们不起作用,我们将以新的方式收缩.
首先让我们尝试收缩数据文件.如果我们能做到这一点,那么我们就会回到这个空间,我们可以担心为什么它明天会增长.
SQL>
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M;
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
Run Code Online (Sandbox Code Playgroud)
根据错误消息,您可能希望尝试使用小于文件当前站点的不同大小.我在这方面取得了有限的成功.如果临时表空间位于文件的头部并且小于指定的大小,Oracle将仅收缩文件.一些旧的Oracle文档(他们更正了这一点)说你可以发出命令,错误信息会告诉你缩小的大小.当我开始担任DBA时,这不是真的.你只需要多次猜测并重新运行命令,看看它是否有效.
好的.那没用.这个怎么样.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Run Code Online (Sandbox Code Playgroud)
如果你是11克(也许在10克)这就是它!如果它有效,您可能需要返回上一个命令并再尝试一下.
但是,如果失败了怎么办?如果临时表空间是安装数据库时设置的默认临时表,那么您可能需要做更多的工作.在这一点上,我通常会重新评估我是否真的需要这个空间.所有磁盘空间只需$ X.XX $ GiB.通常我不希望在生产时间内进行这样的更改.这意味着再次在凌晨2点工作!(并不是说我真的反对在凌晨2点工作 - 只是......我也喜欢睡觉.而且我的妻子喜欢在凌晨2点让我在家里...而不是在凌晨4点在市中心的街道漫游,试图记住哪里我提前3小时把车停了.我听说过那种"远程办公"的事情.我只是担心我会中途通过然后我的互联网连接会失败 - 然后我必须赶紧去市中心解决这个问题然后人们出现在早上使用数据库.)
好的...回到严肃的事情......如果要缩小的临时表空间是默认的临时表空间,则必须先创建一个新的临时表空间,将其设置为默认的临时表空间,然后删除旧的默认临时表空间表空间并重新创建它.后续删除创建的第二个临时表.
SQL> CREATE TEMPORARY TABLESPACE temp2
2 TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE
3 AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
Tablespace created.
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
Database altered.
SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
SQL> CREATE TEMPORARY TABLESPACE temp
2 TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE
3 AUTOEXTEND ON NEXT 128M MAXSIZE unlimited
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
Tablespace created.
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
Database altered.
SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
Run Code Online (Sandbox Code Playgroud)
希望其中一件事能有所帮助!
管理表空间的选项比以8i开头的版本要好得多.如果您使用适当类型的文件用于临时表空间(即本地管理的临时文件),则尤其如此.
所以,它可以像这个命令一样简单,它会将你的表空间缩小到128兆...
alter tablespace <your_temp_ts> shrink space keep 128M;
Run Code Online (Sandbox Code Playgroud)
Oracle在线文档非常好. 了解更多.
编辑
看来OP有一个早期版本的数据库.对于早期版本,我们必须调整单个数据文件的大小.所以,首先,找到文件名.这些查询中的一个或另一个应该这样做......
select file_name from dba_data_files where tablespace_name = '<your_temp_ts>'
/
select file_name from dba_temp_files where tablespace_name = '<your_temp_ts>'
/
Run Code Online (Sandbox Code Playgroud)
然后在此命令中使用该路径:
alter database datafile '/full/file/path/temp01.dbf' resize 128m
/
Run Code Online (Sandbox Code Playgroud)