背景:
同僚不小心建立了一個ts_xx_temp實體檔案,導緻其他同僚經常問我這個是否可以作為臨時表空間,為了不引起歧義,删除表空間及實體檔案
過程
在測試環境中
建立一個實體檔案且表空間名稱為TS_ZYK_T
create tablespace TS_ZYK_T
DATAFILE
'+DATADG/prod/datafile/TS_ZYK_T_1M' SIZE 1m;
select * from dba_data_files;
查詢到表空間名稱為TS_ZYK_T;
SQL> drop tablespace TS_ZYK_T including contents and datafiles;
Tablespace dropped
資料檔案中沒有了
登陸到伺服器上
ASMCMD> ls
DATADG/
SYSTEDG/
ASMCMD> cd DATADG
PROD/
arch/
ASMCMD> cd PROD
ARCHIVELOG/
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfilePROD.ora
ASMCMD> cd DATAFILE
SYSAUX.260.914060367
SYSTEM.259.914060331
TS_ZYK_DATA.278.914434281
TS_ZYK_DATA_1G
UNDOTBS1.261.914060391
UNDOTBS2.263.914060423
USERS.264.914060433
發現确實沒有表空間TS_ZYK_T
具體步驟:
SQL> select * from dba_data_files;
asmcmd
問題:
oracle 11g 有個新特性:oracle 建立完segment,如果沒有資料的話,不使用表空間,如果将表空間删除,而該表後面有資料就會報錯,
表空間不存在?
答:
在測試中發現,表會被删除,不會報報空間不存在
以下是測試過程
create tablespace TS_ZYK_TEMP
'+DATADG/prod/datafile/TS_ZYK_TEP_1M' SIZE 1m;
CREATE TABLE GH_TEMP_TABLESPACE
(A VARCHAR2(100))
tablespace TS_ZYK_TEMP
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 8M
next 1M
minextents 1
maxextents unlimited
);
SQL> SELECT * FROM USER_SEGMENTS T WHERE T.segment_name='GH_TEMP_TABLESPACE';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE SEGMENT_SUBTYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS MAX_SIZE RETENTION MINRETENTION PCT_INCREASE FREELISTS FREELIST_GROUPS BUFFER_POOL FLASH_CACHE CELL_FLASH_CACHE
-------------------------------------------------------------------------------- ------------------------------ ------------------ --------------- ------------------------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ---------- --------- ------------ ------------ ---------- --------------- ----------- ----------- ----------------
SQL>
在user_segment中并沒有出現占用空間情況
重新查詢表名發現該表名已經不存在了,那麼可以這樣認為删除表空間時,建立該表的動作也被消除了
上述問題中表空間不存在報錯的可能性就比較小,就是說表的結構也被消除了