CentOS上安装KingbaseES(人大金仓)

前言

金仓数据库管理系统KingbaseES V9是企业级大型通用融合数据库产品

  • 面向全市场,具备三种兼容模式,最新发布版本为 V009R001C002B0014

  • 面向细分市场,高度兼容MySQL,最新发布版本为 V009R003C011

  • 面向细分市场,高度兼容SQLServer,最新发布版本为 V009R004C011

如果项目本身使用的Mysql想切换为KingbaseES版本选择:

V009R003是比V009R001的Mysql模式对Mysql的兼容性更好的。

如果项目使用V009R001就没啥问题就没有必要换V009R003,如果不兼容的地方太多则可以考虑V009R003版本。

更推荐使用V009R001,他是主分支使用的用户会多点。

下载地址

https://download.kingbase.com.cn/xzzx/index.htm

安装包

image-20241009090338803

授权文件选择专业版

image-20241009091420211

授权文件解压后把dat文件上传到/home/kingbase/

准备工作

查看系统语言

1
echo $LANG

修改系统语言

1
export LANG=zh_CN.UTF-8

安装

创建用户

1
2
3
4
5
useradd -m kingbase
# 该命令会同时创建同名用户组kingbase以及用户根目录/home/kingbase

passwd kingbase
#继续运行上方命令设置kingbase用户的密码

创建安装目录并授权

1
2
3
4
5
6
7
#创建安装包目录和安装目录
mkdir -p /data/apps/KingbaseES
mkdir -p /data/db/Kingbase

#赋权
chown -R kingbase:kingbase /data/apps/KingbaseES
chown -R kingbase:kingbase /data/db/Kingbase

挂载安装包

1
mount KingbaseES_V009R001C001B0030_Lin64_install.iso /data/apps/KingbaseES

安装

使用kingbase用户安装

1
2
3
4
su - kingbase   # 切换到安装用户
cd /data/apps/KingbaseES # 进入挂载点目录
ls
./setup.sh -i console # 执行安装脚本,命令行安装

开始会解压安装资源,接下来是软件协议,一直下一步即可。

image-20241009093114661

这点选择完全安装

image-20241009093158935

这一步选择我们下载的授权文件即可

1
/home/kingbase/license_41249_0.dat

接下来选择安装目录
image-20241009093729155

这里输入

1
/data/db/Kingbase

数据目录不变

image-20250220181820548

端口号默认为54321

默认用户名是system,这里改成root,跟Mysql一致。

密码 输入自己的密码

编码设置为UTF-8

image-20241009094347998

数据库模式设置为MySql

image-20241009094503592

大小写敏感,这里为了兼容选择NO

image-20241009094553816

注册服务

这个会注册服务并启动

1
2
su - root
/data/db/Kingbase/install/script/root.sh

测试

查找安装位置

1
find / -name "ksql"

软连接

1
ln -s /data/db/Kingbase/Server/bin/ksql /usr/bin/ksql

连接

人大金仓提供了 ksql 命令行客户端工具,可以使用它来连接本地数据库进行测试。

基本连接命令

1
ksql -U 用户名 -d 数据库名 -h 主机地址 -p 端口号
  • 用户名:数据库的用户名称,默认的超级用户是 system
  • 数据库名:要连接的数据库名称,默认的数据库是 sys
  • 主机地址:本地连接使用 127.0.0.1localhost
  • 端口号:数据库监听的端口号,默认是 54321
1
ksql -p 54321 -U root test

操作

1
2
3
4
5
6
7
8
9
10
11
12
13
列出数据库: \l
列出索引: \di
列出表: \dt
列出表结构:\d 表
查询数据大小写敏感: show case_sensitive
切换数据库: \c dbname
显示字符集:\encoding
退出:\q
查看所有存储过程(函数): \df
查看所有用户 \du
将名下的表指给某个用户:alter table 表名 owner to 指定用戶
创建普通用户:create user 用户名(用户名不带双引号,默认大写) with password '密码';
若创建超级用户需要添加:create user 用户名 with superuser password '密码';

配置文件

配置文件路径

1
cd /data/db/Kingbase/data

kingbase.confkingbase.auto.conf这两个参数文件的读取先后、优先级

  1. 对于kingbase.conf 与 kingbase.auto.conf文件,如果有相同条目,则以kingbase.auto.conf文件参数值为准(忽略 kingbase.conf 相同条目)。
  2. 读取先后顺序:数据库启动时先读取 kingbase.conf,再读取kingbase.auto.conf,如果二者相同条目,会忽略kingbase.conf文件的相同条目。
  3. 所有文件读取完成后,才apply参数,由于kingbase.conf参数读取在前,kingbase.auto.conf读取在后,对于有先后顺序要求的参数必须注意。

