【金仓数据库】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,操作如下:
- 手动在资源管理器中创建该目录;

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


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 表空间
- 先通过 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';
- 成功验证:执行后若提示
CREATE TABLESPACE,表示表空间创建成功(ksql 对成功的 DDL 语句仅返回操作类型)。

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
执行后会显示类似以下的表格(示例):

1.3.2 2. 查看表空间详情(\db+ 命令)
若需了解表空间的 “大小、使用情况” 等详细信息,在 \db 后加 +,语法如下:
\db+ 表空间名
示例:查看 test_ts 的详情:
\db+ test_ts
执行后会显示类似以下的信息:

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表空间创建成功。

1.4.2 2. 验证表的表空间归属
创建表后,可通过 \d+ 命令查看表的详情,确认表空间是否正确:
\d+ user_info

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;)。

步骤 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)。