【金仓数据库产品体验官】KES-ORACLE兼容模式再体验之FLASHBACK

前面第一篇我们已经写过一篇金仓数据库ORACLE兼容模式体验官文章了(文章地址:https://blog.csdn.net/LFCuiYs/article/details/151025150?spm=1001.2014.3001.5502)

这次体验一下闪回特性,接下来再次进行登录验证连接:

一、FLASHBACK 功能概述

KingbaseES 提供了闪回(FLASHBACK)功能,允许用户查询历史数据或将表恢复到特定时间点。主要功能包括:

  • 闪回查询(Flashback Query)

  • 闪回表(Flashback Table)

  • 闪回回收站(Flashback Drop)

FLASHBACK 命令用于闪回一个回收站中的表或者将该表闪回至一个历史的快照时刻。

前置条件:

回收站功能默认关闭,只有开启了参数才能将表放置到回收站中,参数名称:kdb_flashback.db_recyclebin,参数为bool类型,参数级别为pgc_sighup。

开启了回收站参数后,如果不允许一个删除的表进回收站,需要在DROP语句后面加上PUGREX 选项。

FLASHBACK支持将一个已经删除到回收站中的表及相关对象闪回到删除之前状态。

Recyclebin视图:

sys_recyclebin视图在开启回收站功能,存储用户删除的表信息,用于删除表闪回使用。

如果在当前SCHEMA下已经存在同名的表,则闪回失败,需要使用RENAME TO选项指定一个新的表名。成功闪回一个表后,回收站视图recyclebin和回收站系统表sys_recyclebin中对象将被清除。

闪回表至历史时刻,基于闪回查询将被操作表的数据还原到指定的快照时刻,该操作基于AS OF 闪回查询和当前快照数据的差异进行还原。闪回表至历史时刻可以通过时间戳(timestamp)、csn两种方式进行指定。闪回表的过程中默认关闭触发器行为,如果期望开启的话请通过ENABLE TRIGGERS 语句进行。

关于插件kdb_flashback:

插件kdb_flashback是KingbaseES 的一个扩展插件。主要功能是提供错误数据的快速恢复能力,目前提供的闪回技术包括闪回回收站,闪回查询,闪回版本查询,闪回到任意时间点。

插件kdb_flashback加载方式:

KingbaseES数据库默认将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。

插件kdb_flashback的参数配置

kdb_flashback.enable_flashback_query 闪回查询的开启参数,默认开启。

kdb_flashback.db_recyclebin 闪回回收站开启参数,参数为bool类型,参数级别为PGC_SIGHUP,默认关闭。

插件kdb_flashback的使用方法

闪回查询相关的技术使用方法

  • 整个闪回技术(闪回查询和闪回表到指定时间点) 可以通过时间戳和CSN(commit sequence number) 两种方式进行。

  • 两种方式目前都需要依赖提交的时间戳,因此需要开启track_commit_timestamp 这个参数。另外闪回查询还需要开启kdb_flashback.enable_flashback_query 的参数。

  • 闪回查询技术有一定的限制,在数据进行深度清理后和部分schema change 后将拒绝闪回查询(具体参考闪回查询须知)。

二、FLASHBACK 语法

FLASHBACK TABLE table_name TO

{ BEFORE DROP \[ RENAME TO newname ] |

{ TIMESTAMP \| CSN \| SCN } asof_item \[ { ENABLE \| DISABLE } TRIGGERS ]}

三、FLASHBACK 测试

1. 闪回查询(Flashback Query)

复制代码
SELECT * FROM table_name AS OF {TIMESTAMP | CSN} time_value [WHERE conditions]; 
sql 复制代码
-- 创建测试表
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    salary NUMERIC
);

-- 插入初始数据
INSERT INTO employees VALUES (1, '张三', 5000);
INSERT INTO employees VALUES (2, '李四', 6000);

-- 记录当前时间
SELECT now() AS current_time;

进行DDL操作:以及根据时间节点进行闪回查询:

根据CSN进行闪回查询:

可以正常获得想要的结果。

2. 闪回表(Flashback Table)

复制代码
FLASHBACK TABLE [schema.]table_name TO {TIMESTAMP | CSN} time_value [ENABLE TRIGGERS]; 
sql 复制代码
test=# CREATE TABLE employees (
test(#     id INT PRIMARY KEY,
test(#     name VARCHAR(50),
test(#     salary NUMERIC
test(# );
CREATE TABLE
test=# INSERT INTO employees VALUES (1, '张三', 5000);
INSERT 0 1
test=# INSERT INTO employees VALUES (2, '李四', 6000);
INSERT 0 1
test=# SELECT now() AS recovery_time;
         recovery_time
-------------------------------
 2025-09-27 21:29:55.412734+08
(1 row)

test=# UPDATE employees SET name = '错误的修改';
UPDATE 2
test=# DELETE FROM employees WHERE id = 1;
DELETE 1
test=# FLASHBACK TABLE employees TO TIMESTAMP '2025-09-27 21:29:55';
FLASHBACK TABLE
test=# select * from employees;
 id | name | salary
----+------+--------
  1 | 张三 |   5000
  2 | 李四 |   6000
(2 rows)

可以看到能够达到预期效果。

3. 闪回回收站(Flashback Drop)

复制代码
FLASHBACK TABLE [schema.]table_name TO BEFORE DROP [RENAME TO new_table_name]; 

回收站功能默认关闭,可以通过下列命令查看是否开启回收站功能:

show kdb_flashback.db_recyclebin;

开启回收站功能,在登录数据库后执行以下命令即可

alter system set kdb_flashback.db_recyclebin = on;#上文已开启,本步骤可以省略。

从回收站恢复表

开启了回收站参数后,如果不允许一个删除的表进回收站,需要在DROP语句后面加上PUGREX选项。flashback支持将一个已经删除到回收站中的表及相关对象闪回到删除之前状态。

如果在当前schema下已经存在同名的表,则闪回失败,需要使用rename to选项指定一个新的表名。 成功闪回一个表后,回收站视图recyclebin和回收站系统表sys_recyclebin中对象将被清除。

一个FLASHBACK命令:

FLASHBACK TABLE TABLE_name TO BEFORE DROP;

这个命令将在回收站中的TABLE_name闪回到闪回之前的状态:

FLASHBACK TABLE TABLE_name TO BEFORE DROP RENAME TO newname;

将回收站中的表闪回到一个新的表名:要将删除的表放到回收站需要在kingbase.conf配置文件末尾添加kdb_flashback.db_recyclebin=on。

可以看到能过正常闪回之前删除的表。

PS:purge recyclebin; ##情况回收站,请谨慎操作。

总结:

在日常运维工作中,我们可以充分利用KingbaseES的闪回功能,大幅提高数据库操作的容错能力和数据安全性。运维效率革命性提升:

  • 分钟级恢复:将传统小时级的数据恢复缩短至秒级。
  • 精准操作回退:无需全库恢复即可撤销特定错误操作。
  • 零停机维护:在业务高峰期安全执行高风险数据变更。
相关推荐
掉头发的王富贵4 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils4 小时前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
Databend1 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
飞将2 天前
从零实现数据库(2)——HashIndex + IndexManager
数据库
Nturmoils3 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波3 天前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
倔强的石头_4 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_7 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab8 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm