电科金仓国产数据库KingBaseES深度解析:五个一体化的技术架构与实践指南

7989 2025-11-20 06:39:38

引言:国产数据库的技术革新之路

在数字化转型的浪潮中,数据库作为IT架构的核心基石,正面临着前所未有的挑战。随着企业业务规模的不断扩大和数据类型的日益多样化,传统单一架构的数据库已难以满足现代应用对多样化数据模型、混合工作负载和弹性扩展的需求。

电科金仓KingBaseES作为国产数据库的领军者,在26年的技术积淀基础上,创新性地提出了"五个一体化"技术理念。这一理念不是简单的功能堆砌,而是从架构层面重新思考数据库应该如何适应云原生、大数据、人工智能时代的新要求。通过多语法兼容、多模融合、多场景处理、集中分布架构、开发运维管理五个维度的深度整合,金仓为企业提供了全栈式的数据库解决方案。

本文将深入剖析每个一体化的技术原理、应用场景和实战方法,通过详细的架构说明和实用的代码案例,帮助技术团队全面掌握金仓数据库的核心能力。我们将从理论到实践,从架构到代码,全方位展示金仓如何帮助企业构建面向未来的数据基础设施。

1.第一章 多语法一体化兼容:平滑迁移的技术基石

1.1 技术原理与架构设计

多语法一体化兼容是金仓数据库最引人注目的特性之一,其核心价值在于极大降低了数据库迁移的技术门槛和成本。从技术架构角度看,金仓实现这一特性不是简单的语法糖包装,而是基于统一的抽象语法树转换层实现的深度兼容。

想象一下这样的场景:一个大型企业系统可能包含Oracle风格的存储过程、MySQL风格的业务逻辑、SQL Server风格的报表查询。传统迁移方案需要重写大量SQL代码,耗时耗力且容易出错。而金仓通过智能语法识别和转换机制,让这些不同风格的SQL可以在同一数据库中无缝运行。

金仓的语法兼容层工作原理类似于编程语言中的编译器前端。当接收到SQL语句时,系统首先进行词法分析,识别SQL中的关键字、标识符、运算符等基本元素。不同数据库的方言差异在这一阶段就被充分考虑,比如Oracle的ROWNUM伪列、MySQL的LIMIT关键字、SQL Server的TOP运算符等。

接下来是语法分析阶段,金仓会构建统一的抽象语法树。这个过程中,不同方言的特有语法都会被转换为标准的内部表示形式。例如,Oracle的START WITH...CONNECT BY层次查询会被转换为标准的递归CTE语法,而MySQL的GROUP_CONCAT聚合函数会被映射到金仓的字符串聚合函数。

最重要的是语义保持,金仓确保转换后的SQL在执行时产生与源数据库完全一致的结果。这不仅包括基本的数据操作结果,还包括事务隔离级别、锁机制、并发控制等深层语义的一致性。

1.2 企业级迁移实战案例

让我们通过一个具体的迁移案例来理解这一特性的实际价值。假设某金融机构的核心交易系统原先运行在Oracle数据库上,现在需要迁移到金仓数据库。

原Oracle系统包含复杂的业务逻辑,比如使用Oracle特有的分层查询来管理组织架构:

-- Oracle原系统的组织架构查询

SELECT employee_id, last_name, manager_id, level

FROM employees

START WITH manager_id IS NULL

CONNECT BY PRIOR employee_id = manager_id;

在金仓数据库中,这条查询可以直接运行,系统会自动将其转换为等价的递归查询。更重要的是,金仓提供了完整的迁移评估工具,可以分析现有应用的SQL兼容性,生成详细的迁移报告。

迁移过程中的另一个关键问题是序列和自增主键的处理。Oracle使用序列和触发器的组合来实现自增功能,而金仓提供了更简洁的实现方式:

-- Oracle风格的序列和触发器

CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER emp_trigger

BEFORE INSERT ON employees

FOR EACH ROW

BEGIN

IF :NEW.employee_id IS NULL THEN

SELECT emp_seq.NEXTVAL INTO :NEW.employee_id FROM dual;

END IF;

END;

-- 金仓的简化实现(完全兼容Oracle语法)

CREATE TABLE employees (

employee_id BIGSERIAL PRIMARY KEY, -- 自动创建序列

last_name VARCHAR(50) NOT NULL,

manager_id INTEGER

);

