
(麦麦镇楼)
新一期金仓数据库产品体验官活动开启了,本期主题是“Oracle兼容深度体验”。

前几期内容参考如下:
- 2024第一期-KES单机安装
- 2024第二期-KES连接使用
- 2024第三期-KES数据迁移
- 2024第四期-KES性能优化
- 2024第五期-KES RWC安装部署
- 2024第六期-KES扩容缩容
- 2025第一期-SQL Server兼容体验
- 2025第二期-MySQL兼容体验
安装
金仓数据库近期更新了全平台版本,KingbaseES V009R001C010,详细内容建议回看前文:金仓数据库V9全平台版,一台机器安装四种兼容模式

这次我们只需启动 Oracle 兼容模式,来评测一下新增的数据库类型,分区表自动分裂,以及闪回功能。

数据类型:yminterval 和 dsinterval
Oracle 的 INTERVAL YEAR TO MONTH (YMInterval) 与 INTERVAL DAY TO SECOND (DSInterval) 在 KingbaseES 里被原汁原味地映射为 yminterval、dsinterval,语法、字面量、运算规则全部对齐。
- YMInterval:表示以年和月为单位的时间间隔。
- DSInterval:表示以天、小时、分钟、秒(及小数秒)为单位的时间间隔。

金仓数据库最近更新了官方文档,使用起来更加方便,而且文档反馈也很容易。
示例:基础用法。
-- 添加2年3个月到指定日期
SELECT SYSDATE + INTERVAL '2-3' YEAR TO MONTH FROM dual;
-- 计算1天零5小时后的时间
SELECT SYSDATE + INTERVAL '1 05:00' DAY TO HOUR FROM dual;
示例:创建带有 yminterval 和 dsinterval 的测试表,写入测试数据。
test=# create table t ( c1 date, c2 yminterval, c3 dsinterval);
CREATE TABLE
test=# \d t
Table "public.t"
Column | Type | Collation | Nullable | Default
--------+------------+-----------+----------+---------
c1 | date | | |
c2 | yminterval | | |
c3 | dsinterval | | |
test=# insert into t
test-# select now(), '1-2', '1 02:34:56.123456789';
INSERT 0 1
test=# table t;
c1 | c2 | c3
---------------------+---------------+-------------------------------
2025-08-30 11:18:06 | +000000001-02 | +000000001 02:34:56.123456789
(1 row)
test=# select c1, c1+c2, c1+c3 from t;
c1 | ?column? | ?column?
---------------------+---------------------+----------------------------
2025-08-30 11:18:06 | 2026-10-30 11:18:06 | 2025-08-31 13:53:02.123456
(1 row)
interval 分区自动分裂
之前,
我们在使用 KingbaseES 时,可通过扩展 pg_pathman 提供的分区表自动分裂扩展功能。但是,pg_pathman 默认未预加载,需要手动修改配置文件,并重启数据库。使用 pg_pathman 可自动扩展分区范围分区表,允许自动扩展分区。如果新插入的数据不在已有的分区范围内,会自动创建分区。默认允许自动扩展分区,不过需要注意的是,不合理的自动扩展可能会消耗大量的时间。
test=# create extension pg_pathman;
CREATE EXTENSION
test=# \dx pg_pathman
List of installed extensions
Name | Version | Schema | Description
------------+---------+--------+----------------------------------
pg_pathman | 1.5 | public | Partitioning tool for PostgreSQL
(1 row)
创建测试表。
CREATE TABLE sensor_data (
id SERIAL PRIMARY KEY,
sensor_id INT NOT NULL,
recorded_at TIMESTAMP NOT NULL,
value FLOAT
);
创建表分区。
SELECT create_range_partitions(
'sensor_data', -- 主表名
'recorded_at', -- 分区键
'2025-01-01'::TIMESTAMP, -- 起始值
INTERVAL '1 month', -- 间隔
12 -- 初始分区数
);

