如何恢复被truncate掉的表?

举报
小麦苗DB宝 发表于 2022/02/18 14:18:48 2022/02/18
【摘要】 恢复的方法很多,但是还是需要根据具体情况来实施,例如常见的备份恢复,导出导入,日志挖掘,闪回等等。 Oracle可以参考 【DB宝73】Oracle中使用包FY_Recover_Data.pck来恢复truncate误操作的表:https://www.xmmup.com/oraclezhongshiyongbaofy_recover_data-pcklaihuifutruncatewucao...

恢复的方法很多,但是还是需要根据具体情况来实施,例如常见的备份恢复,导出导入,日志挖掘,闪回等等。

Oracle

可以参考 【DB宝73】Oracle中使用包FY_Recover_Data.pck来恢复truncate误操作的表:https://www.xmmup.com/oraclezhongshiyongbaofy_recover_data-pcklaihuifutruncatewucaozuodebiao.html

MySQL

可以参考:https://www.xmmup.com/dbbao43mysqlwucaozuoshanhuihuifuliqizhimy2sql.html

原理:挖掘之前的原始Redo日志,生成原始SQL。

PostgreSQL

可以根据场景选择不同的方法,参考:

原理:挖掘之前的原始Redo日志,生成原始SQL。

TiDB

参考:https://www.xmmup.com/tidbhuifubeiwushanchudeshujuhuobiao.html#wbp-cbm

OceanBase

参考:https://www.oceanbase.com/docs/oceanbase-database/oceanbase-database/V3.2.1/flashback-query

Oracle 提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。OceanBase 数据库在 V2.x.x 版本后也支持了该功能,且同时支持 MySQL 和 Oracle 两种模式下的查询,Oracle 模式从 V2.2.30 版本开始支持,MySQL 模式从 V2.2.71 版本开始支持,二者语法有些区别。

Oracle 模式支持 SCN(System Change Number)和 TIMESTAMP 两种维度的查询,MySQL 模式支持 SNAPSHOT 维度的查询,在 OceanBase 数据库中,SCNSNAPSHOT 都是指事务版本号,只是因为 Oracle 和 MySQL 中概念不同,起了不同的名字。

OB的闪回支持3种类型:

FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO database_name];

FLASHBACK TABLE object_name TO BEFORE DROP [RENAME to table_factor];

FLASHBACK INDEX object_name TO BEFORE DROP;

关于闪回查询

闪回查询(Flashback Query)是 OceanBase 数据库提供的一种可以查看记录某个历史版本数据的能力。默认的查询 SQL 返回的是当前事务隔离级别下允许查询的已提交的版本数据,如果要查询历史上提交的版本,可以在表后指定历史时间信息。

示例:闪回查询历史记录

obclient> create table t1 (id number not null primary key, name varchar2(50) not null, gmt_create timestamp default CURRENT_TIMESTAMP );
Query OK, 0 rows affected (0.06 sec)

obclient> create sequence seq_t1 start with 1;
Query OK, 0 rows affected (0.02 sec)

obclient> insert into t1 (id, name) values(seq_t1.nextval, 'A');commit;
Query OK, 1 row affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

obclient> insert into t1 (id, name) values(seq_t1.nextval, 'B');commit;
Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

obclient> insert into t1 (id, name) values(seq_t1.nextval, 'C');commit;
Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

obclient> insert into t1 (id, name) values(seq_t1.nextval, 'D');commit;
Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

obclient> select * from t1;
+----+------+---------------------+
| ID | NAME | GMT_CREATE          |
+----+------+---------------------+
|  1 | A    | 2020-04-02 17:41:51 |
|  2 | B    | 2020-04-02 17:41:57 |
|  3 | C    | 2020-04-02 17:42:04 |
|  4 | D    | 2020-04-02 17:42:10 |
+----+------+---------------------+
4 rows in set (0.00 sec)

obclient> select * from t1 as of timestamp to_timestamp('2020-04-02 17:41:57','YYYY-MM-DD HH24:MI:SS');
+----+------+---------------------+
| ID | NAME | GMT_CREATE          |
+----+------+---------------------+
|  1 | A    | 2020-04-02 17:41:51 |
|  2 | B    | 2020-04-02 17:41:57 |
+----+------+---------------------+
2 rows in set (0.00 sec)

