怎么删除表空间对应的某一个数据文件

摘要:
如果要删除表空间的数据文件,最好、最安全的方法是删除表空间并按如下方式重建:1.导出表空间中的所有内容;2.删除表空间:DROPTABLESPACE<tablespace_名称>包括内容;3.重新创建一个新的表空间及其数据文件;4.将导出的数据导入表空间;然而,在实际应用环境中,数据文件往往很大,表空间重构并不实用。目标:删除一个表空间

如果想要删除表空间的数据文件,最好且最安全的办法是,删除表空间后重建

步骤如下:

  1,导出该表空间中的所有内容;

  2,删除表空间:DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;

  3,重新创建新的表空间及其数据文件;

  4,将导出的数据导入表空间;

但是在实际应用环境中,数据文件往往比较大,表空间重建显得不太实际。

目标:删除表空间的一个数据文件

测试环境:Oracle 11.2.0.4.0  64bit

注意:此方法仅用来删除误加的表空间数据文件,如果该数据文件中已有数据,删除会导致表空间数据的不完整,建议使用上述方法删除。

首先,ALTER DATABASE DATAFILE '***.DBF' OFFLINE DROP,这个命令用来将该数据文件从逻辑上删除,此时该文件的online_status为recover状态

SQL> SELECT file_id, file_name, status, online_status FROM Dba_Data_Files;
 
   FILE_ID FILE_NAME                                                                        STATUS    ONLINE_STATUS
---------- -------------------------------------------------------------------------------- --------- -------------
         4 D:ORADATAORCLUSERS01.DBF                                                      AVAILABLE ONLINE
         3 D:ORADATAORCLUNDOTBS01.DBF                                                    AVAILABLE ONLINE
         2 D:ORADATAORCLSYSAUX01.DBF                                                     AVAILABLE ONLINE
         1 D:ORADATAORCLSYSTEM01.DBF                                                     AVAILABLE SYSTEM
         5 D:ORADATAUSER_DATAFILESTS_CG01.DBF                                            AVAILABLE ONLINE
         6 D:ORADATAUSER_DATAFILESTS_CG02.DBF                                            AVAILABLE RECOVER
 
6 rows selected

 然后直接从file$基表中把这个文件删除(可能需要重建数据文件)

SQL> select file#,status$ from file$;
 
     FILE#    STATUS$
---------- ----------
         1          2
         2          2
         3          2
         4          2
         5          2
         6          2
 
6 rows selected
 
SQL> delete file$ where file# = 6;
 
1 row deleted
 
SQL> commit;
 
Commit complete
 
SQL> select file#,status$ from file$;
 
     FILE#    STATUS$
---------- ----------
         1          2
         2          2
         3          2
         4          2
         5          2

重启数据库

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 5060792320 bytes
Fixed Size                  2289960 bytes
Variable Size            3355447000 bytes
Database Buffers         1694498816 bytes
Redo Buffers                8556544 bytes
数据库装载完毕。
数据库已经打开。

SQL> select file#, status$ from file$;

     FILE#    STATUS$
---------- ----------
         1          2
         2          2
         3          2
         4          2
         5          2

SQL>  SELECT file_id, file_name, status, online_status FROM Dba_Data_Files;
 
   FILE_ID FILE_NAME                                                                        STATUS    ONLINE_STATUS
---------- -------------------------------------------------------------------------------- --------- -------------
         4 D:ORADATAORCLUSERS01.DBF                                                      AVAILABLE ONLINE
         3 D:ORADATAORCLUNDOTBS01.DBF                                                    AVAILABLE ONLINE
         2 D:ORADATAORCLSYSAUX01.DBF                                                     AVAILABLE ONLINE
         1 D:ORADATAORCLSYSTEM01.DBF                                                     AVAILABLE SYSTEM
         5 D:ORADATAUSER_DATAFILESTS_CG01.DBF                                            AVAILABLE ONLINE

可以看到online_status为recover的数据文件6已经删掉,这时候就可以去操作系统中删除该数据文件了。

