You are on page 1of 9

PURPOSE ======= This bulletin illustrates the new recyclebin functionality provided with the 10g database SCOPE

& APPLICATION =================== Can be used by Oracle Support Analyst and DBA ABOUT 10g RECYCLEBIN ==================== In order to have FLASHBACK DROP functionality a recyclebin is provided to every oracle user. SQL> desc recyclebin Name ----------------------------------------OBJECT_NAME ORIGINAL_NAME OPERATION TYPE TS_NAME CREATETIME DROPTIME DROPSCN PARTITION_NAME CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT SPACE Null? Type -------- -----------NOT NULL VARCHAR2(30) VARCHAR2(32) VARCHAR2(9) VARCHAR2(25) VARCHAR2(30) VARCHAR2(19) VARCHAR2(19) NUMBER VARCHAR2(32) VARCHAR2(3) VARCHAR2(3) NOT NULL NUMBER NOT NULL NUMBER NOT NULL NUMBER NUMBER

The recyclebin is a public synonym and it is based on the view user_recyclebin which in turn is based on sys.recyclebin$ table. Related recyclebin objects: SQL> SELECT SUBSTR(object_name,1,50),object_type,owner FROM dba_objects WHERE object_name LIKE '%RECYCLEBIN%'; / SUBSTR(OBJECT_NAME,1,50) OBJECT_TYPE OWNER -----------------------------------------------------RECYCLEBIN$ TABLE SYS RECYCLEBIN$_OBJ INDEX SYS RECYCLEBIN$_TS INDEX SYS RECYCLEBIN$_OWNER INDEX SYS USER_RECYCLEBIN VIEW SYS

USER_RECYCLEBIN PUBLIC RECYCLEBIN PUBLIC DBA_RECYCLEBIN SYS DBA_RECYCLEBIN PUBLIC 9 rows selected.

SYNONYM SYNONYM VIEW SYNONYM

THE RECYCLE BIN =============== The Recycle Bin is a virtual container where all dropped objects reside. Underneath the covers, the objects are occupying the same space as when they were created. If table EMP was created in the USERS tablespace, the dropped table EMP remains in the USERS tablespace. Dropped tables and any associated objects such as indexes,constraints, nested tables, and other dependant objects are not moved, they are simply renamed with a prefix of BIN$$. You can continue to access the data in a dropped table or even use Flashback Query against it. Each user has the same rights and privileges on Recycle Bin objects before it was dropped. You can view your dropped tables by querying the new RECYCLEBIN view. Objects in the Recycle Bin will remain in the database until the owner of the dropped objects decides to permanently remove them using the new PURGE command. The Recycle Bin objects are counted against a user's quota. But Flashback Drop is a non-intrusive feature. Objects in the Recycle Bin will be automatically purged by the space reclamation process if o A user creates a new table or adds data that causes their quota to be exceeded. o The tablespace needs to extend its file size to accommodate create/insert operations. There is no issues with DROPping the table, behaviour wise. It is the same as in 8i / 9i. The space is not released immediately and is accounted for within the same tablespace / schema after the drop. When we drop a tablespace or a user there is NO recycling of the objects. EXAMPLE ======= SQL> SELECT * FROM v$version; BANNER ---------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - 64bi PL/SQL Release 10.1.0.2.0 - Production CORE 10.1.0.2.0 Production TNS for Solaris: Version 10.1.0.2.0 - Production NLSRTL Version 10.1.0.2.0 - Production SQL> sho user USER is "BH"

