create tablespace test datafile '/u01/app/oracle/oradata/PROD/test01.dbf' size 10m autoextend off, '/u01/app/oracle/oradata/PROD/test02.dbf' size 10m autoextend off; SYS@ PROD>select file_name,tablespace_name,bytes/1024/1024,status,autoextensible from dba_data_files; FILE_NAME TABLESPACE_NAME BYTES/1024/1024 STATUS AUTOEXTEN -------------------------------------------------- -------------------- --------------- --------------------------- --------- /u01/app/oracle/oradata/PROD/system01.dbf SYSTEM 700 AVAILABLE YES /u01/app/oracle/oradata/PROD/sysaux01.dbf SYSAUX 600 AVAILABLE YES /u01/app/oracle/oradata/PROD/undotbs01.dbf UNDOTBS1 200 AVAILABLE YES /u01/app/oracle/oradata/PROD/users01.dbf USERS 5 AVAILABLE YES /u01/app/oracle/oradata/PROD/test01.dbf TEST 10 AVAILABLE NO /u01/app/oracle/oradata/PROD/test02.dbf TEST 10 AVAILABLE NO 6 rows selected. SYS@ PROD>create table t tablespace test as select * from dba_objects; Table created. SYS@ PROD>insert into t select * from t; 13084 rows created. SYS@ PROD>/ SYS@ PROD>select owner,segment_name,tablespace_name,bytes/1024/1024 from dba_segments where segment_name ='T' ; OWNER SEGMENT_NAME TABLESPACE_NAME BYTES/1024/1024 ------------------------------ ---------------------------------------- ------------------------------ --------------- SYS T TEST 18 SYS@ PROD>select count(*) from t; COUNT(*) ---------- 105200
2、删除数据文件
[oracle@fyl PROD]$ rm test02.dbf ----删除数据文件 [oracle@fyl PROD]$ ls -ltr test* -rw-r----- 1 oracle dba 10493952 Sep 4 14:22 test01.dbf 此时查询数据库 SYS@ PROD>select count(*) from t; COUNT(*) ---------- 1052003、恢复
[oracle@fyl PROD]$ lsof | grep delete | grep test oracle 6143 oracle 25uW REG 253,0 10493952 3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted) oracle 6149 oracle 23u REG 253,0 10493952 3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted) oracle 6176 oracle 18u REG 253,0 10493952 3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted) oracle 6176 oracle 19u REG 253,0 10493952 3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted) 从上面的信息可以看到 PID 6143(oracle)打开文件的文件描述符为 25,然后使用如下命令 [oracle@fyl PROD]$ cat /proc/6143/fd/25 > /u01/app/oracle/oradata/PROD/test02.dbf [oracle@fyl PROD]$ ls -ltr test* -rw-r----- 1 oracle dba 10493952 Sep 4 14:41 test01.dbf -rw-r----- 1 oracle dba 10493952 Sep 4 14:41 test02.dbf 然后 shutdown immediate startup; recover datafile 6; OK4、ASM管理的文件,正在使用的数据文件时不能删除的
ASMCMD> ls SYSAUX.261.845726017 SYSTEM.260.845725985 TEST.265.857386677 UNDOTBS1.262.845726043 USERS.264.845726073 ASMCMD> ASMCMD> ASMCMD> rm TEST.265.857386677 ORA-15032: not all alterations performed ORA-15028: ASM file '+ORADATA/fyl/datafile/TEST.265.857386677' not dropped; currently being accessed (DBD ERROR: OCIStmtExecute)5、裸设备的数据文件,最大可能是删除了连接,重建即可
6、当在11g做这个实验,同样建表空间TEST,表T,删除一个数据文件,等待几分钟后,查看alter日志
Thu Sep 04 14:27:55 2014
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ckpt_6147.trc:
ORA-01171: datafile 6 going offline due to error advancing checkpoint
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/test02.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
Thu Sep 04 14:27:56 2014
Shutting down instance (abort)
License high water mark = 5
USER (ospid: 6394): terminating the instance
Instance terminated by USER, pid = 6394
Thu Sep 04 14:27:56 2014
Instance shutdown complete
猜测是数据库CKPT进程checkpoint不能完成,然后offline了datafile 6,但是数据库offline之后为什么被pid = 6394 terminated了呢???
##############
#备份重于一切!#
##############
7、关于删除表空间数据文件件问题
alter database datafile ... offline drop:
在非归档模式下,可以使用... offline drop,在归档模式下,使用... offline. 该命令不会删除数据文件,只是将数据文件的状态更改为recover。 offline drop命令相当于把一个数据文件至于离线状态,它的scn不在变化,不会再向它写入任何数据;但是原有存在这个文件中对象和数据还可以继续使用,online需要恢复。 数据文件的相关信息还会存在数据字典和控制文件中。因此在使用这个命令后,通过修改控制文件将它删除,数据库在启动时就会报文件丢失的错误,并且会在数据字典中产生一个MISGXXXXX的纪录。因此,以一个数据文件是无法被直接从数据库中删除掉的。
如果需要减少表空间的数据文件,可以采用以下办法:
export除表空间的内容:expdp ... tablespaces=xxx;
使用include content子句删除表空间:drop tablespace xxx include contents;
重见表空间,使之不包括需要去除掉的数据文件;
import表空间的所有数据对象。
alter tablespace xxx drop datafile 'xxxx111'
该语句只能是datafile online的时候才可以使用。如果说对应的数据文件已经是offline for drop,那么仅针对 dictionary managed tablespaces 可用,并且要求datafile为空。