Oracle tips:drop table和purge

在操作Oracle时,我们经常都会删除一个表,当删除错误后,我们希望能够恢复该表,有时也希望删除表之后能够立刻释放表的空间。下面将介绍在Oracle中表的删除、恢复和空间释放。

DROP TABLE

当你drop一个表时,数据库不会立刻释放表的空间,而是重命名这个表然后将其放入回收站中,可以通过下面的方式查看一个删除的表:
select object_name,original_name from user_recyclebin where original_name = 'TEMP';
OBJECT_NAME						ORIGINAL_NAME
-------------------------------------------------------
BIN$C1LT5U0DaV7gVAAhKENZ5A==$0	TEMP
object_name:对象在回收站中的名称;
original_name:对象的原始名称。
表放入回收站后,Oracle不会该表的空间给其它对象使用,表所占用的空间依然占用,除非用户手工进行Purge或者因为存储空间不够而被数据库清掉。如果你发现错误的删除了表,可以通过FLASHBACK TABLE将表恢复。

FLASHBACK TABLE

下面是使用FLASHBACK TABLE来恢复一个叫temp的表:
FLASHBACK TABLE temp TO BEFORE DROP;
TO BEFORE DROP表示恢复这个表及其所有依赖的对象。如果该表的名称已经被其它表使用,那么执行FLASHBACK TABLE该表时则会报错:
ORA-38312:original name is used by an existing object
这时,你可以在执行FLASHBACK TABLE时将表重命名:
FLASHBACK TABLE temp TO BEFORE DROP RENAME TO temp_old;
RENAME TO表示将该表恢复后重命名。如果该表已经被删除了多次,那么使用FLASHBACK TABLE恢复该表将默认恢复最后一次删除的那个,如果你想恢复之前的一个版本,你需要在回收站中查询该表:
select object_name,original_name,droptime from user_recyclebin where original_name = 'TEMP';
OBJECT_NAME						ORIGINAL_NAME	DROPTIME
------------------------------------------------------------------------
BIN$C1LT5U0FaV7gVAAhKENZ5A==$0	TEMP			2014-12-29:10:59:41
BIN$C1LT5U0HaV7gVAAhKENZ5A==$0	TEMP			2014-12-29:10:59:54
BIN$C1LT5U0GaV7gVAAhKENZ5A==$0	TEMP			2014-12-29:10:59:47
然后可以使用那个恢复并重命名的方式依次恢复每一个。
使用FLASHBACK TABLE需要注意:
1)数据库将从回收站恢复该表的所有索引,注意bitmap join Index不能恢复,因为该索引在表格删除后不会被放入回收站中,所以不能恢复;
2)数据库将恢复该表的trigger和constraint,除了指向其它表的完整性约束;
3)当删除一个表格时,定义在该表格上的所有物化视图日志也被删除,但不会放入回收站中,因此,物化视图日志不能随着表格被恢复;
4)当删除一个表格时,该表格相关的所有索引都将被放入回收站中,如果数据库空间不足,数据库将首先清除掉索引的空间,因此,在这种情况下,恢复表格将无法恢复所有的索引;
5)如果被删除的表格已经被purge了,那么将无法恢复。
如果用户在删除一个表后不会再恢复它,可以考虑使用purge将其测试清除掉。

PURGE

PURGE可以将表彻底清除,并且可以释放表所占用的空间。下面是PURGE一个已经在回收站中的表temp:
purge table temp;
需要注意你不能回滚一个purge操作,一旦对一个表执行了purge操作,该表将无法再恢复。
如果该表被删除了多次,purge操作将清除最早删除的那个表,你也可以清除整个回收站的内容:
PURGE RECYCLEBIN;

DROP TABLE ... PURGE

