合 如何恢复被truncate掉的表?
Tags: OracleMySQLTiDB误操作恢复闪回truncate恢复
恢复的方法很多,但是还是需要根据具体情况来实施,例如常见的备份恢复,导出导入,日志挖掘,闪回等等。
Oracle
可以参考 【DB宝73】Oracle中使用包FY_Recover_Data.pck来恢复truncate误操作的表:https://www.dbaup.com/oraclezhongshiyongbaofy_recover_data-pcklaihuifutruncatewucaozuodebiao.html
MySQL
可以参考:https://www.dbaup.com/dbbao43mysqlwucaozuoshanhuihuifuliqizhimy2sql.html
原理:挖掘之前的原始Redo日志,生成原始SQL。
PostgreSQL
可以根据场景选择不同的方法,参考:
- PG中通过pg_waldump来分析pg_wal日志:https://www.dbaup.com/pgzhongtongguopg_waldumplaifenxipg_walrizhi.html
- PG日志挖掘工具之WalMiner:https://www.dbaup.com/pgrizhiwajuegongjuzhiwalminer.html
- PG工具pg_resetwal介绍:https://www.dbaup.com/postgresql11xiugaiwal-segsizedaxiao.html
- PG之闪回数据库:https://www.dbaup.com/pgzhishanhuishujuku.html
- PG中的DDL支持回滚:https://www.dbaup.com/pgzhongdeddlzhichihuigun.html
- PostgreSQL闪回表之pg_dirtyread插件:https://www.dbaup.com/postgresqlshanhuibiaozhipg_dirtyreadchajian.html
- PG误操作恢复工具之pg_recovery:https://www.dbaup.com/pgwucaozuohuifugongjuzhipg_recovery.html
原理:挖掘之前的原始Redo日志,生成原始SQL。
TiDB
参考:https://www.dbaup.com/tidbhuifubeiwushanchudeshujuhuobiao.html
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 数据库中,SCN
和 SNAPSHOT
都是指事务版本号,只是因为 Oracle 和 MySQL 中概念不同,起了不同的名字。
OB的闪回支持3种类型:
1 2 3 4 5 | 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 返回的是当前事务隔离级别下允许查询的已提交的版本数据,如果要查询历史上提交的版本,可以在表后指定历史时间信息。
示例:闪回查询历史记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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 命令修改,并且只对修改之后的会话产生的数据生效。