#回收站管理

数据库回收站类似于操作系统回收站的机制,用于暂时存储被删除的表、索引等数据库对象。基于回收站,可以在删除数据库对象时避免永久丢失数据,在回收站被清理前随时可以快速高效地恢复误删除对象。

回收站仅适用于HEAP表,删除TAC表、LSC表以及外部表则始终表现为彻底删除。

回收站依附于表空间,回收站开启后,在不指定PURGE关键字删除某个表空间的HEAP表时,系统会将表对象及其数据放入该表空间的回收站中(表名称被修改为BIN开头的系统生成字符串)。

# 开启回收站

回收站的开关由配置参数RECYCLEBIN_ENABLED的取值控制,默认为ON,即开启回收站。

# 注意事项

  • 在配置回收站开关的过程中,不建议并行DROP、TRUNCAKE等删除操作,可能会因回收站开启暂未生效而导致被删除对象直接被彻底清理。

  • 在共享集群部署中,多个实例间不会自动同步该配置但建议配置保持一致,否则仅开启回收站的实例执行删除HEAP表操作时表数据才会进入回收站。如需调整回收站开关需分别连接不同实例执行相应操作。

  • 在高可用部署中,主备之间不会自动同步该配置,且仅以主库(主集群)的配置生效。建议主备库(主备集群)配置保持一致,避免主备切换后引起配置生效结果变化。

# 操作步骤

  1. 以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> 
    
  2. 查看当前配置:

    SHOW PARAMETER RECYCLEBIN_ENABLED;
    
    NAME                                    VALUE
    --------------------------------------- ----------------------------------------
    RECYCLEBIN_ENABLED                      ON
    
    • RECYCLEBIN_ENABLED = ON,表示回收站已开启。

    • RECYCLEBIN_ENABLED = OFF,表示回收站未开启,可执行后续操作将其开启。

  3. 开启回收站,配置立即生效。

    ALTER SYSTEM SET RECYCLEBIN_ENABLED='ON' scope=both;
    
  4. 登录其他实例(或备库),重复上述操作完成相应配置调整,使全局保持一致。

# 管理回收站对象

# 支持的对象

开启回收站后,支持进入回收站的对象为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表操作时表数据才会进入回收站。如需调整回收站开关需分别连接不同实例执行相应操作。

  • 在高可用部署中,主备之间不会自动同步该配置,且仅以主库(主集群)的配置生效。建议主备库(主备集群)配置保持一致,避免主备切换后引起配置生效结果变化。

# 操作步骤

  1. 以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> 
    
  2. 查看当前配置:

    SHOW PARAMETER RECYCLEBIN_ENABLED;
    
    NAME                                    VALUE
    --------------------------------------- ----------------------------------------
    RECYCLEBIN_ENABLED                      ON
    
    • RECYCLEBIN_ENABLED = ON,表示回收站已开启,可执行后续操作将其关闭。

    • RECYCLEBIN_ENABLED = OFF,表示回收站未开启。

  3. 关闭回收站,配置立即生效。

    ALTER SYSTEM SET RECYCLEBIN_ENABLED='OFF'  scope=both;
    
  4. 登录其他实例(或备库),重复上述操作完成相应配置调整,使全局保持一致。

edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流