查看 pathman 的配置表。
test=# table pathman_config_params;
partrel | enable_parent | auto | init_callback | spawn_using_bgw
-------------+---------------+------+---------------+-----------------
sensor_data | f | t | | f
(1 row)
写入测试数据,验证分区分裂功能。
insert into sensor_data select 1, 1, '2025-01-01', 1;
insert into sensor_data select 12, 12, '2025-12-01', 12;
insert into sensor_data select 101, 101, '2026-01-01', 101;
auto = t 即“自动裂变”开关。当插入 2026-01-01 的数据时,系统会自动创建 sensor_data_13 分区,无需人工干预。

现在,
从新版本开始,增强了 Oracle 兼容性,支持间隔分区,可通过语法 INTERVAL expr 来指定间隔分区。
接上例,创建按月间隔的分区表。
CREATE TABLE sensor_data (
id SERIAL PRIMARY KEY,
sensor_id INT NOT NULL,
recorded_at TIMESTAMP NOT NULL,
VALUE FLOAT
)
PARTITION BY RANGE(recorded_at)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (TO_DATE('2025-02-01', 'YYYY-MM-DD')),
PARTITION p3 VALUES LESS THAN (TO_DATE('2025-03-01', 'YYYY-MM-DD'))
);
查看表结构。

写入测试数据,验证分区分裂功能。
insert into sensor_data select 1, 1, '2025-01-01', 1;
insert into sensor_data select 2, 2, '2025-02-01', 2;
insert into sensor_data select 6, 6, '2025-06-01', 6;
insert into sensor_data select 101, 101, '2026-01-01', 101;
再次查看表结构。

