回收站
📄字数 4.3K
👁️阅读量 加载中...
回收站是所有被删除表以及表的相关依赖对象的一个逻辑存储容器。回收站提供了一种安全的数据恢复机制,当表对象被意外删除时,可以通过回收站的表对象进行查找,并单独将此对象恢复到原始状态,从而无需通过恢复数据库或从备份中进行恢复等复杂操作,这会使得数据库的管理和维护更加方便简单。
一、控制回收站
回收站默认关闭,使用该功能时可通过 enable_recycle
参数开启,该参数为全局参数且立即生效,不同用户设置后所有用户都可以感知。
1.1 查看是否开启回收站
1.1.1 语法格式
1.1.2 参数说明
enable_recycle
:控制是否开启回收站(T为开启/F为关闭)
1.1.3 示例
- 示例1
回收站功能关闭状态
sql
SQL> SHOW enable_recycle;
+----------------+
| ENABLE_RECYCLE |
+----------------+
| F |
+----------------+
1.2 开启回收站
1.2.1 语法格式
回收站可以通过此语法开启(立即生效),或者在启动数据库时将xugu.ini中的enable_recycle参数设置为true(默认为false)也可以开启。
1.2.2 示例
- 示例1
开启回收站。
sql
SQL> SET enable_recycle ON;
SQL> SHOW enable_recycle;
+----------------+
| ENABLE_RECYCLE |
+----------------+
| T |
+----------------+
1.3 关闭回收站
1.3.1 语法格式
回收站可以通过此语法关闭(立即生效),或者在启动数据库时将xugu.ini中的enable_recycle参数设置为false也可以关闭。
1.3.2 示例
- 示例1
关闭回收站。
sql
SQL> SET enable_recycle OFF;
SQL> SHOW enable_recycle;
+----------------+
| ENABLE_RECYCLE |
+----------------+
| F |
+----------------+
二、 删表是否进入回收站
2.1 语法格式
和删除表语法一致。
2.2 参数说明
IF EXISTS
:表不存在时,使用IF EXISTS
会打印警告信息,不报错;不使用IF EXISTS
会报错处理。sche_name
:模式名,模式名可不写,默认当前模式。tab_name
:表名。CASCADE|RESTRICT
:表对象存在依赖是否强制删除。CASCADE强制删除,RESTRICT报错(默认报错)。PURGE
:是否进入回收站,不写PURGE则进入回收站,写PURGE则直接删除。
2.3 删表进入回收站
表会被逻辑删除,将表对象以及表相依赖的非外键约束、索引、触发器放入回收站。
- 示例1
sql
SQL> CREATE TABLE tab_recyc(a INT,b VARCHAR,c INT,CONSTRAINT pk_table1 PRIMARY KEY(a));
SQL> DROP TABLE tab_recyc;
注意
外键约束会直接删除,不进入回收站。
2.4 删表不进入回收站
表会被实际删除,以及和表相依赖的索引、约束、触发器、同义词全部删除。
- 示例1
sql
SQL> CREATE TABLE tab_recyc2(a INT,b VARCHAR,c INT,CONSTRAINT pk_table1 PRIMARY KEY(a));
SQL> DROP TABLE tab_recyc2 PURGE;
三、 查询回收站
当前可通过以下方式查询回收站对象:系统表SYS_RECYCLEBIN,系统视图 USER_RECYCLEBIN、以及USER_RECYCLEBIN
的公共同义词RECYCLEBIN
。
回收站中的对象名称由"BIN$"做为前缀。回收站中的约束对象是通过系统表SYS_CONSTRAINTS和系统视图DBA_CONSTRAINTS、USER_CONSTRAINTS、ALL_CONSTRAINTS进行查询。
3.1 系统表
3.1.1 SYS_RECYCLEBIN
用于记录所有库中被删除对象的信息(如表、分区、索引、索引分区、触发器),存储其定义和删除时间,不包含实际数据。字段详细含义请参见 系统表章节。
- 示例1
sql
SQL> SELECT * FROM SYS_RECYCLEBIN;
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| DB_ID | USER_ID | OBJECT_ID | RELATEDOBJ_ID | OBJECT_TYPE | OBJECT_TYPE_NAME | SCHEMA_ID | OBJECT_NAME | RECYCLE_NAME | DROPED_TIME | CAN_UNDROP | CAN_PURGE | RESERVED1 |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| 1 | 1 | 1048606 | 1048606 | 5 | Table | 1 | TAB_RECYC | BIN$0800000007 | 2025-06-17 15:53:40.218 | YES | YES | <NULL> |
| 1 | 1 | 1048607 | 1048606 | 10 | Index | 1 | PK_IDX_S1786217501755531 | BIN$0E00000000 | 2025-06-17 15:53:40.218 | NO | YES | <NULL> |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
3.2 系统视图
3.2.1 DBA_RECYCLEBIN
查询当前库下所有用户的所有回收站对象,字段详细含义请参见系统视图章节。
- 示例1
sql
SQL> SELECT * FROM DBA_RECYCLEBIN;
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| DB_ID | USER_ID | OBJECT_ID | RELATEDOBJ_ID | OBJECT_TYPE | OBJECT_TYPE_NAME | SCHEMA_ID | OBJECT_NAME | RECYCLE_NAME | DROPED_TIME | CAN_UNDROP | CAN_PURGE | RESERVED1 |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| 1 | 1 | 1048606 | 1048606 | 5 | Table | 1 | TAB_RECYC | BIN$0800000007 | 2025-06-17 15:53:40.218 | YES | YES | <NULL> |
| 1 | 1 | 1048607 | 1048606 | 10 | Index | 1 | PK_IDX_S1786217501755531 | BIN$0E00000000 | 2025-06-17 15:53:40.218 | NO | YES | <NULL> |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
3.2.2 USER_RECYCLEBIN
查询当前用户的所有回收站对象,字段详细含义请参见 系统视图章节。
- 示例1
sql
SQL> SELECT * FROM USER_RECYCLEBIN;
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| DB_ID | USER_ID | OBJECT_ID | RELATEDOBJ_ID | OBJECT_TYPE | OBJECT_TYPE_NAME | SCHEMA_ID | OBJECT_NAME | RECYCLE_NAME | DROPED_TIME | CAN_UNDROP | CAN_PURGE | RESERVED1 |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| 1 | 1 | 1048606 | 1048606 | 5 | Table | 1 | TAB_RECYC | BIN$0800000007 | 2025-06-17 15:53:40.218 | YES | YES | <NULL> |
| 1 | 1 | 1048607 | 1048606 | 10 | Index | 1 | PK_IDX_S1786217501755531 | BIN$0E00000000 | 2025-06-17 15:53:40.218 | NO | YES | <NULL> |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
3.3 公共同义词
3.3.1 RECYCLEBIN
查询当前用户下回收站信息,USER_RECYCLEBIN的公共同义词。
- 示例1
sql
SQL> SELECT * FROM RECYCLEBIN;
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| DB_ID | USER_ID | OBJECT_ID | RELATEDOBJ_ID | OBJECT_TYPE | OBJECT_TYPE_NAME | SCHEMA_ID | OBJECT_NAME | RECYCLE_NAME | DROPED_TIME | CAN_UNDROP | CAN_PURGE | RESERVED1 |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
| 1 | 1 | 1048606 | 1048606 | 5 | Table | 1 | TAB_RECYC | BIN$0800000007 | 2025-06-17 15:53:40.218 | YES | YES | <NULL> |
| 1 | 1 | 1048607 | 1048606 | 10 | Index | 1 | PK_IDX_S1786217501755531 | BIN$0E00000000 | 2025-06-17 15:53:40.218 | NO | YES | <NULL> |
+-------+---------+-----------+---------------+-------------+------------------+-----------+--------------------------+----------------+--------------------------+------------+-----------+-----------+
四、操作回收站表对象
当前仅支持通过回收站表名进行SELECT,其余DML/DDL操作均不支持。
- 示例1
sql
SQL> SELECT * FROM "BIN$0800000007";
+---+----+---+
| A | B | C |
+---+----+---+
| 1 | aa | 1 |
五、恢复表
指定表名或回收站表名将其恢复到原始状态,若指定的表名在回收站中存在同名,则恢复的是最迟进入回收站的表对象。并且为了避免恢复后重名报错,也可以在恢复时进行重命名。非外键约束进入回收站后,当恢复表时,约束会自动恢复。
5.1 语法格式
5.2 参数说明
tab_name
:原表名或回收站中的表名。new_name
:恢复时对表名重命名。
5.3 示例
- 示例1
根据原表名恢复。
sql
SQL> FLASHBACK TABLE tab_recyc TO BEFORE DROP;
SQL> SELECT * FROM tab_recyc;
+---+----+---+
| A | B | C |
+---+----+---+
| 1 | aa | 1 |
+---+----+---+
六、清理回收站
回收站是逻辑存储容器,依赖于原有表所占空间。如果不对回收站进行清除操作,回收站中的表对象会一直存在,导致空间一直被占用。所以回收站提供PURGE命令来清除回收站对象,以及原有的DROP数据库/用户/模式也会清除回收站对象,从而释放空间。
6.1 清理表
清理表时与此表相关的索引,触发器也同时清理。若是存在同名表,则清理最早进入回收站的。
6.1.1 语法格式
6.1.2 参数说明
old_tab_name
:进入回收站前的原表名。recycle_tab_name
:回收站中的唯一表名,BIN$
为前缀。
6.1.3 示例
- 示例1
使用进入回收站前的原表名清理。
sql
SQL> PURGE TABLE tab_recyc;
6.2 清理索引
若是存在同名表的同名索引,则清理最早进入回收站的。不支持单独清理主键索引,只能跟随表的清理而清理。
6.2.1 语法格式
6.2.2 参数说明
old_tab_name
:进入回收站前的原表名。old_idx_name
:进入回收站前的原索引名。recycle_tab_name
:回收站中的唯一表名,BIN$
为前缀。recycle_idx_name
:回收站中的唯一索引名,BIN$
为前缀。
6.2.3 示例
- 示例1
清理普通索引
sql
SQL> PURGE INDEX tab_recyc.idx1;
- 示例2
清理主键索引
sql
SQL> PURGE INDEX BIN$0800000007.BIN$0E00000000;
Error: [E12015] 不允许删除主键索引BIN$0E00000000
6.3 当前用户的所有对象
6.3.1 语法格式
- 示例1
sql
SQL> PURGE RECYCLEBIN;
6.4 当前库下所有用户的所有对象
6.4.1 语法格式
当前用户需要DBA权限。
- 示例1
sql
SQL> PURGE DBA_RECYCLEBIN;
6.5 删除库,用户,模式
删除库、用户、模式时,回收站中若存在该库、用户、模式的所属对象,也会将回收站中的对象删除。