暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T FLASHBACK TABLE

原创 云和恩墨-陈毅斌 2019-10-27
953

FLASHBACK TABLE

功能描述:
在人为操作或应用程序错误时,使用FLASHBACK TABLE语句恢复表到一个早期状态。
表可以闪回到过去的时间点,这依赖于系统中撤销数据的数据量。此外,GaussDB 100数据库不能恢复到通过任何DDL操作改变了表结构的早期状态。

注意事项:
(1)执行该语句的用户需要有FLASHBACK权限;如果是其他用户下的表,需要FLASH ANY TABLE权限。
(2)FLASHBACK TABLE语句的用法主要分成两大类:从撤销数据中闪回和从回收站中闪回。
1)撤销数据中记录了新增、更新的数据对象。TO SCN expr和TO TIMESTAMP expr是从撤销数据中闪回。
2)回收站记录了DROP的对象数据。TO BEFORE DROP语句就是从回收站中闪回。
(3)GaussDB 100默认不强制转换日期类型,需要通过函数显式转化。
(4)数据库重启回滚期间不支持该操作。

语法格式:
FLASHBACK TABLE [ schema_name. ]table_name TO { SCN expr | TIMESTAMP expr | BEFORE { DROP [ RENAME TO table_name ] | TRUNCATE FORCE } }

参数说明:
schema_name
指定模式包含的表。如果缺省,则为当前模式。

table_name
指定一个或多个表名称。
闪回表受以下限制:
(1)对于这些对象类型闪回表操作是无效的:物化视图、系统表、外部表、独立分区表和子分区表。
(2)以下DDL操作改变了表的结构,所以不能接着使用TO SCN或TO TIMESTAMP闪回到操作之前的时间点:
1)升级、移动、截取表(truncate)。
2)增加表约束、增加表;删除或修改列;更改列的加密密钥。
3)增加、删除、合并、分离、联合、截取分区或子分区(除了增加范围分区)。

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

expr
一个有效的scn号。

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

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

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

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

回收站中系统生成的对象名称是唯一的。因此,如果指定系统生成名称,那么数据库检索指定的对象。使用“select * from SYS_RECYCLEBIN;”语句查看回收站中的内容。
如果指定了用户指定的名称,且如果回收站中包含多个该名称的对象,然后数据库检索回收站中最近移动的对象。如果想要检索更早版本的表,你可以这样做:
指定你想要检索的表的系统生成名称。
执行FLASHBACK TABLE … TO BEFORE DROP语句,直到你要检索表。

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中插入记录1。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(20,‘LIMING’,‘developer’,5000);
–向表bonus_2018中插入记录2。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(21,‘LIYU’,‘tester’,7000);
–向表bonus_2018中插入记录3。
INSERT INTO bonus_2018(staff_id, staff_name, job, bonus) VALUES(22,‘WANGQIMING’,‘developer’,8000);
–提交事务。
COMMIT;
–删除表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;

SQL> create table test as select * from dv_database;

Succeed.

SQL>
SQL> select count(*) from test;

count(*)

1

1 rows fetched.

SQL>
SQL> truncate table test;

Succeed.

SQL>
SQL>
SQL> select count(*) from test;

COUNT(*)

0

1 rows fetched.

SQL> FLASHBACK TABLE test to before truncate force;

Succeed.

SQL>
SQL>
SQL> select count(*) from test;

COUNT(*)

1

1 rows fetched.

SQL>
SQL> FLASHBACK TABLE TEST TO TIMESTAMP SYSTIMESTAMP-1/1440;
–闪回表到前一分钟(执行闪回命令时间距离创建表时间需大于1分钟,否则会报错)。

最后修改时间:2019-10-28 00:03:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论