SQL> SELECT object_name,original_name,operation,type,dropscn,droptime 2 FROM user_recyclebin 3 / no rows selected SQL> CREATE TABLE t1(a NUMBER); Table created. SQL> DROP TABLE t1; Table dropped. SQL> SELECT object_name,original_name,operation,type,dropscn,droptime 2 FROM user_recyclebin 3 / OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN DROPTIME ------------------------------ ---------------------------------------- ------------------------- ---------- ------------------BIN$1Unhj5+DSHDgNAgAIKds8A==$0 T1 DROP TABLE 8.1832E+12 2004-03-10:11:03:49 SQL> sho user USER is "SYS" SQL> SELECT owner,original_name,operation,type 2 FROM dba_recyclebin 3 / OWNER ORIGINAL_NAME OPERATION TYPE ------------------------------ ---------------------------------------- -----BH T1 DROP TABLE Once a table is dropped it is not available. We cannot access that table (or the BIN$$ table) till that is recovered(flashback). We can also create a new table with the same name at this point. Dropped tables are viewable (with the BIN$$ name) under user_tables and we can see them using the new column user_tables.dropped = 'YES' From BH user: SQL> SELECT table_name,tablespace_name FROM user_tables WHERE dropped='YES' 4 / TABLE_NAME TABLESPACE_NAME ------------------------------ --------------BIN$1UtrT/b1ScbgNAgAIKds8A==$0 USERS PURGING =======

In order to completely remove the table from the DB and to release the space the new PURGE command is used. From BH user: SQL> PURGE TABLE t1; Table purged. OR SQL> PURGE TABLE "BIN$1UtrT/b1ScbgNAgAIKds8A==$0"; Table purged. From SYSDBA user: SQL> SELECT owner,original_name,operation,type 2 FROM dba_recyclebin 3 / no rows selected From BH user: SQL> SHOW recyclebin SQL> There are various ways to PURGE objects: PURGE TABLE t1; PURGE INDEX ind1; PURGE recyclebin; (Purge all objects in Recyclebin) PURGE dba_recyclebin; (Purge all objects / only SYSDBA can) PURGE TABLESPACE users; (Purge all objects of the tablespace) PURGE TABLESPACE users USER bh; (Purge all objects of the tablspace belonging to BH) For an object, the owner or a user with SYSDBA privilege or a user with DROP ANY... system privilege for the type of object to be purged can PURGE it. For more information on the PURGE command refer to the 10g SQL Reference DISABLING RECYCLEBIN ==================== We can DROP and PURGE a table with a single command From BH user: SQL> DROP TABLE t1 PURGE; Table dropped. SQL> SELECT * 2 FROM recyclebin 3 / no rows selected There is no need to PURGE.

In case we want to disable the behavior of recycling, there is an underscore parameter "_recyclebin" which defaults to TRUE. We can disable recyclebin by setting it to FALSE. From SYSDBA user: SQL> SELECT a.ksppinm, b.ksppstvl, b.ksppstdf FROM x$ksppi a, x$ksppcv b WHERE a.indx = b.indx AND a.ksppinm like '%recycle%' ORDER BY a.ksppinm / Parameter Value Default? ---------------------------- ----------------------------------------------_recyclebin TRUE TRUE From BH user: SQL> CREATE TABLE t1(a NUMBER); Table created. SQL> DROP TABLE t1; Table dropped. SQL> SELECT original_name FROM user_recyclebin; ORIGINAL_NAME -------------T1 From SYSDBA user: SQL> ALTER SYSTEM SET "_recyclebin"=FALSE SCOPE = BOTH; System altered. SQL> SELECT a.ksppinm, b.ksppstvl, b.ksppstdf FROM x$ksppi a, x$ksppcv b WHERE a.indx = b.indx AND a.ksppinm like '%recycle%' ORDER BY a.ksppinm / Parameter Value Default? ---------------------------- ----------------------------------------------_recyclebin FALSE TRUE From BH user: SQL> CREATE TABLE t1(a NUMBER); Table created. SQL> DROP TABLE t1; Table dropped. SQL> SELECT original_name FROM user_recyclebin;

no rows selected There is no need to PURGE. As with anyother underscore parameter, setting this parameter is not recommended unless advised by oracle support services.

