【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

一、表空间管理:给数据 “找个合适的存储位置”

表空间在KingbaseES中的“物理存储”体系里属于核心概念,其本质上就是指定数据库文件的存放目录,可以将经常读写的大表安排到高速磁盘所对应的表空间当中,而不常被用到的归档数据则放在普通磁盘所对应的表空间里面,从而来提升磁盘的IO性能,文档里面已经明确了表空间的各项操作步骤,接下来就按照“创建 - 查看 - 使用 - 修改/删除”的顺序展开说明。

1.1 前置准备:确认存储路径与权限
创建表空间之前需满足两个条件,其一,本地存储路径应当事先存在;其二,KingbaseES 的运行用户(默认为 kingbase 用户)要对该路径具备读写权限,此前提在文档中被多次提及,若不然将会出现“权限不足”的错误提示。

1.1.1 1. 创建本地存储路径(以 Linux 为例)
假设我们要创建一个名为 test_ts 的表空间,计划将数据文件存放在 /opt/kingbase/tablespace/test_ts 目录,执行以下命令创建路径(需 root 或有 sudo 权限):
# 1. 创建多级目录
mkdir -p /opt/kingbase/tablespace/test_ts
# 2. 给 kingbase 用户授权(关键!否则数据库无法读写该路径)
chown -R kingbase:kingbase /opt/kingbase/tablespace/test_ts
chmod -R 755 /opt/kingbase/tablespace/test_ts

  • mkdir -p:创建多级目录,即使上级目录不存在也能成功;
  • chown -R:将路径的所有者改为 kingbase 用户(数据库运行用户);
  • chmod -R 755:确保 kingbase 用户有读、写、执行权限,其他用户有读和执行权限。
1.1.2 2. Windows 系统路径准备

若为 Windows 系统,计划将表空间路径设为 D:\Tools\Kingbase\ES\tablespace\test_ts,操作如下:

  1. 手动在资源管理器中创建该目录;

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

右键目录→“属性”→“安全”→添加 kingbase 用户(若未创建,需先在 “计算机管理” 中创建),并授予 “完全控制” 权限。

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.2 创建表空间:用 CREATE TABLESPACE 语句

1.2.1 1. 基础语法

CREATE TABLESPACE 表空间名 LOCATION '本地存储路径';

表空间名:自定义名称(如 test_ts,需符合标识符规则,不能含特殊字符);
LOCATION '本地存储路径':必须是提前创建好的路径(如 Linux 的 /opt/kingbase/tablespace/test_ts,Windows 的 'D:/Kingbase/tablespace/test_ts',注意 Windows 路径用 / 或 \\)。

1.2.2 2. 实操示例:创建 test_ts 表空间
  1. 先通过 ksql 连接本地数据库(如连接 kingbase 库):

ksql -d kingbase -U system

执行创建表空间命令(Linux 系统):

CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts';

若为 Windows 系统,命令如下(路径用 / 分隔):

CREATE TABLESPACE test_ts LOCATION 'D:\Tools\Kingbase\ES\tablespace\test_ts';

  1. 成功验证:执行后若提示 CREATE TABLESPACE,表示表空间创建成功(ksql 对成功的 DDL 语句仅返回操作类型)。

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.2.3 3. 进阶:指定表空间所有者

表空间的默认所有者为当前创建用户(比如 system),如果想要将其他用户(譬如 user1)设为所有者,可以加上 OWNER 这个选项。

CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts' OWNER user1;

这适用于多用户协作场景,确保表空间的权限归属清晰。

1.3 查看表空间:了解存储状态
创建表空间之后,要利用 ksql 命令来查看表空间列表及其详细情况,以此确认路径,大小等相关信息,建议采用 \db 这一系列命令。

1.3.1 1. 查看所有表空间列表(\db 命令)
在 ksql 交互模式下,执行以下命令,可列出本地所有表空间的核心信息:
\db

执行后会显示类似以下的表格(示例):

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.3.2 2. 查看表空间详情(\db+ 命令)

若需了解表空间的 “大小、使用情况” 等详细信息,在 \db 后加 +,语法如下:

\db+ 表空间名

示例:查看 test_ts 的详情:

\db+ test_ts

执行后会显示类似以下的信息:

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.4 使用表空间:给表指定存储位置
创建表空间的终极目标是“把表,索引等对象存储到指定路径”,文档表明经由使用TABLESPACE选项来指定表空间即可达成创建表时的需求。

1.4.1 1. 示例:在 test_ts 表空间创建表
如果我们要形成一个叫 user_info 的表,并且规定它的数据文件位于 test_ts 表空间当中,可以参考下面这条命令
CREATE TABLE user_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
) TABLESPACE test_ts;

  • TABLESPACE test_ts:关键选项,指定表的存储表空间;
  • 执行之后会提示 CREATE TABLE,这表明表已在 test_ts 表空间创建成功。

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.4.2 2. 验证表的表空间归属

创建表后,可通过 \d+ 命令查看表的详情,确认表空间是否正确:

\d+ user_info

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

1.5 修改与删除表空间:管理存储生命周期

当表空间的路径需要调整,或不再使用时,需执行修改或删除操作,文档中明确了相关语法和注意事项。

1.5.1 1. 修改表空间(ALTER TABLESPACE)

常用的修改操作包括 “重命名” 和 “修改所有者”,语法如下:

重命名表空间

ALTER TABLESPACE test_ts RENAME TO new_test_ts;

示例中将 test_ts 重命名为 new_test_ts,执行后提示 ALTER TABLESPACE,重命名后原表空间下的表会自动归属到新表空间名(存储路径不变)。

修改表空间所有者

ALTER TABLESPACE new_test_ts OWNER TO user1;

将表空间所有者从 system 改为 user1,适用于权限交接场景。

1.5.2 2. 删除表空间(DROP TABLESPACE)
删除表空间属于“高危操作”,要保证表空间下没有表,索引之类的任何对象,不然会出现错误,文档里建议先查看表空间的使用状况,然后再去做删除操作。

步骤 1:检查表空间下的对象
执行以下 SQL 语句,查看 new_test_ts 表空间下是否有表
SELECT tablename FROM pg_tables WHERE tablespace = 'new_test_ts';

若返回空结果,说明无表;若有表,需先删除表或迁移表到其他表空间(如 ALTER TABLE 表名 SET TABLESPACE pg_default;)。

【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

步骤 2:执行删除命令

确认无对象后,执行删除命令(建议加 IF EXISTS 避免删除不存在的表空间报错):

DROP TABLESPACE IF EXISTS new_test_ts;

执行后提示 DROP TABLESPACE,表示删除成功,同时本地存储路径会被保留(需手动删除路径,数据库不会自动删除物理目录)。

1.6 表空间常见问题排查
文档中提到了表空间操作的典型报错,以下是两种高频问题及解决方案:

问题 1:创建表空间报错 “目录权限被拒绝”
报错信息:
ERROR: could not set permissions on directory "/opt/kingbase/tablespace/test_ts": Permission denied
原因kingbase 用户对存储路径无读写权限。
解决方案:重新执行权限授权命令(Linux 为例):

chown -R kingbase:kingbase /opt/kingbase/tablespace/test_ts
chmod -R 755 /opt/kingbase/tablespace/test_ts

问题 2:删除表空间报错 “表空间非空”

报错信息

ERROR: tablespace "test_ts" is not empty

原因:表空间下仍有表、索引等对象。
解决方案:先删除或迁移对象,再执行删除命令(参考 1.5.2 步骤 1)。

阅读剩余
THE END