对于性能敏感的应用,金仓还提供了查询优化建议功能。迁移过程中,可以通过EXPLAIN命令分析查询执行计划,确保性能达到甚至超过原系统:

-- 性能分析和优化

EXPLAIN (ANALYZE, BUFFERS)

SELECT /*+ USE_HASH(employees) */ *

FROM employees

WHERE hire_date BETWEEN '2020-01-01' AND '2024-12-31';

1.3 实际应用价值

多语法兼容的实际价值体现在多个方面。首先,它大幅降低了迁移成本,企业不需要投入大量人力重写SQL代码。其次,它减少了迁移风险,因为业务逻辑不需要改变,测试工作量大大降低。最后,它提供了技术栈统一的可能,企业可以逐步将不同的数据库系统整合到金仓平台上来。

1.4 五个一体化具体是哪五个

1.多语法一体化兼容 即在金仓数据库KES中,同时兼容SQL标准、Oracle、SQL Server、MySQL等不同数据库产品的语法体系,从而实现“零”修改应用代码迁移。

2.多模数据一体化存储和计算 即在金仓数据库KES中,同时支持对关系模型、文档模型、图模型、KV模型、全文本等的统一存储、混合访问、模型间转换,从而消除采用多个不同模型专用数据库时不可避免的跨库间数据集成。

3.多应用场景一体化处理 即用金仓数据库KES,同时支撑包括事务、分析、流、HTAP、AI等多种应用类型,并满足不同应用类型的功能、性能需求。

4.集中、分布一体化架构 金仓数据库KES同时支撑主备集群、读写分离集群、多写共享存储集群、无共享分布式集群等多种集群架构,从而满足不同可用性、横向扩展性、应用透明性需求的应用需要。

5.开发、运维一体化管理 金仓数据库KES通过自有的KStudio、KOPS等工具,支持对应用开发、系统管理的一体化支撑,从而降低大规模应用开发及系统管理的难度与成本。

2.第二章 多模数据一体化存储:打破数据孤岛的技术实践

2.1 多模融合的存储引擎架构

在现代应用中,数据类型的多样性已经成为常态。一个物联网平台需要处理时序数据,一个GIS系统需要管理空间数据,一个内容管理系统需要存储文档数据,而传统的交易系统仍然依赖关系数据。金仓的多模数据一体化存储正是为了解决这种复杂的数据管理需求。

金仓采用统一存储引擎+多模访问接口的架构设计。底层是统一的存储管理层,负责数据持久化、事务处理、并发控制等基础功能。在这一层之上,为不同类型的数据提供了专门的访问接口和优化机制。

时序数据是金仓重点优化的数据类型之一。与传统关系数据不同,时序数据具有明显的特点:数据按时间顺序到达、写入频繁但很少更新、查询通常按时间范围进行、数据具有明显的冷热特征。金仓针对这些特点实现了多项优化:

首先是时序压缩。传感器、监控设备等产生的时序数据往往包含大量重复或变化缓慢的数值,金仓提供了多种压缩算法,如Delta编码、游程编码、字典压缩等,可以实现80%以上的压缩率。

其次是时间分区。金仓支持自动的时间分区管理,可以按小时、天、月等时间间隔自动创建分区。老化的数据可以自动转移到低成本存储,同时保持可查询性。

空间数据方面,金仓集成了成熟的GIS功能,支持点、线、面等几何对象,提供空间索引和丰富的空间运算函数。这与时序数据的结合特别有价值,比如可以查询"某区域最近一小时的温度变化"。

文档数据通过JSONB类型支持,这是一种二进制的JSON格式,支持索引和高效查询。文档模型与关系模型的融合让金仓可以同时满足结构化和半结构化数据的管理需求。

2.2 时序数据深度优化实战

让我们深入探讨时序数据的处理。假设我们正在构建一个工业物联网平台,需要监控数千台设备的运行状态。每台设备每秒产生多条监控数据,包括温度、压力、振动等多种指标。

首先设计优化的数据模型:

-- 创建时序优化的传感器数据表

