ARCHIVED: In Oracle 10g and later, how do I recover a dropped database table?

This content has been archived, and is no longer maintained by Indiana University. Information here may no longer be accurate, and links may no longer be available or reliable.

The recyclebin feature introduced in Oracle 10g allows you to recover dropped tables using the flashback table...to before drop command. With recyclebin, Oracle does not automatically delete dropped tables. Instead, Oracle renames dropped and their associated objects, giving them system-generated recyclebin names that begin with BIN$.

For the following examples, consider creating and then dropping this simple table (testing):

  • Create testing:
      SQL> create table testing (col varchar2(10), row_chng_dt date);
    
      Table created.
    
      SQL> insert into testing values ('Version1', sysdate);
    
      1 row created.
    
      SQL> select * from testing ;
    
      COL        ROW_CHNG
      ---------- --------
      Version1   16:10:03
  • Drop testing:
      SQL> drop table testing; 
    
      Table dropped

Dropping testing places it in recyclebin and changes its name to a recyclebin object name:

  • To find the new name, query recyclebin:
      SQL> select object_name, original_name, type from recyclebin; 
      
      OBJECT_NAME                       ORIGINAL_NAME              TYPE      
      ------------------------------    -----------------------    -------      
      BIN$HGnc55/BrRPgQPeM/qQoRw==$0    TESTING_JOB_IX             INDEX
      BIN$HGnc55/CrRPgQPeM/qQoRw==$0    TESTING_EMPLOYEE_IX        INDEX
      BIN$HGnc55/DrRPgQPeM/qQoRw==$0    TESTING_DEPARTMENT_IX      INDEX
      BIN$HGnc55/ErRPgQPeM/qQoRw==$0    TESTING_EMP_ID_ST_DATE_PK  INDEX
      BIN$HGnc55/ArRPgQPeM/qQoRw==$0    TESTING                    TABLE
  • Although the dropped table is renamed, it retains its data, and you can query it as you would a normal table:
      SQL> select * from "BIN$HGnc55/ArRPgQPeM/qQoRw==$0" ;
    
      COL        ROW_CHNG
      ---------- --------
      Version1   16:10:03

Because a dropped table retains its data, you can easily "undrop" the table by using the flashback table... to before drop command to revert the dropped table to its original name.

Note: Although this command changes the table name, it does not rename any of the dependent objects (e.g., indexes) associated with the table. To revert the dependent objects to their original names, you must manually rename each of them. If you plan to do this, make sure you note the system-generated recyclebin names for each of the dependent objects before you "undrop" the table.

After noting the recyclebin names of any dependent objects in the dropped table, use the following command to restore the table (e.g., change its name back to testing):

  SQL> flashback table testing to before drop;

  Flashback complete.

Associated indexes are restored with the table, but they retain their recyclebin names; for example:

  SQL> select index_name from user_indexes where table_name = 'testing';

  BIN$HGnc55/BrRPgQPeM/qQoRw==$0
  BIN$HGnc55/CrRPgQPeM/qQoRw==$0
  BIN$HGnc55/DrRPgQPeM/qQoRw==$0
  BIN$HGnc55/ErRPgQPeM/qQoRw==$0

To revert the indexes to their original names, you must use the following command for each index:

  alter index "recyclebin_name" rename to original_name;

For example:

  alter index "BIN$HGnc55/BrRPgQPeM/qQoRw==$0" rename to TESTING_JOB_IX;
  alter index "BIN$HGnc55/CrRPgQPeM/qQoRw==$0" rename to TESTING_EMPLOYEE_IX;
  alter index "BIN$HGnc55/DrRPgQPeM/qQoRw==$0" rename to TESTING_DEPARTMENT_IX;
  alter index "BIN$HGnc55/ErRPgQPeM/qQoRw==$0" rename to TESTING_EMP_ID_ST_DATE_PK;


  SQL> select * from testing ; 
  COL        ROW_CHNG 
  ----------   -------- 
  Version1 16:10:03 

  SQL> select * from recyclebin ; 
  no rows selected

When a table is dropped, it is only renamed, not deleted. It remains part of your tablespace and counts against your user tablespace quota. To reclaim tablespace, use flashback to restore tables, or use purge to clear them from recyclebin; for example:

  SQL> purge table "BIN$HGnc55/ArRPgQPeM/qQoRw==$0" ;

  Table purged.

Otherwise, objects will remain in recyclebin until either the tablespace is exhausted or your user quota on the tablespace is met. In either case, Oracle will begin purging objects one at a time, starting with those that have been kept in recyclebin the longest, until it creates enough space for the current operation.

For additional information, see Using Flashback Drop and Managing the Recycle Bin in the Oracle Database Administrator's Guide.

This is document awqa in the Knowledge Base.
Last modified on 2018-07-16 17:21:28.