3、临时表空间、文件的shrink
临时表空间是不会有持久化数据保存的。所以,很多被“胀大”的表空间都存在一个shrink收缩问题。从11g开始,Oracle支持Temp表空间和临时文件的搜索方法。
为了进行试验,我们先向使用表空间Temptest添加文件。
SQL> alter tablespace temptest add tempfile size 1G;
Tablespace altered
SQL> select file_name, file_id, tablespace_name from dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME
------------------------------ ---------- ---------------
/u01/app/oradata/ORA11G/datafi 1 TEMP
le/o1_mf_temp_92t73qm8_.tmp
/u01/app/oradata/ORA11G/datafi 2 TEMPTEST
le/o1_mf_temptest_9j80859z_.tm
p
/u01/app/oradata/ORA11G/datafi 3 TEMPTEST
le/o1_mf_temptest_9j826c9b_.tm
p
空间情况:
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 6442450944 2249195520 6440353792
新加入临时文件到临时表空间,由于文件采用稀疏文件结构,所以我们allocated_space没有增加,而free_space有增加。
磁盘空间也不会变化。
[root@SimpleLinux ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 26G 20G 57% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
[root@SimpleLinux ORA11G]# cd datafile/
[root@SimpleLinux datafile]# ls -l | grep temptest
-rw-r----- 1 oracle oinstall 5368717312 Feb 19 09:10 o1_mf_temptest_9j80859z_.tmp
-rw-r----- 1 oracle oinstall 1073750016 Feb 19 09:28 o1_mf_temptest_9j826c9b_.tmp
我们可以直接使用shrink tempfile的方法,将文件限制大小。Keep字句中包括控制大小。
SQL> alter tablespace temptest shrink tempfile '/u01/app/oradata/ORA11G/datafile/o1_mf_temptest_9j826c9b_.tmp' keep 500m;
文件系统中,文件显示出的大小便为500M,但是磁盘分配没有变化,因为从来就没有分配过。
[root@SimpleLinux datafile]# ls -l | grep temptest
-rw-r----- 1 oracle oinstall 5368717312 Feb 19 09:10 o1_mf_temptest_9j80859z_.tmp
-rw-r----- 1 oracle oinstall 525336576 Feb 19 09:35 o1_mf_temptest_9j826c9b_.tmp
[root@SimpleLinux datafile]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 26G 20G 57% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
缩小的500M,在dba_temp_free_space中有所表现。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5894037504 2249187328 5891948544
如果我们对那个已经分配的临时文件进行shrink,是会影响到磁盘结构的。
SQL> alter tablespace temptest shrink tempfile '/u01/app/oradata/ORA11G/datafile/o1_mf_temptest_9j80859z_.tmp' keep 1G;
Tablespace altered (长时间执行)
[root@SimpleLinux datafile]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 25G 21G 55% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 1600110592 2080768 1598029824
此外,我们也是可以对Temp表空间直接进行shrink过程。
SQL> create temporary tablespace temptest tempfile size 1G
2 extent management local uniform size 1m;
Tablespace created
SQL> alter tablespace temptest shrink space keep 500m;
Tablespace altered
此时检查视图dba_temp_free_space。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
------------------------------ --------------- --------------- ----------
TEMP 30408704 30408704 29360128
TEMPTEST 525336576 1048576 524288000
影响到的就是表空间总大小。如果我们不指定keep,Oracle会将表空间缩小到元数据阶段。
SQL> alter tablespace temptest shrink space;
Tablespace altered
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
------------------------------ --------------- --------------- ----------
TEMP 30408704 30408704 29360128
TEMPTEST 2088960 1040384 1048576
确定了2M大小,1M是分配元数据。
4、结论
11g中提供了很多临时表空间操作的特性,这帮助我们更好的管理和控制临时表空间。