Flashback Version Query Using undo data stored in the database, one can now view the changes to one or more rows along with all the metadata of the changes. Flashback version query allows the versions of a specific row to be tracked during a window of time using the VERSIONS BETWEEN clauses: CREATE TABLE flashback_version_query (id NUMBER(10), description VARCHAR2(50)); INSERT INTO flashback_version_query (id, description) VALUES (1, 'Kunal'); COMMIT; SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') FROM v$database; CURRENT_SCN TO_CHAR(SYSTIMESTAM ---------- ------------------725202 2004-03-29 14:59:08 UPDATE flashback_version_query SET description = 'John' WHERE id = 1; COMMIT; UPDATE flashback_version_query SET description = 'Mathew' WHERE id = 1; COMMIT; SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') FROM v$database;

CURRENT_SCN TO_CHAR(SYSTIMESTAM ----------- ------------------725219 2004-03-29 14:59:36

COLUMN versions_startscn FORMAT 99999999999999999 COLUMN versions_starttime FORMAT A24 COLUMN versions_endscn FORMAT 99999999999999999 COLUMN versions_endtime FORMAT A24 COLUMN versions_xid FORMAT A16 COLUMN versions_operation FORMAT A1 COLUMN description FORMAT A11 SET LINESIZE 200 SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, description FROM flashback_version_query VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2004-04-27 15:13:57', 'YYYYMM-DD HH24:MI:SS') AND TO_TIMESTAMP('2004-04-27 15:14:52', 'YYYY-MM-DD HH24:MI:SS') WHERE id = 1; VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID V DESCRIPTION ------------------ ------------------------ ----------------------------------------- ---------------- - ----------8183217632829 27-APR-04 03.14.44 PM 0006001000000250 U Mathew 8183217632826 27-APR-04 03.14.44 PM 8183217632829 27-APR-04 03.14.44 PM 0002000D00001347 U John

8183217632826 27-APR-04 03.14.44 PM Kunal

SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, description FROM flashback_version_query VERSIONS BETWEEN SCN 8183217632826 AND 8183217632829 WHERE id = 1; VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID V DESCRIPTION ------------------ ------------------------ ----------------------------------------- ---------------- - ----------8183217632829 27-APR-04 03.14.44 PM 0006001000000250 U Mathew 8183217632826 27-APR-04 03.14.44 PM 8183217632829 27-APR-04 03.14.44 PM 0002000D00001347 U John 8183217632826 27-APR-04 03.14.44 PM Kunal

The available pseudo columns are: * VERSIONS_STARTSCN or VERSIONS_STARTTIME - Starting SCN and TIMESTAMP when row took on this value. The value of NULL is returned if the row was created before the lower bound SCN or TIMESTAMP. * VERSIONS_ENDSCN or VERSIONS_ENDTIME - Ending SCN and TIMESTAMP when row last contained this value. The value of NULL is returned if the value of the row is still current at the upper bound SCN ot TIMESTAMP. * VERSIONS_XID - ID of the transaction that created the row in it's current state. * VERSIONS_OPERATION - Operation performed by the transaction ((I)nsert, (U)pdate or (D)elete)

Flashback Transaction Query Flashback transaction query can be used to get extra information about the transactions listed by flashback version queries. The VERSIONS_XID column values from a flashback version query can be used to query the FLASHBACK_TRANSACTION_QUERY view like: SQL> SELECT xid, operation, start_scn,commit_scn, logon_user, undo_sql FROM flashback_transaction_query WHERE xid = HEXTORAW('0006001000000250'); 2 3 XID OPERATION START_SCN COMMIT_SCN ---------------- -------------------------------- ---------- ---------LOGON_USER -----------------------------UNDO_SQL ------------------------------------------------------------------------------0006001000000250 UPDATE 8.1832E+12 8.1832E+12 KUNAL update "KUNAL"."FLASHBACK_VERSION_QUERY" set "DESCRIPTION" = 'John' where ROWID = 'AAAOBfAAIAAAAnaAAA';

0006001000000250 BEGIN 8.1832E+12 8.1832E+12 KUNAL

You might also like