开启宽松模式

会话生效

1
2
show sql_mode;
set sql_mode='';

全局生效

修改配置方式

修改kingbase.auto.conf这个配置

1
sql_mode = ''

执行SQL方式

开启宽松模式

1
2
3
4
5
6
7
8
-- 修改全局的 sql_mode 配置,去掉 ONLY_FULL_GROUP_BY 并设置 ANSI_QUOTES
ALTER SYSTEM SET sql_mode = '';

-- 重新加载配置文件,使修改生效
SELECT sys_reload_conf();

-- 查询 sql_mode 系统变量的值
show sql_mode;

默认值

1
ALTER SYSTEM SET sql_mode = 'ONLY_FULL_GROUP_BY,ANSI_QUOTES';

关键字

1
2
3
4
5
6
7
8
-- 修改全局的 exclude_reserved_words 配置
ALTER SYSTEM SET exclude_reserved_words = 'level';

-- 重新加载配置文件,使修改生效
SELECT sys_reload_conf();

-- 查询 exclude_reserved_words 系统变量的值
show exclude_reserved_words;

修改连接数

1
2
3
4
5
show max_connections;

ALTER SYSTEM SET max_connections = 1000;
-- 使修改立即生效
SELECT sys_reload_conf();

注意

设置连接数不生效,也可能是授权的问题,比如开发版的授权最大就是10个连接数。

各个版本对比:

https://download.kingbase.com.cn/xzzx/index.htm

重启

1
2
3
service kingbased stop
lsof -i:54321
service kingbased start

端口开放

数据库端口54321

数据库迁移工具端口54523

授权到期

重新下载授权

找到安装的位置这里是/data/db/Kingbase

替换其中的license.dat

客户端

https://www.sqlynx.com/zh-cn/download/

数据库迁移工具

启动WEB服务

1
cd /data/db/Kingbase/ClientTools/guitools/KDts/KDTS-WEB/bin

启动

1
./startup.sh

可以看到

http://localhost:54523

默认账号密码都是kingbase

停止

1
./shutdown.sh

更换Mysql兼容版

卸载旧版

停止服务

1
service kingbased stop

kingbase用户登录系统后,进入${安装目录}/Uninstall目录,执行如下命令,启动卸载程序

1
2
cd /data/db/Kingbase/Uninstall
sh Uninstaller -i console

解除挂载

1
umount /data/apps/KingbaseES

删除安装目录

1
2
rm -rf /data/apps/KingbaseES
rm -rf /data/db/Kingbase

删除服务

1
2
3
rm -f /etc/systemd/system/kingbase.service
# 重新加载 systemd 配置
systemctl daemon-reload

安装新版

下载

1
wget "https://kingbase.oss-cn-beijing.aliyuncs.com/MySQL -上架/mysql V009R003C011B0003/KingbaseES_V009R003C011B0003_Lin64_install.iso"

创建用户

1
2
3
4
5
useradd -m kingbase
# 该命令会同时创建同名用户组kingbase以及用户根目录/home/kingbase

passwd kingbase
#继续运行上方命令设置kingbase用户的密码

创建安装目录并授权

1
2
3
4
5
6
7
#创建安装包目录和安装目录
mkdir -p /data/apps/KingbaseES
mkdir -p /data/db/Kingbase

#赋权
chown -R kingbase:kingbase /data/apps/KingbaseES
chown -R kingbase:kingbase /data/db/Kingbase

挂载安装包

1
mount KingbaseES_V009R003C011B0003_Lin64_install.iso /data/apps/KingbaseES

使用kingbase用户安装

1
2
3
su - kingbase   # 切换到安装用户
cd /data/apps/KingbaseES # 进入挂载点目录
./setup.sh -i console # 执行安装脚本,命令行安装

如果遇到

1
/tmp does not have enough disk space!

授权文件要重新下载并放在/home/kingbase/

1
/home/kingbase/license_MySQL试用授权.dat

数据库迁移工具

启动WEB服务

1
cd /data/db/Kingbase/ClientTools/guitools/KDts/KDTS-WEB/bin

启动

1
./startup.sh

可以看到

http://localhost:54523

默认账号密码是

  • kingbase
  • Kb_DI@2019

停止

1
./shutdown.sh

用户/角色管理

人大金仓中用户和角色其实是一样的,只不过用户就是拥有登录权限的角色。

角色可以没有登录权限但是可以除登录权限以外的权限赋予给用户。

查看角色/用户

查看角色