闪回
Oracle Flashback 一直是“后悔药”代名词。KingbaseES 通过插件 kdb_flashback 提供错误数据的快速恢复能力,包括:闪回查询、闪回版本查询、闪回表、闪回回收站,以及闪回到任意时间点。
启用该插件需要修改配置:
shared_preload_libraries = 'kdb_flashback'
创建扩展。
create extension kdb_flashback;
开启参数:
kdb_flashback.enable_flashback_query:闪回查询的开启参数,默认开启。kdb_flashback.db_recyclebin:闪回回收站开启参数,参数级别为PGC_SIGHUP,默认关闭。
test=# show kdb_flashback.enable_flashback_query ;
kdb_flashback.enable_flashback_query
--------------------------------------
on
(1 row)
test=# show kdb_flashback.db_recyclebin ;
kdb_flashback.db_recyclebin
-----------------------------
off
(1 row)
test=# alter system set kdb_flashback.db_recyclebin = on;
ALTER SYSTEM
test=# \q
[shawnyan@rl9 ~]$ sys_ctl reload
server signaled
[shawnyan@rl9 ~]$ ksql
License Type: 企业版.
Type "help" for help.
kingbase=# \c test
You are now connected to database "test" as userName "system".
test=# show kdb_flashback.db_recyclebin ;
kdb_flashback.db_recyclebin
-----------------------------
on
(1 row)
最好在创建数据库时就开启相关参数,不然可能会发生报错。
test=# select versions_startcsn, versions_endcsn, versions_operation, *
test-# from sensor_data versions between csn minvalue and maxvalue;
ERROR: could not get commit timestamp
HINT: Make sure the configuration parameter "track_commit_timestamp" is set on server.
test=# show track_commit_timestamp;
track_commit_timestamp
------------------------
off
(1 row)
test=# alter system set track_commit_timestamp = on;
ALTER SYSTEM
此外,还需开启参数 track_commit_timestamp,需要重启才能生效。
示例:假设表 tfb 被误删了一条记录,通过闪回功能将数据找回。
test=# table tfb;
id | date
----+----------------------------
1 | 2025-08-30 13:18:32.218031
2 | 2025-08-30 13:18:37.218906
(2 rows)
test=# select versions_startcsn, versions_endcsn, versions_operation, * from tfb versions between csn minvalue and maxvalue;
versions_startcsn | versions_endcsn | versions_operation | id | date
-------------------+-----------------+--------------------+----+----------------------------
65536000003 | | I | 1 | 2025-08-30 13:18:32.218031
65536000004 | | I | 2 | 2025-08-30 13:18:37.218906
65536000005 | 65536000006 | D | 3 | 2025-08-30 13:18:40.736017
(3 rows)
test=# select * from tfb as of csn 65536000005;
id | date
----+----------------------------
1 | 2025-08-30 13:18:32.218031
2 | 2025-08-30 13:18:37.218906
3 | 2025-08-30 13:18:40.736017
(3 rows)
test=# flashback table tfb to csn 65536000005;
FLASHBACK TABLE
test=# select * from tfb;
id | date
----+----------------------------
1 | 2025-08-30 13:18:32.218031
2 | 2025-08-30 13:18:37.218906
3 | 2025-08-30 13:18:40.736017
(3 rows)
test=# select versions_startcsn, versions_endcsn, versions_operation, * from tfb versions between csn minvalue and maxvalue;
versions_startcsn | versions_endcsn | versions_operation | id | date
-------------------+-----------------+--------------------+----+----------------------------
65536000003 | | I | 1 | 2025-08-30 13:18:32.218031
65536000004 | | I | 2 | 2025-08-30 13:18:37.218906
65536000005 | 65536000006 | D | 3 | 2025-08-30 13:18:40.736017
65536000007 | | I | 3 | 2025-08-30 13:18:40.736017
(4 rows)
test=#
写在后面
本期 Oracle 兼容深度体验,我们沿着“类型 → 分区 → 闪回”三条主线,完整验证了 KingbaseES 对 Oracle 生态的“像素级”还原:
- 数据类型:yminterval / dsinterval 语法、运算、格式 100% 对齐。
- 分区:pg_pathman 提供的 interval 自动分裂,让 DBA 从有更多时间摸鱼。
- 闪回:kdb_flashback 四件套,把“后悔药”做成了“常备药”。
如果你正准备把 Oracle 系统迁到国产平台,不妨先装一套 KingbaseES,跑一遍自己的业务脚本——大概率会发现,除了 IP 地址变了,其他都没变。
【金仓社区「文档找茬」有奖活动来袭!】
🔍找茬一时爽,一直找茬一直爽!🔍
各位技术大神、细节控、文档体验官请注意!
全新升级的金仓文档系统已上线,现在邀请你来“挑刺”——
找到问题?金仓重谢!
🎯 怎么参与?
1️⃣ 体验新版文档(仅限KES V9R1C10):https://docs.kingbase.com.cn/
2️⃣ 挑刺:找出任何bug、错别字、描述不清、代码示例问题……
3️⃣ 发帖:到金仓社区(https://bbs.kingbase.com.cn/forum)#建议&反馈# 专区发帖,带 #产品手册# 标签,发帖说明问题(附截图+位置)
4️⃣ 标签:记得带上标签 #产品手册# 哦!
🏆 奖励有多香?
✅ 每被采纳1条建议= 100金仓币(可兑换社区周边等诸多福利)
✅ 累计采纳5条,加赠 金仓社区专属定制好礼;
✅ 采纳数量最多的用户,加赠 金仓定制机械键盘(敲代码爽到飞起!)
💡 我们关心这些细节(举例):
- 错别字、标点滥用、语句歧义
- 代码示例错误或运行报错
- 目录结构不合理、跳转失效
- 描述不清、缺失关键步骤
……
任何让你皱眉的地方,都值得发帖!
⏰ 活动时间:
即日起——10月31日
找的是茬,赢的是奖,拼的是技术人的极致!
🔥我们等你来较真!
👉https://bbs.kingbase.com.cn/web-api/forum/10155

Have a nice day ~ ☕
🌻 往期精彩 ▼
- 全球 Oracle ACE 社区突破 500 位成员
- 「合集」MySQL 8.x 系列文章汇总
- 「合集」三年 50 篇,TiDB 干货全收录
- 8.30 哈尔滨 | PostgreSQL 技术峰会哈尔滨站
- 金仓数据库 Oracle 兼容模式体验
- 一文带你了解 KING BASE 金仓数据库
- 崖山数据库 YAC 共享集群入门
- 一文带你了解 KWDB 数据库
- 国产老兵“虚谷数据库”初探
– / END / –
欢迎关注我的视频号

👉 这里有得聊
如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。
关注微信公众号:少安事务所,后台回复[群],即可看到入口。
如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~