CREATE TABLE sensor_metrics (

time TIMESTAMP NOT NULL,

device_id INTEGER NOT NULL,

metric_type VARCHAR(50) NOT NULL,

value DOUBLE PRECISION,

quality INTEGER,

tags JSONB DEFAULT '{}'::JSONB

) PARTITION BY RANGE (time);

-- 创建时间分区(按季度分区)

CREATE TABLE sensor_metrics_2024q1 PARTITION OF sensor_metrics

FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

-- 时序专用索引

CREATE INDEX idx_sensor_time_device ON sensor_metrics (time DESC, device_id);

分区和索引的设计考虑了时序数据的访问模式。大多数查询都是按时间范围过滤,然后按设备聚合,因此将时间字段放在索引首位。

对于海量时序数据,压缩是必不可少的。金仓提供了列式存储和压缩功能:

-- 启用时序压缩

ALTER TABLE sensor_metrics SET (

timeseries_compression = 'zstd',

compression_level = 3

);

-- 创建压缩策略

CREATE COMPRESSION POLICY sensor_compression

ON sensor_metrics

USING (time < NOW() - INTERVAL '7 days') -- 7天前的数据压缩

WITH (compress = true);

在实际查询中,金仓的时序优化功能发挥重要作用。比如要分析某台设备最近24小时的温度趋势:

-- 时序聚合查询

SELECT

device_id,

time_bucket('1 hour', time) as hour_bucket,

AVG(value) as avg_temperature,

MAX(value) as max_temperature,

MIN(value) as min_temperature

FROM sensor_metrics

WHERE device_id = 1001

AND metric_type = 'temperature'

AND time >= NOW() - INTERVAL '24 hours'

GROUP BY device_id, hour_bucket

ORDER BY hour_bucket;

time_bucket是金仓提供的时序函数,用于将时间戳按指定间隔分桶,这是时序分析的常用操作。

2.3 多模数据融合查询

金仓的真正强大之处在于不同类型数据的融合查询。比如在智能交通系统中,我们需要同时处理车辆轨迹(时序+空间)和车辆信息(关系+文档):

-- 创建车辆轨迹表(时序+空间)

CREATE TABLE vehicle_tracks (

vehicle_id INTEGER,

track_time TIMESTAMP,

location GEOGRAPHY(POINT),

speed INTEGER,

status VARCHAR(20)

) PARTITION BY RANGE (track_time);

-- 车辆信息表(文档扩展)

CREATE TABLE vehicles (

vehicle_id INTEGER PRIMARY KEY,

license_plate VARCHAR(20),

vehicle_type VARCHAR(20),

owner_info JSONB, -- 车主信息(文档结构)

maintenance_history JSONB -- 维修历史

);

-- 复杂融合查询:查找在特定区域超速的车辆详情

SELECT

vt.vehicle_id,

vt.track_time,

vt.speed,

v.license_plate,

v.vehicle_type,

v.owner_info->>'owner_name' as owner_name,

ST_Distance(vt.location, poi.geometry) as distance

FROM vehicle_tracks vt

JOIN vehicles v ON vt.vehicle_id = v.vehicle_id

JOIN points_of_interest poi ON ST_DWithin(vt.location, poi.geometry, 1000)

WHERE vt.track_time >= NOW() - INTERVAL '1 hour'

AND vt.speed > 80 -- 超速阈值

AND poi.category = 'school' -- 学校区域

ORDER BY vt.track_time DESC;

这个查询融合了时序过滤(最近1小时)、空间计算(学校区域1000米范围内)、关系连接(车辆信息)和文档提取(车主姓名),展示了金仓多模能力的实际价值。

3.第三章 多应用场景一体化处理:HTAP实时分析技术

3.1 HTAP架构的核心原理

HTAP(混合事务/分析处理)是金仓数据库的另一个核心特性。传统架构中,事务处理(OLTP)和分析处理(OLAP)通常分离到不同的系统中,这导致了数据延迟、架构复杂和成本增加等问题。金仓的HTAP架构通过在单一平台上同时支持两种工作负载,解决了这些痛点。

金仓的HTAP实现基于几个关键技术:首先是行列混合存储。事务处理适合行存储,因为需要频繁访问整行数据;分析处理适合列存储,因为通常只查询少量列但需要扫描大量行。金仓支持在同一表中使用不同的存储格式。