1
SELECT rolname,rolcanlogin,rolsuper,rolconnlimit FROM pg_roles;
  • rolname:角色名称。
  • rolsuper:是否为超级用户,t 表示是,f 表示否。
  • rolinherit:是否继承父角色的权限,t 表示是,f 表示否。
  • rolcreaterole:是否可以创建新角色,t 表示是,f 表示否。
  • rolcreatedb:是否可以创建新数据库,t 表示是,f 表示否。
  • rolcanlogin:是否可以登录数据库,t 表示是,f 表示否。
  • rolreplication:是否具有复制权限,t 表示是,f 表示否。
  • rolconnlimit:允许的最大连接数,-1 表示无限制。
  • rolpassword:角色的密码(通常以加密形式存储)。
  • rolvaliduntil:角色密码的有效截止日期。

查看用户

在人大金仓数据库(KingbaseES)中,用户本质上也是一种特殊的角色(具有登录权限的角色)。

1
SELECT rolname,rolcanlogin,rolsuper,rolcreaterole,rolcreatedb,rolconnlimit FROM pg_roles WHERE rolcanlogin = 't';

创建角色

创建角色

1
CREATE ROLE role1;

创建可登录的角色

1
CREATE ROLE role2 WITH LOGIN PASSWORD '123456';

创建特定权限的角色

1
CREATE ROLE role3 WITH LOGIN PASSWORD '123456' CREATEDB CREATEROLE;

创建超级用户角色

1
CREATE ROLE role4 WITH LOGIN PASSWORD '123456' SUPERUSER;

创建特定权限不登录的角色

1
CREATE ROLE role5 CREATEDB CREATEROLE SUPERUSER;

创建新用户

创建用户

1
2
3
4
-- 创建一个名为 new_user 的用户
CREATE USER psvmc WITH PASSWORD '123456';
-- 更大权限的用户
CREATE USER psvmc2 WITH PASSWORD '123456' CREATEDB CREATEROLE;

若要将 test_db 数据库的所有权限赋予用户 psvmc,则执行以下命令:

1
2
3
4
5
6
7
8
# 连接权限
GRANT CONNECT ON DATABASE xhkjedu_school_test TO psvmc;
# 对 public 模式下的所有表拥有包括 SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、TRUNCATE(清空表数据)、REFERENCES(创建外键引用)和 TRIGGER(创建触发器)等在内的所有权限,可以完全控制这些表的数据和结构。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO psvmc;
# 对 public 模式下的所有序列拥有完全的操作权限,如使用序列生成下一个值、查看序列的当前值等。
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO psvmc;
# 在 public 模式下创建新的数据库对象(如表、视图、函数等)以及使用该模式下已有对象的权限。
GRANT ALL PRIVILEGES ON SCHEMA public TO psvmc;

创建超级用户

1
CREATE USER zj SUPERUSER PASSWORD '123456';

用户授予角色

1
GRANT role5 TO zj;

删除用户/角色

因为是同一个表存储的,所以用下面的任一个都能删除用户和角色。

1
2
DROP ROLE role1;
DROP USER role5;

修改密码

连接

1
ksql -U system test -h 127.0.0.1 -p 54321

修改密码

1
ALTER USER system WITH PASSWORD 'new_password';

数据库操作

连接数据库

1
ksql -U system test -h 127.0.0.1 -p 54321

创建数据库时,主要是定义数据库的基本属性,如数据库名称、字符集、排序规则等,并不会直接指定模式。

模式是数据库内部用于组织对象的逻辑结构,在创建数据库时,会默认创建一个 public 模式。

1
CREATE DATABASE abi WITH ENCODING = 'UTF8';

查看库

1
\l

选择库

1
\c abi

查看表

1
2
3
4
5
# 查看所有的表
\dt

# 查看特定模式下的表
\dt public.*

删除库

1
DROP DATABASE db01;

当你创建表时,可以明确指定该表要创建在哪个模式下。

1
2
3
4
5
6
-- 在 custom_schema 模式下创建用户表
CREATE TABLE custom_schema.t_user (
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
age INT
);
  • schema_name:表示要将表创建到的目标模式名称。
  • table_name:是要创建的表的名称。

如果不指定模式,默认会将表创建在 public 模式下。

1
2
3
4
5
CREATE TABLE t_user (
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
age INT
);

删除表

1
2
3
4
5
6
7
8
9
10
11
12
13
DO $$
DECLARE
table_record record;
BEGIN
FOR table_record IN
SELECT tablename
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
AND tablename LIKE 'ACT_%'
LOOP
EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', table_record.tablename);
END LOOP;
END $$;

本地导出导入

添加软链

1
2
ln -s /data/db/Kingbase/KESRealPro/V009R003C011/Server/bin/sys_dump /usr/bin/sys_dump
ln -s /data/db/Kingbase/KESRealPro/V009R003C011/Server/bin/sys_restore /usr/bin/sys_restore

