暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

金仓数据库 Oracle 兼容模式体验

原创 严少安 2025-08-31
610


(麦麦镇楼)

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

前几期内容参考如下:

安装

金仓数据库近期更新了全平台版本,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 ~

🌻 往期精彩 ▼

– / END / –

欢迎关注我的视频号

微信图片_20250817_205428_217.jpg

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。
关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~

最后修改时间:2025-09-02 01:16:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论