我们有一个Shell脚本,可以对oracle数据库执行物理备份(tar +所有数据库文件的压缩)。最近,我们创建了一个表空间,其中包含我们不需要备份其内容的表。
是否可以忽略与该表空间相关的数据文件并进行有效备份?
PS:我们不想使用RMAN。
最佳答案
我在这里以注解开头:这不是规范模式。通常,我们使用RMAN备份数据库中的所有数据文件。照这样说...
是的,可能可以通过带有数据文件的备份从备份中还原和恢复数据库。但是,恢复将需要在还原数据库时删除表空间。
对于删除包含单个数据文件的表空间的简单情况:首先还原数据库文件,然后:
STARTUP NOMOUNT;
ALTER DATABASE MOUNT ;
ALTER DATABASE DATAFILE '<complete_path_to_datafile>' OFFLINE DROP ;
ALTER DATABASE OPEN ;
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS ;
然后,继续数据库恢复(RECOVER DATABASE;)
显然,您在DROP TABLESPACE命令中提供的tablespace_name将与被删除的数据文件相关。
显然,这不适用于SYSTEM表空间。而且我也不敢在UNDO,SYSAUX,USERS等其他表空间上尝试此操作。删除和添加TEMPORARY TABLESPACES的语法也不同。
我不知道带有“DROP TABLESPACE ... INCLUDING CONTENTS”的任何“陷阱”,但是考虑到其他表空间中的对象可能会受到影响。 (考虑到删除的表空间可能具有其他表空间中的表的索引,对外键约束的影响,对存储过程的影响等。)
不用说,在生产中依赖此技术之前,您需要在测试环境中测试这种类型的还原过程。
如果不进行测试,使用RMAN备份所有数据文件将为您提供更好的服务。
注意:自Oracle 8(可能是Oracle 7.3)以来(我不得不滚动自己的热备份脚本时),我还没有做过类似的事情。自从我们开始使用RMAN以来,我不需要测试任何类似的东西。
注意:可能需要在ALTER DATABASE OPEN之前运行RECOVER DATABASE。我认为您可能会收到有关“数据文件需要更多恢复”的异常警告,就像在表空间处于BEGIN BACKUP模式下启动数据库时一样。