其次是智能工作负载管理。金仓可以识别查询的类型,将事务查询路由到行存储,分析查询路由到列存储。同时通过资源组和优先级设置,防止分析查询影响关键事务的性能。

另外是实时数据同步。行列存储之间的数据保持实时一致,确保分析查询能够访问到最新的数据。

3.2 实时分析场景实战

考虑一个电商平台的典型需求:既要支持高并发的交易处理,又要提供实时的业务分析。传统方案需要在OLTP数据库和OLAP数据仓库之间进行ETL,这导致分析数据有数小时延迟。

使用金仓的HTAP能力,可以在同一数据库中实现实时分析:

-- 创建HTAP优化的订单表

CREATE TABLE orders (

order_id BIGSERIAL,

customer_id INTEGER NOT NULL,

order_date TIMESTAMP NOT NULL,

total_amount DECIMAL(10,2),

status VARCHAR(20),

items JSONB -- 订单商品详情

) WITH (

storage_type = 'hybrid', -- 行列混合存储

columnar_compression = 'zstd'

);

-- 事务操作:创建新订单

BEGIN;

INSERT INTO orders (customer_id, order_date, total_amount, status, items)

VALUES (1001, NOW(), 299.00, 'confirmed',

'[{"product_id": 101, "quantity": 2, "price": 149.50}]');

-- 同一事务中的实时分析查询

SELECT

COUNT(*) as total_orders,

SUM(total_amount) as total_revenue,

AVG(total_amount) as avg_order_value

FROM orders

WHERE order_date >= DATE_TRUNC('hour', NOW());

COMMIT;

这种实时分析能力对于监控业务状态特别有价值。比如电商大屏需要实时显示销售数据:

-- 实时大屏查询

WITH real_time_stats AS (

SELECT

COUNT(*) as order_count,

SUM(total_amount) as revenue,

COUNT(DISTINCT customer_id) as customer_count

FROM orders

WHERE order_date >= NOW() - INTERVAL '1 hour'

),

category_stats AS (

SELECT

(item->>'category') as category,

SUM((item->>'quantity')::INTEGER) as quantity

FROM orders, jsonb_array_elements(items) as item

WHERE order_date >= NOW() - INTERVAL '1 hour'

GROUP BY category

)

SELECT

rs.order_count,

rs.revenue,

rs.customer_count,

cs.category as top_category,

cs.quantity as category_quantity

FROM real_time_stats rs

CROSS JOIN LATERAL (

SELECT category, quantity

FROM category_stats

ORDER BY quantity DESC

LIMIT 1

) cs;

3.3 流批一体处理

金仓还支持流式数据处理与批量处理的统一,这在实时监控和风险控制场景中特别有用:

-- 创建流式数据输入

CREATE STREAM user_behavior_stream (

user_id INTEGER,

action_type VARCHAR(50),

action_time TIMESTAMP,

page_url VARCHAR(500),

session_id VARCHAR(100)

);

-- 实时流处理:检测异常行为

CREATE CONTINUOUS VIEW suspicious_behavior AS

SELECT

user_id,

COUNT(*) as action_count,

COUNT(DISTINCT page_url) as distinct_pages,

MAX(action_time) as last_action_time

FROM user_behavior_stream

WHERE action_time >= NOW() - INTERVAL '5 minutes'

GROUP BY user_id

HAVING COUNT(*) > 100; -- 5分钟内操作超过100次视为异常

-- 批量历史数据分析:用户行为模式

SELECT

user_id,

DATE_TRUNC('day', action_time) as day,

action_type,

COUNT(*) as daily_actions,

AVG(CASE WHEN action_type = 'purchase' THEN 1 ELSE 0 END) as conversion_rate

FROM user_behavior_history -- 历史批量数据

WHERE action_time >= NOW() - INTERVAL '30 days'

GROUP BY user_id, day, action_type;

这种流批一体架构让企业可以用统一的技术栈处理实时和批量数据,简化了架构,提高了开发效率。

由于篇幅限制,本文先介绍前三个一体化的详细内容。从这些内容可以看出,金仓KingBaseES通过深度的技术整合和创新,为企业提供了真正一体化的数据管理解决方案。无论是降低迁移成本的多语法兼容,还是打破数据孤岛的多模融合,亦或是提升实时性的HTAP能力,都体现了金仓作为国产数据库领导者的技术实力和创新精神。

