ITPub博客

首页 > 数据库 > > 利用undo表空间的保留特性,闪回表 语法:flashback table

利用undo表空间的保留特性,闪回表 语法:flashback table

作者:GaussDB_数据库 时间:2020-03-09 13:34:28 0 删除 编辑

功能描述

在人为操作或应用程序错误时,使用FLASHBACK TABLE语句恢复表到一个早期状态。

表可以闪回到过去的时间点,这依赖于系统中撤销数据的数据量。此外,GaussDB 100数据库不能恢复到通过任何DDL操作改变了表结构的早期状态。

注意事项

  • 执行该语句的用户需要有FLASHBACK权限;如果是其他用户下的表,需要FLASH ANY TABLE权限。

  • FLASHBACK TABLE语句的用法主要分成两大类:从撤销数据中闪回和从回收站中闪回。

    • 撤销数据中记录了新增、更新的数据对象。TO SCN expr和TO TIMESTAMP expr是从撤销数据中闪回。

    • 回收站记录了DROP的对象数据。TO BEFORE DROP语句就是从回收站中闪回。

  • GaussDB 100默认不强制转换日期类型,需要通过函数显式转化。

  • 数据库重启回滚期间不支持该操作。

语法格式

FLASHBACK TABLE [ schema_name. ]table_name TO { SCN expr |  TIMESTAMP expr | BEFORE { DROP [ RENAME TO table_name ] |  TRUNCATE  FORCE  } }

参数说明

  • schema_name

    指定模式包含的表。如果缺省,则为当前模式。

  • table_name

    指定一个或多个表名称。

    闪回表受以下限制:

    • 升级、移动、截取表(truncate)。

    • 增加表约束、增加表;删除或修改列;更改列的加密密钥。

    • 增加、删除、合并、分离、联合、截取分区或子分区(除了增加范围分区)。

    • 对于这些对象类型闪回表操作是无效的:物化视图、系统表、外部表、独立分区表和子分区表。

    • 以下DDL操作改变了表的结构,所以不能接着使用TO SCN或TO TIMESTAMP闪回到操作之前的时间点:

  • TO SCN

    指定你要返回表的时间点对应的系统改变号(SCN)。expr必须计算一个数字,代表有效的SCN。

  • expr

    一个有效的scn号。

  • TO TIMESTAMP

    指定你要返回表的时间点对应的时间戳。expr 必须计算一个过去有效的时间戳(使用TO_TIMESTAMP函数将字符串转换为时间类型)。表将被闪回到指定时间戳大约3秒内的时间点。

    说明:回退时间应该小于建表时间,否则会报错。

  • TO BEFORE DROP

    使用这个子句检索回收站中已删除的表,及其可能依赖的对象。该表必须是驻留在本地管理表空间,而不是其他系统表空间。

    你可以指定原始用户指定的表的名称,或对象删除时数据库分配的系统生成名称。

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

    • 执行FLASHBACK TABLE ... TO BEFORE DROP语句,直到你要检索表。

    • 如果指定了用户指定的名称,且如果回收站中包含多个该名称的对象,然后数据库检索回收站中最近移动的对象。如果想要检索更早版本的表,你可以这样做:

    • 回收站中系统生成的对象名称是唯一的。因此,如果指定系统生成名称,那么数据库检索指定的对象。使用“select * from SYS_RECYCLEBIN;”语句查看回收站中的内容。

  • RENAME TO

    为从回收站正在检索的表,指定一个新的名称。

  • TRUNCATE FORCE

    闪回到TRUNCATE之前。

示例

--创建表空间human_bonus。
CREATE TABLESPACE human_bonus DATAFILE 'bonus2018' SIZE 32M;
--删除表bonus_2018。
DROP TABLE IF EXISTS bonus_2018;
--创建表bonus_2018。
CREATE TABLE bonus_2018(staff_id INT NOT NULL, staff_name CHAR(50), job VARCHAR(30), bonus NUMBER) TABLESPACE human_bonus;
--向表bonus_2018中insert记录1。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(20,'LIMING','developer',5000);
--向表bonus_2018中insert记录2。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(21,'LIYU','tester',7000);
--向表bonus_2018中insert记录3。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(22,'WANGQIMING','developer',8000);
--提交事务。
COMMIT;
--删除表bonus_2018的数据。
TRUNCATE TABLE bonus_2018;
--闪回表到前一分钟(执行闪回命令时间距离创建表时间需大于1分钟,否则会报错)。
FLASHBACK TABLE bonus_2018 TO BEFORE TRUNCATE FORCE;
--查询表bonus_2018中的数据。
SELECT * FROM bonus_2018;
--删除表bonus_2018。
DROP TABLE IF EXISTS bonus_2018;
--查询表bonus_2018中的数据。
SELECT * FROM bonus_2018;
--闪回表到DROP操作之前。
FLASHBACK TABLE bonus_2018 TO BEFORE DROP;
--查询表bonus_2018中的数据。
SELECT * FROM bonus_2018;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3149911/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19347