如果重启数据库失败,并且报错ORA-01207,需要重建控制文件(LZ并没有遇到,没法演示)

可以参考 https://www.cnblogs.com/jyzhao/p/9075427.html

补充:

楼主后面发现在v$datafile中还是有这个数据文件,虽然不影响,但是作为强迫症患者的楼主还是决定把它去掉;

SQL> select file#, name, status from v$datafile;
 
     FILE# NAME                                                                             STATUS
---------- -------------------------------------------------------------------------------- -------
         1 D:ORADATAORCLSYSTEM01.DBF                                                     SYSTEM
         2 D:ORADATAORCLSYSAUX01.DBF                                                     ONLINE
         3 D:ORADATAORCLUNDOTBS01.DBF                                                    ONLINE
         4 D:ORADATAORCLUSERS01.DBF                                                      ONLINE
         5 D:ORADATAUSER_DATAFILESTS_CG01.DBF                                            ONLINE
         6 D:ORADATAUSER_DATAFILESTS_CG02.DBF                                            RECOVER

 解决的办法是还是重建控制文件

-- 备份控制文件
SQL> alter database backup controlfile to trace as 'd:oradatactl.sql';

SQL> shutdown immediate;
-- nomount状态
SQL> startup nomount;
-- 重建控制文件
SQL> @D:oradataCTL.SQL

SQL> ALTER DATABASE OPEN;
SQL> select file#, name, status from v$datafile;
 
     FILE# NAME                                                                             STATUS
---------- -------------------------------------------------------------------------------- -------
         1 D:ORADATAORCLSYSTEM01.DBF                                                     SYSTEM
         2 D:ORADATAORCLSYSAUX01.DBF                                                     ONLINE
         3 D:ORADATAORCLUNDOTBS01.DBF                                                    ONLINE
         4 D:ORADATAORCLUSERS01.DBF                                                      ONLINE
         5 D:ORADATAUSER_DATAFILESTS_CG01.DBF                                            ONLINE
 

 此时v$datafile视图中就没有 file#=6 记录了。

免责声明:文章转载自《怎么删除表空间对应的某一个数据文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何用delphi读取网卡物理号滴滴开源 Vue 组件库— cube-ui下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA连接数据库

运行如下Java程序,学会JAVA连接数据库的方法。。 import java.sql.*; public class Test { public static void main(String[] srg) { String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载...

解决sql脚本文件太大无法打开的问题(转载)

原文地址:https://blog.csdn.net/weixin_33910137/article/details/94087442 as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—》生成脚本—》 下一步-》高级,选择数据库版本和编写脚本数据类型为架构和数据,可以保留数据。 继续下...

Sql Server 数据迁移问题的解决

在工作中遇到一个数据迁移的问题。是通过Sql Server 2008 Management studio产生的scripts来解决的。现在来说说此实际问题:生产环境的配置是数据文件有20GB大,log文件有10GB大,实际数据只占用了500MB,所以大部分空间是空的。而测试环境因硬盘小,数据文件所在的驱动器总共只有28GB。现在想做的是把生产环境的数据拷贝...

【互联网业务数据分析实战】神策张涛

数据使用流程: 数据采集->指标建模->观测数据->数据分析->业务洞察 一、常见指标 1、DAU&MAU 2、新增用户 3、留存 4、其他指标 二、选好数据指标的通用方法论 1、拆解业务模块 2、根据业务模块所属类型选择数据指标 三、选择合适的数据工具 1、...

oracle imp导入数据到另一个表空间

http://blog.163.com/darlingchenlin@126/blog/static/7156283420100531431855/ 1、在第一个数据库导出数据:qlyg_xs_db_chinatelecom_0910191029.dmp(用户为QLYG_XS) 2、将qlyg_xs_db_chinatelecom_0910191029.d...

C# 异步读取数据库里面的数据与绑定UI的解决办法

异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码 首先按习惯的方法,设定线程更新UI a2.CheckForIllegalCrossThreadCalls = false; //a2为窗体名称 下面的代码就是从数据库里取得数据并绑定 private void button1_Click(object...