【金仓数据库产品体验官】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的闪回功能,大幅提高数据库操作的容错能力和数据安全性。运维效率革命性提升:

  • 分钟级恢复:将传统小时级的数据恢复缩短至秒级。
  • 精准操作回退:无需全库恢复即可撤销特定错误操作。
  • 零停机维护:在业务高峰期安全执行高风险数据变更。
相关推荐
树码小子2 分钟前
MySQL 的事务隔离级别(重点面试题)
数据库·mysql
01_ice7 分钟前
MySQL表的约束
数据库·sql·mysql
北漂燕郊杨哥31 分钟前
Win11 环境下 phpStudy 安装 Redis 最新版,并为 PHP 8.5.9(NTS)配置 redis 扩展
数据库·redis·php
2603_965148119 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl9 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu10 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT11 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData11 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean12 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean12 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定