
# TIMECAPSULE TABLE
#### 功能描述
在人为操作或应用程序错误时，使用TIMECAPSULE TABLE语句恢复可将表恢复到一个早期状态。
表可以闪回到过去的时间点，这依赖于系统中保存的旧版本数据。此外GaussDB数据库不能恢复到通过DDL操作改变了表结构的早期状态。
#### 注意事项
- TIMECAPSULE TABLE语句的用法主要分为两大类：闪回旧版本数据和从回收站中闪回。
  - TO TIMECAPSULE和TO CSN能够将表闪回到过去的某个版本。
  
  - 回收站记录了DROP和TRUNCATE的对象数据。TO BEFORE DROP和TO BEFORE TRUNCATE就是从回收站中闪回。
   
- 不支持闪回表的对象类型：系统表、DFS表、全局临时表、本地临时表、UNLOGGED表、序列表、hashbucket表、密态表。
- 不支持含有自定义类型表的闪回。
- 开启闪回后，回收站里的表可以进行表级备份，无法进行表级恢复。
- 闪回点和当前点之间，执行过修改表结构或影响物理存储的语句（DDL、DCL、VACUUM FULL），闪回失败。

- 执行闪回删除需要用户具有如下权限：用户必须具有垃圾对象所在SCHEMA的CREATE和USAGE权限，并且用户必须是SCHEMA的所有者或者是垃圾对象的所有者。 执行闪回TRUNCATE需要用户具有如下权限：用户必须具有垃圾对象所在SCHEMA的CREATE和USAGE权限，并且用户必须是SCHEMA的所有者或者是垃圾对象的所有者，另外用户必须具有垃圾对象的TRUNCATE权限。
  
- 不适用闪回DROP/TRUNCATE功能的场景或表：
  - 回收站关闭场景：enable_recyclebin = off。
  
  - 系统处于维护态（xc_maintenance_mode = on）或升级场景。
  
  - 多对象删除场景：DROP/TRUNCATE TABLE命令同时指定多个对象。
  
  - 系统表、DFS表、全局临时表、本地临时表、UNLOGGED表、序列表、hashbucket表。
  
  - 如果表依赖的对象为外部对象，则采用物理删除，不将表放入回收站。
   
- DROP闪回约束：
  可以指定原始用户指定的表的名称，或对象删除时数据库分配的系统生成名称。
  - 回收站中系统生成的对象名称是唯一的。因此，如果指定系统生成名称，那么数据库检索指定的对象。使用"select \* from gs_recyclebin;"语句查看回收站中的内容。
  
  - 如果指定了用户指定的名称，且回收站中包含多个该名称的对象，那么数据库检索回收站中最近移动的对象。如果需要检索更早版本的表，请按以下步骤执行：
    - 指定需要检索的表的系统生成名称。
      
    
    - 执行TIMECAPSULE TABLE ... TO BEFORE DROP语句，直到找到要检索的表。
      
     
  
  - 恢复DROP表时，只恢复基表名，其他子对象名均保持回收站对象名。用户可根据需要，执行DDL命令手工调整子对象名。
  
  - 如果表存在缺省值引用序列和自定义函数，那么闪回DROP表成功但不会恢复缺省值。
  
  - 如果表存在视图引用，DROP表时需要级联删除视图，那么闪回DROP表成功但不会恢复视图。
  
  - 回收站对象不支持DML、DCL、DDL等写操作，不支持DQL查询操作（后续支持）。
  
  - recyclebin_retention_time配置参数用于设置回收站对象保留时间，超过该时间的回收站对象将被自动清理。
  
  - 不支持DROP多表的恢复。
  
  - 不支持级联删除账号/schema场景的恢复。
  
  - 删除账号/Schema时，若回收站中存在该Schema/账号的对象，普通删除会失败，需要级联删除。
    
- TRUNCATE闪回约束：
  - TRUNCATE闪回后，统计信息无变化，仍显示为0，可以在业务低峰期（以降低性能影响）的时候手动analyze来修正统计信息。
  
  - RENAME TO仅支持DROP闪回操作为检索表指定新名称，不支持TRUNCATE闪回。
  
  - TRUNCATE闪回不能跨越影响表结构或物理存储的语句，否则会报错。即闪回点和当前点之间，如果执行过修改表结构或影响物理存储的语句（DDL、DCL、VACUUM FULL、增加/删除/切割/合成等分区操作），则闪回失败。执行过DDL的表进行闪回操作报错："ERROR：The table definition of %s has been changed. "。涉及namespace、表名改变等操作的DDL执行闪回操作报错："ERROR: recycle object %s desired does not exist. "。
   
 
