#回收站管理
数据库回收站类似于操作系统回收站的机制,用于暂时存储被删除的表、索引等数据库对象。基于回收站,可以在删除数据库对象时避免永久丢失数据,在回收站被清理前随时可以快速高效地恢复误删除对象。
回收站仅适用于HEAP表,删除TAC表、LSC表以及外部表则始终表现为彻底删除。
回收站依附于表空间,回收站开启后,在不指定PURGE关键字删除某个表空间的HEAP表时,系统会将表对象及其数据放入该表空间的回收站中(表名称被修改为BIN开头的系统生成字符串)。
# 开启回收站
回收站的开关由配置参数RECYCLEBIN_ENABLED的取值控制,默认为ON,即开启回收站。
# 注意事项
在配置回收站开关的过程中,不建议并行DROP、TRUNCAKE等删除操作,可能会因回收站开启暂未生效而导致被删除对象直接被彻底清理。
在共享集群部署中,多个实例间不会自动同步该配置但建议配置保持一致,否则仅开启回收站的实例执行删除HEAP表操作时表数据才会进入回收站。如需调整回收站开关需分别连接不同实例执行相应操作。
在高可用部署中,主备之间不会自动同步该配置,且仅以主库(主集群)的配置生效。建议主备库(主备集群)配置保持一致,避免主备切换后引起配置生效结果变化。
# 操作步骤
以DBA用户连接并登录数据库。
$ yasql sales/********@192.168.1.2:1688 YashanDB SQL Enterprise Edition Release {version_number} x86_64 Connected to: YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux SQL>查看当前配置:
SHOW PARAMETER RECYCLEBIN_ENABLED; NAME VALUE --------------------------------------- ---------------------------------------- RECYCLEBIN_ENABLED ONRECYCLEBIN_ENABLED = ON,表示回收站已开启。
RECYCLEBIN_ENABLED = OFF,表示回收站未开启,可执行后续操作将其开启。
开启回收站,配置立即生效。
ALTER SYSTEM SET RECYCLEBIN_ENABLED='ON' scope=both;登录其他实例(或备库),重复上述操作完成相应配置调整,使全局保持一致。
# 管理回收站对象
# 支持的对象
开启回收站后,支持进入回收站的对象为HEAP表、表上的部分子对象及其数据。
对象或数据的删除操作及其具体表现如下表所示。
| 目标对象 | 操作 | 表现 |
|---|---|---|
| SYSTEM表空间中的HEAP表及其子对象 | - | 始终不进入回收站。 |
| 其他表空间中的HEAP表 | DROP TABLE(未指定PURGE) | 目标表及其分区、索引、基于该表的触发器均进入回收站。 |
| TRUNCATE TABLE | 目标表及其分区、索引、基于该表的触发器均进入回收站。 | |
| ALTER TABLE TRUNCATE PARTITION | 若目标分区位于SYSTEM表空间,不进入回收站。 若目标分区位于其他表空间,进入回收站。 |
Note:
使用DROP语句删除某个HEAP表的子对象(例如索引、触发器等),该子对象不会进入回收站。
若执行上述操作时,表空间已满或临近满容量,目标对象及其数据即使进入回收站,也可能很快就会被清理。
# 查看回收站中的对象
通过DBA_RECYCLEBIN视图(或对应的USER_RECYCLEBIN、ALL_RECYCLEBIN视图)可以查看回收站中的对象。
-- 查看回收站中的所有对象
SELECT OWNER,OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE FROM DBA_RECYCLEBIN;
OWNER OBJECT_NAME ORIGINAL_NAME OPERATION TYPE
------------------------- ------------------------- ------------------------- ------------------------- ------------------
SYS BIN$3042 EMPLOYEE_INFO DROP TABLE
SALES BIN$3031 FINANCE_INFO DROP TABLE
SALES BIN$3032 IDX_FINANCE_INFO_1 DROP INDEX
-- 查询各表空间回收站数据所占总容量(block数)
SELECT ts_name, SUM(block_count) AS total_recyclebin_blocks FROM DBA_RECYCLEBIN GROUP BY ts_name;
TS_NAME TOTAL_RECYCLEBIN_BLOCKS
---------------------------------------------------------------- -----------------------
USERS 16
# 恢复回收站中的对象
使用FLASHBACK语句可以恢复回收站中的表/表分区,具体操作请查阅表闪回。
闪回表/表分区时,数据恢复规则如下:
若待恢复对象为被DROP的表,需确认原表名是否被占用,若被占用则需在闪回的同时进行重命名,否则会报错。
若待恢复对象已执行过多次DROP操作,每一次FLASHBACK只会逆序恢复一次DROP的数据,即首次FLASHBACK只恢复最后1次DROP操作。若前1次FLASHBACK恢复时未重命名(占用原表名),则后续FLASHBACK时则无法再继续使用原名称恢复。
若待恢复对象已执行过多次TRUNCATE操作,每一次FLASHBACK只会逆序恢复一次TRUNCATE的数据,即首次FLASHBACK只恢复最后1次TRUNCATE操作。
各类对象始终遵循从属关系:
无法单独恢复通过TRUNCATE整个表进入回收站的分区,无法单独恢复通过TRUNCATE一级分区进入回收站的二级分区。
无法单独恢复子对象(索引、触发器等),在恢复表/分区时,会自动恢复未被清理的相关子对象。
-- 闪回恢复finance_info表(保持原名)
FLASHBACK TABLE finance_info TO BEFORE DROP;
-- 或
FLASHBACK TABLE BIN$3031 TO BEFORE DROP;
-- 闪回恢复employees表并重命名为employees_recycle
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_recycle;
-- 闪回恢复表数据
FLASHBACK TABLE product TO BEFORE TRUNCATE;
# 清理回收站
回收站中的对象,实际仍存储于其原本所在的表空间,仍占用存储空间,备份时仍会备份回收站中的数据。这些数据可以等待数据库的自动清理机制自行处理,也可以按需手动执行PURGE语句进行清理,例如:
在确定回收站对象及相关数据无需再使用后,及时/定期进行手动清理释放空间。
在执行数据库/表空间备份之前,先检查回收站对象并清理不必要数据,减少待备份的数据量。
Caution:
被清理过的对象或子对象将无法再闪回恢复,例如清理了某个表的索引后再恢复该表,仅可以恢复表和其他子对象,无法恢复该索引。
清理表时会同时将其子对象一并清理。
# 自动清理
当某个表空间分配不出空闲空间时,数据库会尝试清理该表空间内的回收站对象,以腾出更多空闲位置。
# 手动清理
使用PURGE语句可以清理回收站:
清理回收站中的具体某个对象,例如表或索引
可以通过原对象名(ORIGINAL_NAME字段)指定,若同名对象(ORIGINAL_NAME字段)多次进入回收站(会生成不同的OBJECT_NAME字段),则每次清理操作只会逆序清理一次进入回收站的数据。
SELECT OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,RECYCLEBIN_TIME FROM DBA_RECYCLEBIN; OBJECT_NAME ORIGINAL_NAME OPERATION TYPE RECYCLEBIN_TIME ---------------------------------------------------------------- ---------------------------------------------------------------- ------------------------- ----------------------------------------- ----------------------------------------- BIN$3132 FINANCE_INFO DROP TABLE 2025-09-02:15:59:03 BIN$3133 IDX_FINANCE_INFO_1 DROP INDEX 2025-09-02:15:59:03 BIN$3134 FINANCE_INFO DROP TABLE 2025-09-02:16:01:33 BIN$3135 IDX_FINANCE_INFO_1 DROP INDEX 2025-09-02:16:01:33 -- 基于ORIGINAL_NAME清理索引 PURGE INDEX IDX_FINANCE_INFO_1; -- 基于ORIGINAL_NAME清理表 PURGE TABLE FINANCE_INFO; SELECT OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,RECYCLEBIN_TIME FROM DBA_RECYCLEBIN; OBJECT_NAME ORIGINAL_NAME OPERATION TYPE RECYCLEBIN_TIME ---------------------------------------------------------------- ---------------------------------------------------------------- ------------------------- ----------------------------------------- ----------------------------------------- BIN$3134 FINANCE_INFO DROP TABLE 2025-09-02:16:01:33 BIN$3135 IDX_FINANCE_INFO_1 DROP INDEX 2025-09-02:16:01:33可以通过进入回收站时系统生成的BIN开头对象名(OBJECT_NAME字段)指定。
-- 基于OBJECT_NAME清理索引 PURGE INDEX BIN$3135; SELECT OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,RECYCLEBIN_TIME FROM DBA_RECYCLEBIN; OBJECT_NAME ORIGINAL_NAME OPERATION TYPE RECYCLEBIN_TIME ---------------------------------------------------------------- ---------------------------------------------------------------- ------------------------- ----------------------------------------- ----------------------------------------- BIN$3134 FINANCE_INFO DROP TABLE 2025-09-02:16:01:33
清理某个表空间的回收站中具体某个用户的所有对象
PURGE TABLESPACE yashan sales;清空某个表空间的回收站
PURGE TABLESPACE yashan;清空当前数据库中所有回收站
PURGE DBA_RECYCLEBIN;
# 关闭回收站
关闭回收站后,删除HEAP表时将直接丢弃相应数据、释放所占数据空间。
# 注意事项
在共享集群部署中,多个实例间不会自动同步该配置但建议配置保持一致,否则仅开启回收站的实例执行删除HEAP表操作时表数据才会进入回收站。如需调整回收站开关需分别连接不同实例执行相应操作。
在高可用部署中,主备之间不会自动同步该配置,且仅以主库(主集群)的配置生效。建议主备库(主备集群)配置保持一致,避免主备切换后引起配置生效结果变化。
# 操作步骤
以DBA用户连接并登录数据库。
$ yasql sales/********@192.168.1.2:1688 YashanDB SQL Enterprise Edition Release {version_number} x86_64 Connected to: YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux SQL>查看当前配置:
SHOW PARAMETER RECYCLEBIN_ENABLED; NAME VALUE --------------------------------------- ---------------------------------------- RECYCLEBIN_ENABLED ONRECYCLEBIN_ENABLED = ON,表示回收站已开启,可执行后续操作将其关闭。
RECYCLEBIN_ENABLED = OFF,表示回收站未开启。
关闭回收站,配置立即生效。
ALTER SYSTEM SET RECYCLEBIN_ENABLED='OFF' scope=both;登录其他实例(或备库),重复上述操作完成相应配置调整,使全局保持一致。

