更新时间:2026-07-28 GMT+08:00
分享

闪回库

背景信息

可以恢复意外删除的库,从库级回收站(database recycle bin)中恢复被删除的库及其关联对象。闪回库DROP是基于回收站机制,通过还原回收站中记录的库的物理文件,实现已DROP库的恢复。

前提条件

  • 开启enable_db_recyclebin参数,启用回收站,参数使用请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 闪回相关参数”章节中的enable_db_recyclebin。
  • dbrecyclebin_retention_time参数用于设置回收站对象的保留时间,超过该时间的回收站对象将被自动清理,参数使用请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 闪回相关参数”章节中的dbrecyclebin_retention_time。
  • dbrecyclebin_maxsize参数用于设置回收站容量,超过容量将不能放入回收站,参数使用请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 闪回相关参数”章节中的dbrecyclebin_maxsize。

规格约束

  • 回收站中的数据库,在没有恢复前需要占用额外的存储空间。
  • 当表空间不足或者达到配置的清理周期时,回收站数据将自动清理,被清理或部分清理的库对象将不能被闪回,当库级回收站和表级回收站同时存在对象时,将优先清理表空间关联的库回收站对象,清理空间将对DML性能产生影响。
  • 回收站中的数据库不支持连接、DQL、DML、DDL、DCL操作。
  • 支持包含Astore、Ustore数据表的数据库场景,不支持Dstore场景。
  • 继承DROP DATABASE的报错场景约束。
  • 不支持PDB闪回。
  • 不支持对M-Compatibility兼容模式库下创建的库进行闪回。
  • 当前DROP DATABASE在事务提交后,文件物理删除之前存在短暂时间窗口,若此时宕机会发生文件残留现象。闪回库在PURGE清理过程原理相同,有低概率发生文件残留现象。
  • 系统库所在表空间的磁盘达到容量阈值,被设置为磁盘只读后,无法进行闪回。

相关语法

  • 删除库放入回收站。
    DROP DATABASE database_name [PURGE]
  • 清理库回收站对象。
    PURGE { DATABASE {database_name}
    | DATABASE RECYCLEBIN
    }
  • 闪回被删除的库。
    TIMECAPSULE DATABASE { database_name } TO BEFORE DROP [RENAME TO new_database_name]

参数说明

  • DROP DATABASE database_name [PURGE]
    • 默认将数据库放入回收站中,使用PURGE直接清理。
  • PURGE DATABASE RECYCLEBIN
    • 表示清理库级回收站对象。
  • TO BEFORE DROP
    使用这个子句检索回收站中已删除的库对象,可以指定原始用户指定的库的名称,或库对象删除时系统生成的名称。
    • 如果指定系统生成名称,那么系统将检索指定的对象(库回收站中系统生成的对象名称是唯一的)。使用“select * from gs_db_recyclebin;”语句查看库回收站中的内容。
    • 如果指定了用户指定的名称,且回收站中包含多个该名称的对象,则系统将检索回收站中最近移动的对象。如果想要检索更早版本的同名库,操作如下:

      • 指定想要检索的库的系统生成名称。

      • 执行TIMECAPSULE DATABASE ... TO BEFORE DROP语句,直到检索到需要检索的库。

    • 回收站库对象不支持连接,不支持DML、DCL、DDL等写操作,不支持DQL查询操作。
    • 开启enable_db_recyclebin参数,启用回收站时,如果数据库为多租PDB对象,不支持放入回收站。
  • RENAME TO

    为从回收站中检索的库指定一个新名称。