在实际应用中,企业可以根据自身需求,灵活选择和组合这些特性,构建最适合自身业务的数据架构。金仓的五个一体化不是孤立的功能点,而是相互配合、相互增强的完整体系,共同为企业数字化转型提供坚实的数据基础。

4.金仓数据库下载安装使用

4.1 硬件要求

支持 X86_64、龙芯、飞腾、鲲鹏等架构

建议至少 2 核 4G 内存,10GB 可用磁盘空间

4.2 软件要求

Docker 版本 ≥ 20.10.0(推荐 24.x 稳定版)

小提示:使用 docker --version 快速确认当前版本。本文用docker 26.1.3进行实操记录!

4.3 创建数据目录

为了避免容器销毁后数据丢失,我们先在宿主机创建持久化目录:

mkdir -p /opt/kingbase/data

chmod -R 755 /opt/kingbase/data

小提示:建议统一放在 /opt 下,方便管理。

4.4 获取镜像包

你可以通过以下方式获取 KingbaseES 镜像:

1、官网下载:https://www.kingbase.com.cn/

2、入口位置:服务与支持 > 下载中 > KES,如下图所示:

3、KingbaseES数据库Docker镜像,根据自己电脑配置选择对应的版本下载。

点击下载会提示下载验证,输入相关信息后就可以下载啦!

如果有特殊需求镜像:

联系销售人员或代理商获取

内部项目提供(如涉密项目)

本文使用的是KingbaseES_V009R001C010B0004_x86_64_Docker.tar 镜像包,大小约 754MB。

4.5导入镜像

1、将镜像包上传至 /opt/kingbase 目录下,这个目录可根据自身情况自定义,如下图:

2、将镜像包上传至 /opt/kingbase 目录后,执行导入:

docker load -i /opt/kingbase/KingbaseES_V009R001C010B0004_x86_64_Docker.tar

3、导入成功后,使用 docker images 查看:

REPOSITORY TAG IMAGE ID CREATED SIZE

kingbase_v009r001c010b0004_single_x86 v1 10ba6f33e228 2 months ago 754MB

如果 docker load 报错,可尝试 docker import,但推荐使用 load,兼容性更好。

4.6 最小启动(无持久化)

适合临时测试,容器删除后数据不保留:

docker run -tid --privileged \

-p 54321:54321 \

--name kingbase \

kingbase_v009r001c010b0004_single_x86:v1 /usr/sbin/init

4.7 推荐启动(数据持久化)

生产或长期使用建议挂载数据卷:

docker run -tid --privileged \

-p 9099:54321 \

--name kingbase \

-v /opt/kingbase/data:/home/kingbase/userdata \

kingbase_v009r001c010b0004_single_x86:v1 /usr/sbin/init

端口说明:KingbaseES 默认使用 54321 端口,非 PostgreSQL 的 5432,注意区分。

4.8 查看容器状态

docker ps

输出示例:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

6f2958b65b3d kingbase_v009r001c010b0004_single_x86:v1 "/bin/bash /home/kin…" 5 seconds ago Up 5 seconds 0.0.0.0:9099->54321/tcp, :::9099->54321/tcp kingbase

4.9 进入容器

docker exec -it kingbase /bin/bash

[kingbase@6f2958b65b3d ~]$ du -sh * 8.0K docker-entrypoint.sh 439M install 167M userdata

进入跟目录,可以打印 docker-entrypoint.sh 启动类出来看看,看一下启动都发生了什么事,搞技术就喜欢追究底层原理,常话说:知其然,知其所以然!

[kingbase@6f2958b65b3d ~]$ vi docker-entrypoint.sh

#!/bin/bash

source /etc/profile

cron_file="/etc/cron.d/KINGBASECRON"

command_options="-q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -p 22"

default_pass="MTIzNDU2NzhhYgo="

function err_log()

{

local exit_flag=$?

local message="$1"

if [ ${exit_flag} -ne 0 ]

then

echo "${message} fail"

else

echo "${message} success"

fi

}