#### 前提条件
- 开启enable_recyclebin参数，启用回收站，参数使用请联系管理员处理。
- recyclebin_retention_time参数用于设置回收站对象保留时间，超过该时间的回收站对象将被自动清理，参数使用请联系管理员处理。
 
#### 语法格式
```
TIMECAPSULE TABLE [schema.]table_name TO { CSN expr | TIMESTAMP expr | BEFORE { DROP [RENAME TO table_name] | TRUNCATE } }
```
#### 参数说明
- **schema**
  指定模式包含的表。如果缺省，则为当前模式。
  
- **table_name**
  指定表名。
  

- **TO CSN**
  指定要返回表的时间点对应的事务提交序列号（CSN）。expr必须计算一个数字，代表有效的CSN。
  说明：GTM-Free场景各节点使用本地CSN，没有全局统一CSN号，暂不支持使用TO CSN方式进行闪回操作。
  
- **TO TIMESTAMP**
  指定要返回表的时间点对应的时间戳。expr必须计算一个过去有效的时间戳（使用TO_TIMESTAMP函数将字符串转换为时间类型）。表将被闪回到指定时间戳大约3秒内的时间点。
  说明：闪回点过旧时，因旧版本被回收导致无法获取旧版本，会导致闪回失败并报错：Restore point too old。
  
- **TO BEFORE DROP**
  使用这个子句检索回收站中已删除的表及其子对象。
  
- **RENAME TO**
  为从回收站中检索的表指定一个新名称。
  
- **TO BEFORE TRUNCATE**
  闪回到TRUNCATE之前。
  
 
#### 示例
```
-- 创建SCHEMA
gaussdb=# CREATE SCHEMA tpcds;
-- 删除表tpcds.reason_t2
DROP TABLE IF EXISTS tpcds.reason_t2;
-- 创建表tpcds.reason_t2
gaussdb=# CREATE TABLE tpcds.reason_t2
 (
  r_reason_sk    integer,
  r_reason_id    character(16),
  r_reason_desc  character(100)
  )with(storage_type = ustore);
--向表tpcds.reason_t2中插入记录
gaussdb=#  INSERT INTO tpcds.reason_t2 VALUES (1, 'AA', 'reason1'),(2, 'AB', 'reason2'),(3, 'AC', 'reason3');
INSERT 0 3
--清空tpcds.reason_t2表中的数据
gaussdb=#  TRUNCATE TABLE tpcds.reason_t2;
--查询tpcds.reason_t2表中的数据
gaussdb=#  select * from tpcds.reason_t2;
 r_reason_sk | r_reason_id | r_reason_desc 
-------------+-------------+---------------
(0 rows)
--执行闪回TRUNCATE
gaussdb=#  TIMECAPSULE TABLE tpcds.reason_t2 to BEFORE TRUNCATE;
gaussdb=#  select * from tpcds.reason_t2;
 r_reason_sk |   r_reason_id    |                                            r_reason_desc                                             
-------------+------------------+------------------------------------------------------------------------------------------------------
           1 | AA               | reason1                                                                                             
           2 | AB               | reason2                                                                                             
           3 | AC               | reason3                                                                                             
(3 rows)
--删除表tpcds.reason_t2
gaussdb=#  DROP TABLE tpcds.reason_t2;
--执行闪回DROP
gaussdb=#  TIMECAPSULE TABLE tpcds.reason_t2 to BEFORE DROP;
TimeCapsule Table
--执行闪回DROP，为检索表指定新名称
gaussdb=#  TIMECAPSULE TABLE tpcds.reason_t2 TO BEFORE DROP rename to reason_t3;
TimeCapsule Table
-- 清空回收站，删除SCHEMA
gaussdb=# PURGE RECYCLEBIN;
gaussdb=# DROP SCHEMA tpcds CASCADE;
```
