
# 闪回库
#### 背景信息
可以恢复意外删除的库，从库级回收站（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)
  ```
  
 