function pre_exe(){

DB_PATH=/home/kingbase/install/kingbase

etc_PATH=${DB_PATH}/etc

if [ "$DATA_DIR"x == ""x ]

then

DATA_DIR=/home/kingbase/userdata/data

fi

persist_etc_PATH=${DATA_DIR}/../etc

LOG_FILE=${DATA_DIR}/logfile

[ "$PASSWORD"x == ""x ] && PASSWORD=`echo "${default_pass}" | base64 -d`

[ "$DB_USER"x == ""x ] && DB_USER=system

[ "$DB_MODE"x == "pg"x -o "$DB_MODE"x == "mysql"x ] && ENABLE_CI=""

kingbase_user_exist=`cat /etc/bashrc |grep KINGBASE_USER|wc -l`

[ $kingbase_user_exist -eq 0 ] && sudo echo "export KINGBASE_USER=${DB_USER}" | sudo tee -a /etc/bashrc

local DB_NAME="kingbase" # 仅在注入 ksql 环境变量时生效

kingbase_database_exist=`cat /etc/bashrc |grep KINGBASE_DATABASE|wc -l`

[ $kingbase_database_exist -eq 0 ] && sudo echo "export KINGBASE_DATABASE=${DB_NAME}" | sudo tee -a /etc/bashrc

sudo mkdir -p $DATA_DIR

sudo chown -R kingbase:kingbase /home/kingbase/

sudo chmod -R 700 $DATA_DIR

test ! -d ${persist_etc_PATH} && mkdir -p ${persist_etc_PATH}

test ! -d ${etc_PATH} && ln -s ${persist_etc_PATH} ${etc_PATH}

}

function load_env(){

[ "$DB_PASSWORD"x != ""x ] && PASSWORD=$DB_PASSWORD

[ "$USER_DATA"x != ""x ] && DATA_DIR=/home/kingbase/$USER_DATA

[ "$NEED_START"x == ""x ] && NEED_START=yes

[ "$ENCODING"x == ""x ] && ENCODING=UTF-8

}

function param_check(){

if [ "$DB_MODE"x != ""x ]

then

if ! [[ "${DB_MODE}"x == "mysql"x || "${DB_MODE}"x == "oracle"x || "${DB_MODE}"x == "pg"x || "${DB_MODE}"x == "sqlserver"x ]];

then

echo "[ERROR] env [DB_MODE]:${DB_MODE} set error, it just could be set as {mysql,oracle,pg,sqlserver}"

exit 1

fi

fi

if [ "$ENABLE_CI"x != ""x ]

then

if ! [[ "${ENABLE_CI}"x == "yes"x || "${ENABLE_CI}"x == "no"x ]]

then

echo "[ERROR] env [ENABLE_CI]:${ENABLE_CI} set error, it just could be set as {yes, no}"

exit 1

fi

fi

}

function check_and_run(){

local DATA_DIR=$1

pre_exe

${DB_PATH}/bin/sys_ctl -D ${DATA_DIR} status 2>/dev/null

if [ $? -ne 0 ];then

echo "[`date`]db is not running, ${DB_PATH}/bin/sys_ctl -D ${DATA_DIR} -l ${DATA_DIR}/logfile start"

${DB_PATH}/bin/sys_ctl -D ${DATA_DIR} -l ${LOG_FILE} start

[ $? -eq 0 ] && echo "[`date`]db started" && return 0

echo "[`date`]db start fail"

return 0

fi

}

function start_cron()

{

local i=0

local cron_command="* * * * * kingbase /home/kingbase/docker-entrypoint.sh check_and_run ${DATA_DIR} >> /home/kingbase/cronlog"

# root用户添加CRON任务

local cronexist=`sudo cat $cron_file 2>/dev/null| grep -wFn "${cron_command}" |wc -l`

if [ "$cronexist"x != ""x ] && [ $cronexist -eq 1 ]

then

local realist=`sudo cat $cron_file | grep -wFn "${cron_command}"`

local linenum=`echo "${realist}" |awk -F':' '{print $1}'`

sudo sed ${linenum}s/#*// $cron_file > ${persist_etc_PATH}/KINGBASECRON

sudo cat ${persist_etc_PATH}/KINGBASECRON | sudo tee -a $cron_file

elif [ "$cronexist"x != ""x ] && [ $cronexist -eq 0 ]

then

sudo chmod 777 $cron_file

sudo echo -e "${cron_command}\n" |sudo tee -a $cron_file

sudo chmod 644 $cron_file

else

return 1

fi

return 0

}