语法示例

  • 示例一:开启库级回收站后,删除数据库放入回收站。
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --创建数据库。
    gaussdb=# create database flashback_db;
    CREATE DATABASE
    --删除数据库放入回收站。
    gaussdb=# drop database flashback_db;
    DROP DATABASE
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid |          rcyname          | rcyoriginname | rcyrecyclecsn |        rcyrecycletime         | rcytablespaces | rcydbsize 
    ---------+---------------------------+---------------+---------------+-------------------------------+----------------+-----------
       82520 | BIN$1425867F$2F70DBD0==$0 | flashback_db  |         13908 | 2024-12-11 09:00:07.451273-05 | 1663           |     26272
    (1 row)
  • 示例二:开启库级回收站后,删除数据库不加入回收站。
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --创建数据库。
    gaussdb=# create database flashback_db;
    CREATE DATABASE
    --删除数据库不放入回收站。
    gaussdb=# drop database flashback_db purge;
    DROP DATABASE
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
  • 示例三:开启库级回收站后,闪回回收站中的数据库。
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --创建数据库。
    gaussdb=# create database flashback_db;
    CREATE DATABASE
    --删除数据库放入回收站。
    gaussdb=# drop database flashback_db;
    DROP DATABASE
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid |          rcyname          | rcyoriginname | rcyrecyclecsn |        rcyrecycletime        | rcytablespaces | rcydbsize 
    ---------+---------------------------+---------------+---------------+------------------------------+----------------+-----------
       82523 | BIN$1425B67F$2F7B1738==$0 | flashback_db  |         13916 | 2024-12-11 09:02:35.20606-05 | 1663           |     26272
    (1 row)
    --可通过回收站名闪回drop后的数据库。
    gaussdb=# timecapsule database "BIN$1425B67F$2F7B1738==$0" to before drop;
    TimeCapsule Database
    --可通过原名闪回drop后的数据库。
    gaussdb=# timecapsule database flashback_db to before drop;
    TimeCapsule Database
    --可通过回收站名闪回后重命名。
    gaussdb=# timecapsule database "BIN$1425B67F$2F7B1738==$0" to before drop rename to flashback_db1;
    TimeCapsule Database
    --可通过原名闪回后重命名。
    gaussdb=# timecapsule database flashback_db to before drop rename to flashback_db1;
    TimeCapsule Database
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --查看闪回后的库。
    gaussdb=# select * from pg_database where datname = 'flashback_db';
       datname    | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace 
    | datcompatibility | datacl | datfrozenxid64 | datminmxid | dattimezone | dattype 
    --------------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------
    +------------------+--------+----------------+------------+-------------+---------
     flashback_db |     10 |        7 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         12995 | 0            |          1663 
    | A                |        |          40936 |          2 | PRC         | D
    (1 row)
  • 示例四:清理库回收站中的数据库。
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --创建数据库。
    gaussdb=# create database flashback_db;
    CREATE DATABASE
    --删除数据库放入回收站。
    gaussdb=# drop database flashback_db;
    DROP DATABASE
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid |          rcyname          | rcyoriginname | rcyrecyclecsn |        rcyrecycletime         | rcytablespaces | rcydbsize 
    ---------+---------------------------+---------------+---------------+-------------------------------+----------------+-----------
       82527 | BIN$1425F67F$2F9075F0==$0 | flashback_db  |         13943 | 2024-12-11 09:11:47.673528-05 | 1663           |     26272
    (1 row)
    
    --清理回收站中的数据库。
    gaussdb=# purge database "BIN$1425F67F$2F9075F0==$0";
    PURGE DATABASE
    --查看回收站中的数据库已经被清理。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
  • 示例五:清理库级回收站。
    --查看回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)
    --创建若干数据库。
    gaussdb=# create database flashback_db1;
    CREATE DATABASE
    gaussdb=# create database flashback_db2;
    CREATE DATABASE
    gaussdb=# create database flashback_db3;
    CREATE DATABASE
    --删除数据库放入回收站。
    gaussdb=# drop database flashback_db1;
    DROP DATABASE
    gaussdb=# drop database flashback_db2;
    DROP DATABASE
    gaussdb=# drop database flashback_db3;
    DROP DATABASE
    --查看库级回收站。
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid |          rcyname          | rcyoriginname | rcyrecyclecsn |        rcyrecycletime         | rcytablespaces | rcydbsize 
    ---------+---------------------------+---------------+---------------+-------------------------------+----------------+-----------
       82524 | BIN$1425C67F$2FAD4D88==$0 | flashback_db1 |         13955 | 2024-12-11 09:14:55.763265-05 | 1663           |     26272
       82531 | BIN$1426367F$2FAD59A8==$0 | flashback_db2 |         13956 | 2024-12-11 09:14:57.271674-05 | 1663           |     26272
       82532 | BIN$1426467F$2FAD6530==$0 | flashback_db3 |         13957 | 2024-12-11 09:14:58.37639-05  | 1663           |     26272
    (3 rows)
    --清理回收站。
    gaussdb=# purge database recyclebin;
    PURGE DATABASE RECYCLEBIN
    gaussdb=# select * from gs_db_recyclebin;
     rcydbid | rcyname | rcyoriginname | rcyrecyclecsn | rcyrecycletime | rcytablespaces | rcydbsize 
    ---------+---------+---------------+---------------+----------------+----------------+-----------
    (0 rows)

相关文档