我们也可以将删除表格和释放空间在一步中完成,下面就是将temp表测试删除:
drop table temp purge;
这种方式相当于你先删除表格temp,然后在对表格执行purge操作。注意,你不能回滚一个带上PURGE的DROP TABLE操作,也不能恢复一个使用PURGE删除的表格。
<think>好的,用户问的是“oracle drop table purge 会产生归档么”,我需要详细解答这个问题。首先,我得回忆一下Oracle中删除表的相关命令机制。 用户提到的`drop table purge`,这是Oracle中彻底删除表的命令,加上`purge`会跳过回收站直接删除。归档日志的产生通常与数据库是否处于归档模式有关,所以第一步应该确认这一点。 接下来,归档日志的产生主要取决于操作是否产生重做日志(redo log)。在归档模式下,重做日志会被归档,形成归档日志。而`drop table`属于DDL操作,通常会产生一定的重做日志,但具体量的大小可能因情况而异。 然后,需要考虑表的大小存储参数。如果表使用了`segment creation immediate`,删除时可能需要更多操作,从而生成更多重做日志。但一般情况下,`drop table`的DDL操作生成的重做日志量相对较小,远不如DML操作如大量`delete`或`insert`。 另外,`purge`选项的作用是绕过回收站,直接删除表及其相关对象。虽然这会影响空间回收的方式,但关键点还是在于操作本身是否生成重做日志,进而导致归档。因此,无论是否使用`purge`,只要在归档模式下,相关的重做日志都会被归档。 需要提醒用户的是,即使`drop table purge`在归档模式下会产生归档,实际生成的量通常不大。但如果是频繁执行DDL操作,累积起来可能会有影响。此外,如果数据库处于非归档模式,自然不会有归档日志产生,但这对数据库的备份恢复策略有重大影响,需谨慎选择。 最后,总结回答时要分点说明,结构清晰,确保用户能理解不同情况下的影响,并提供验证方法,比如检查归档日志目录或使用查询语句确认归档量变化。</think>Oracle中`DROP TABLE ... PURGE`命令是否会产生归档日志,取决于数据库的**归档模式**操作本身的特性。以下是分步说明: --- ### **1. 归档模式 vs 非归档模式** - **归档模式(ARCHIVELOG)**:所有重做日志(Redo Log)会被归档保存为归档日志。 - **非归档模式(NOARCHIVELOG)**:不生成归档日志。 **结论**: 只有数据库处于**归档模式**时,`DROP TABLE ... PURGE` **可能**产生归档日志。 --- ### **2. DROP TABLE ... PURGE 的日志行为** - **DDL操作特性**: `DROP TABLE`是DDL操作,默认会生成少量重做日志(Redo),用于记录数据字典变更(如删除表的元数据)。 - **PURGE的作用**: `PURGE`表示直接删除表(不进入回收站),但**不影响是否生成重做日志**,仅影响空间回收方式。 **关键点**: - 如果数据库处于归档模式,DDL操作的重做日志会被归档。 - 归档日志量通常较小(仅元数据操作),远低于DML操作(如`DELETE`)。 --- ### **3. 特殊情况:依赖对象的影响** 如果表关联了以下对象,可能增加重做日志量: - **分区表**:删除多个分区会生成更多日志。 - **索引/约束**:删除索引或约束的元数据变更也会记录日志。 - **段空间释放**:如果表空间使用`SEGMENT SPACE MANAGEMENT AUTO`,段释放操作可能生成额外日志。 --- ### **4. 验证方法** 通过以下步骤确认归档日志是否生成: 1. 检查数据库归档模式: ```sql SELECT log_mode FROM v$database; ``` 2. 执行`DROP TABLE ... PURGE`前,记录当前归档日志序列: ```sql SELECT sequence#, name FROM v$archived_log ORDER BY sequence# DESC; ``` 3. 执行`DROP TABLE ... PURGE`后,观察是否有新的归档日志生成。 --- ### **5. 总结** - **归档模式下**:`DROP TABLE ... PURGE` **会**产生少量归档日志(记录元数据变更)。 - **非归档模式下**:不会生成归档日志,但重做日志会被覆盖。 --- ### **建议** - 若需最小化归档日志,可考虑在业务低峰期执行DDL操作。 - 定期清理过期归档日志,避免存储压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值