闪回查询对能查询的最早时间有个限制,受变量 undo_retention 控制。如果 undo_retention 未设置或设置为 0,则可以查询集群上次 major freeze 之后最后一次 minor freeze 之后的历史数据。变量 undo_retention 的修改需要有租户的管理员权限,通过 set global 命令修改,并且只对修改之后的会话产生的数据生效。

obclient> show variables like 'undo_retention';
+----------------+-------+
| VARIABLE_NAME  | VALUE |
+----------------+-------+
| undo_retention | 0     |
+----------------+-------+
1 row in set (0.00 sec)

当集群发生 minor freeze 事件后,再查询这个历史时间点数据,会报错。

obclient> select * from t1 as of timestamp to_timestamp('2020-04-02 17:41:57','YYYY-MM-DD HH24:MI:SS');
ORA-08186: invalid timestamp

限制

闪回查询的使用限制如下:

  • 可以闪回查询的最近一小段时间与 undo_retention 变量的设置有关,该参数的默认为值 0,单位为秒。假如 t1 时间点设置为了保留时间,且 t2 = t1 + 900s,那么 t2 时间点可以查询 [t1,t2] 区间内的数据,参数设置后对之前的数据不起作用,对之后的数据才起作用。

    以下语句展示了如何设置 undo_retention 变量:

    obclient> SET GLOBAL undo_retention=900;
    
  • OceanBase 数据库的 SCN 可以通过视图 v$ob_timestamp_service 获取,在系统租户下查询时会展示所有租户的信息,在租户下查询会展示租户自己的信息。

  • 通过查询固定时间点可以查询最近的一次合并版本。如果您在 t1 时间点发起了集群合并,您最早可以查询到 t1 时间点的数据。

  • 如果被查询的表已经被删除进了回收站,则需要先将该表从回收站中恢复。

  • 闪回查询受限于转储,如果发生转储,且 undo_retention 变量未设置,则无法查询。设置 undo_retention 变量后可以查询 t1(转储时间点)+undo_retention 变量设置的时间范围。

闪回被删除的表

OceanBase 支持回收站功能,通过回收站可以闪回已删除的表。默认回收站是开启的,回收站是否开启由租户变量 recyclebin 控制。

开启/关闭回收站的语法是:

set global recyclebin = ON | OFF ;

修改回收站的开启状态后,只对后续新连接会话生效。

  • 示例:闪回被删除的表。
obclient> drop table if exists t1;
Query OK, 0 rows affected (0.02 sec)

obclient> create table t1(id bigint not null primary key, gmt_create datetime not null default current_timestamp);
Query OK, 0 rows affected (0.09 sec)

obclient> insert into t1(id) values(1),(2),(3);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

obclient> select * from t1;
+----+---------------------+
| ID | GMT_CREATE          |
+----+---------------------+
|  1 | 2020-02-28 09:47:07 |
|  2 | 2020-02-28 09:47:07 |
|  3 | 2020-02-28 09:47:07 |
+----+---------------------+
3 rows in set (0.00 sec)

obclient> drop table t1;
Query OK, 0 rows affected (0.03 sec)

obclient> show recyclebin\G
*************************** 1. row ***************************
  OBJECT_NAME: __recycle_$_20200102_1585650066255592
ORIGINAL_NAME: t1
         TYPE: TABLE
   CREATETIME: 2020-03-31 18:21:06.255716
1 row in set (0.03 sec)

obclient> flashback table __recycle_$_20200102_1585650066255592 to before drop rename to t1;
Query OK, 0 rows affected (0.02 sec)

obclient> select * from t1;
+----+---------------------+
| ID | GMT_CREATE          |
+----+---------------------+
|  1 | 2020-02-28 09:47:07 |
|  2 | 2020-02-28 09:47:07 |
|  3 | 2020-02-28 09:47:07 |
+----+---------------------+

其它数据库后续再补充!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。