function db_init(){

local db_init_command="${DB_PATH}/bin/initdb -U$DB_USER -x ${PASSWORD} -D ${DATA_DIR} -E ${ENCODING}"

if [ "$ENABLE_CI"x == "yes"x ]

then

db_init_command="$db_init_command --enable_ci"

fi

if [ "$DB_MODE"x != ""x ]

then

db_init_command="$db_init_command -m $DB_MODE"

fi

echo "[`date`]start initdb..."

eval "$db_init_command"

echo "[`date`]start initdb...ok"

sed -i 's/local all all scram-sha-256/local all all trust/g' ${DATA_DIR}/kingbase.conf

sed -i 's/local replication all scram-sha-256/local replication all trust/g' ${DATA_DIR}/kingbase.conf

sed -i 's/^#\(\s*archive_mode\s*=\s*\)off/\1on/' ${DATA_DIR}/kingbase.conf

sed -i "s|^#\(\s*archive_command\s*=\s*\)''|\1'/bin/true'|" ${DATA_DIR}/kingbase.conf

mv ${DB_PATH}/bin/license.dat ${etc_PATH}/license.dat

ln -s ${etc_PATH}/license.dat ${DB_PATH}/bin/license.dat

}

function main(){

load_env

pre_exe

param_check

if [ "$(ls -A ${DATA_DIR})" ];then

echo "[`date`]data directory:${DATA_DIR} is not empty,don't need to initdb"

else

db_init

fi

if [ "$NEED_START"x == "yes"x ]

then

${DB_PATH}/bin/sys_ctl -D ${DATA_DIR} -l ${LOG_FILE} start

sudo chown -R root:root /etc/cron.d/

sudo chmod -R 644 /etc/cron.d/

test ! -f $cron_file && sudo touch $cron_file && sudo chmod 644 $cron_file

start_cron

elif [ "$NEED_START"x == "no"x ]

then

echo "[`date`]NEED_START be set as ${NEED_START},not yes, do not need start db"

touch ${LOG_FILE}

fi

if test -f ${etc_PATH}/logrotate_kingbase

then

echo "[`date`]cp logrotate_kingbase from ${etc_PATH}/logrotate_kingbase to /etc/logrotate.d/kingbase"

sudo cp ${etc_PATH}/logrotate_kingbase /etc/logrotate.d/kingbase

err_log "cp ${etc_PATH}/logrotate_kingbase /etc/logrotate.d/kingbase"

sudo chmod 644 /etc/logrotate.d/kingbase

sudo chown root:root /etc/logrotate.d/kingbase

fi

if test -f ${etc_PATH}/KINGBASECRON

then

echo "[`date`]cp KINGBASECRON from ${etc_PATH}/KINGBASECRON to /etc/cron.d/KINGBASECRON"

sudo cp ${etc_PATH}/KINGBASECRON /etc/cron.d/KINGBASECRON

err_log "sudo cp ${etc_PATH}/KINGBASECRON /etc/cron.d/KINGBASECRON"

sudo chmod 644 /etc/cron.d/KINGBASECRON

sudo chown root:root /etc/cron.d/KINGBASECRON

fi

if test -f ${etc_PATH}/${USER}

then

crontab ${etc_PATH}/${USER}

fi

if test -f ${etc_PATH}/.encpwd

then

echo "[`date`]cp .encpwd from ${etc_PATH}/.encpwd to ~/.encpwd"

cp ${etc_PATH}/.encpwd ~/.encpwd

err_log "cp ${etc_PATH}/.encpwd ~/.encpwd"

sudo chmod 600 ~/.encpwd

sudo chown ${USER}:${USER} ~/.encpwd

fi

while true;do sleep 1000;done

}

case $1 in

"check_and_run")

shift

check_and_run $1

exit 0

;;

*)

main

esac

4.10 连接数据库验证

使用 ksql 命令连接:

ksql -U kingbase -d test

你遇到的问题是:默认用户 kingbase 不存在,这是 KingbaseES 镜像——它并没有默认创建 kingbase 这个 role(用户),所以连接失败。

✅ 正确做法:先登录数据库,再查看/创建用户

✅ Step 1:用默认超级用户登录

KingbaseES 默认超级用户是 system,密码通常也是 system(或空密码),你可以这样登录:

ksql -U system -d test

✅ Step 2:查看已有用户

登录后执行:

\du

你会看到类似输出:

Role name | Attributes | Member of

------------+------------------------------------------------------------+-----------

kcluster | Cannot login | {}

sao | No inheritance, Create role | {}

sao_oper | No inheritance, Cannot login | {}

sao_public | No inheritance, Cannot login | {}

sso | No inheritance, Create role | {}

sso_oper | No inheritance, Cannot login | {}

sso_public | No inheritance, Cannot login | {}

system | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

✅ Step 3:创建你需要的用户(如 kingbase)

CREATE USER kingbase WITH PASSWORD 'kingbase';

GRANT ALL PRIVILEGES ON DATABASE test TO kingbase;

✅ Step 4:退出并用新用户登录

\q

ksql -U kingbase -d test

5.总结

金仓KingBaseES通过"五个一体化"的技术架构,为企业提供了面向未来的数据库解决方案。多语法兼容降低了迁移门槛,多模融合打破了数据孤岛,HTAP能力实现了实时分析,分布式架构确保了弹性扩展,而DevOps集成提升了运维效率。

这五个维度不是孤立的功能点,而是相互增强的技术体系。在实际应用中,企业可以根据业务需求灵活组合这些能力,构建最适合自身的数据架构。随着数字化转型的深入,金仓数据库的五个一体化理念将继续引领国产数据库的技术创新方向。

关于本文,博主还写了相关文章,欢迎关注《电科金仓》分类:

第一章:基础与入门(13篇)

1、【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路

2、【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路

3、电科金仓2025发布会,国产数据库的AI融合进化与智领未来

4、国产数据库逆袭:老邓的“六大不敢替”被金仓逐一破解

5、《一行代码不改动!用KES V9 2025完成SQL Server → 金仓“平替”迁移并启用向量检索》

6、《赤兔引擎×的卢智能体:电科金仓如何用“三骏架构”重塑AI原生数据库一体机》

7、探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?

8、破除“分布式”迷思:回归数据库选型的本质

9、KDMS V4 一键搞定国产化迁移:零代码、零事故、零熬夜——金仓社区发布史上最省心数据库迁移评估神器

10、KingbaseES V009版本发布:国产数据库的新飞跃

11、从LIS到全院云:浙江省人民医院用KingbaseES打造国内首个多院区异构多活信创样板

12、异构多活+零丢失:金仓KingbaseES在浙人医LIS国产化中的容灾实践

13、金仓KingbaseES数据库:迁移、运维与成本优化的全面解析

第二章:能力与提升(10篇)

1、零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时

2、国产数据库迁移神器,KDMSV4震撼上线

3、在Ubuntu服务器上安装KingbaseES V009R002C012(Orable兼容版)数据库过程详细记录

4、金仓数据库迁移评估系统(KDMS)V4 正式上线:国产化替代的技术底气

5、Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查

6、KingbaseES V009版本发布,新特性代码案例

7、Java连接电科金仓数据库(KingbaseES)实战指南

8、使用 Docker 快速部署 KingbaseES 国产数据库:亲测全过程分享

9、【金仓数据库产品体验官】Oracle兼容性深度体验:从SQL到PL/SQL,金仓KingbaseES如何无缝平替Oracle?

10、KingbaseES在Alibaba Cloud Linux 3 的深度体验,从部署到性能实战

第三章:实践与突破(10篇)

1、国产之光金仓数据库,真能平替MongoDB?实测来了!

2、【金仓数据库产品体验官】实战测评:电科金仓数据库接口兼容性深度体验

3、KingbaseES与MongoDB全面对比:一篇从理论到实战的国产化迁移指南

4、从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

5、ksycopg2实战:Python连接KingbaseES数据库的完整指南

6、KingbaseES:从MySQL兼容到权限隔离与安全增强的跨越

7、电科金仓KingbaseES数据库全面语法解析与应用实践

8、电科金仓国产数据库KingBaseES深度解析:五个一体化的技术架构与实践指南

后期作品正在准备中,敬请关注......

每天一定要吃三顿饭吗?我们的老祖宗每天吃几顿饭?
宫菱、海尔、格兰仕微波炉怎么样?如何选?热卖款测评详解