SQL导出导入

导出SQL

1
sys_dump -U root -d xhkjedu_school_test -F p -f /root/xhkjedu_school_test.sql

导入 SQL

连接

1
ksql -U root test

创建数据库

1
CREATE DATABASE xhkjedu_school_2 ENCODING 'UTF8' TEMPLATE template0;

退出 ksql
创建数据库完成后,使用 \l 命令查看数据库列表,可使用 \q 命令退出 ksql 交互界面。

导入

如果之前使用 sys_dump 导出的是 SQL 脚本,可以使用 psql 工具将其导入到目标数据库中。

1
ksql -U root -d xhkjedu_school_2 -f /root/xhkjedu_school_test.sql
  • -U username:指定数据库的用户名。
  • -d dbname:指定要导入数据的数据库名称。
  • -f /path/to/output.sql:指定要导入的 SQL 脚本文件的路径。

压缩与解压

我这使用归档方式导入总是失败,而SQL方式是没问题的。

所以可以采用SQL+压缩的方式,也能节省一半的空间。

压缩

1
tar -czvf xhkjedu_school.sql.tar.gz xhkjedu_school.sql

解压

1
tar -xzvf xhkjedu_school.sql.tar.gz

归档导出导入

归档方式使用自定义格式会比SQL模式小50%左右,使用tar格式大小和SQL相当。

但是

我这使用归档方式导入总是失败,而SQL方式是没问题的。

导出归档

人大金仓的sys_dump支持多种归档格式,主要有自定义格式(-F c)和tar格式(-F t)。

自定义格式(-F c

1
sys_dump -U root -d xhkjedu_school_test -F c -f /root/xhkjedu_school_test.dump

tar格式(-F t

1
sys_dump -U root -d xhkjedu_school_test -F t -f /root/xhkjedu_school_test.tar

导入归档文件

连接

1
ksql -U root test

创建数据库

1
CREATE DATABASE xhkjedu_school_2 ENCODING 'UTF8' TEMPLATE template0;

退出 ksql
创建数据库完成后,使用 \l 命令查看数据库列表,可使用 \q 命令退出 ksql 交互界面。

导入

自定义格式

1
2
3
sys_restore -U root -d xhkjedu_school_2 -F c /root/xhkjedu_school_test.dump

sys_restore -U root -d xhkjedu_school_2 -F c --no-tablespaces -c --if-exists -O -x -j 1 -v /root/xhkjedu_school_test.dump

参数解释

  • -U root:指定以 root 用户身份连接到人大金仓数据库。通常需要确保该用户有足够的权限执行恢复操作。
  • -d xhkjedu_school_2:指定恢复数据的目标数据库为 xhkjedu_school_2。在执行恢复操作前,这个数据库应该已经存在。
  • -F c:指定恢复的归档文件为自定义格式(custom format)。自定义格式是 sys_dump 导出的一种二进制格式,允许在恢复时进行更灵活的操作,比如可以选择只恢复特定的表或模式。
  • --no-tablespaces:该参数表示在恢复过程中不包含表空间信息。使用此参数后,恢复的数据会被放置在数据库的默认表空间中。
  • -c:即 --clean,在恢复数据之前,先删除目标数据库中已存在的与归档文件中同名的数据库对象(如表、索引、视图等)。这样可以确保恢复的数据是全新的,避免与现有数据冲突。
  • --if-exists:通常和 -c 一起使用,它的作用是在删除数据库对象时,如果对象不存在,不会报错,而是继续执行后续操作。
  • -O:即 --no-owner,在恢复过程中,不尝试将数据库对象的所有权设置为归档文件中记录的原始所有者。恢复后的对象所有权将属于执行恢复操作的用户。
  • -x:即 --no-privileges,不恢复权限信息。这意味着恢复后的数据库对象的权限将由执行恢复操作的用户根据需要重新设置。
  • -j 1-j--jobs,用于指定并行恢复的作业数量。这里设置为 1,表示使用单线程进行恢复操作。如果将其设置为大于 1 的数值,例如 -j 4,则会使用 4 个线程并行恢复,以提高恢复速度,但需要注意数据库服务器的硬件资源是否能够支持。
  • -v:即 --verbose,启用详细模式。在恢复过程中,会输出详细的执行信息,方便用户跟踪恢复进度和排查可能出现的问题。
  • /root/xhkjedu_school_test.dump:指定要恢复的归档文件的路径。确保该文件存在且具有可读权限。

tar格式

1
sys_restore -U root -d xhkjedu_school_2 -F t /root/xhkjedu_school_test.tar

日志

日志文件所在路径data/sys_log