
引言
掌握了数据库基本运作之后,要进一步学习"存储方面的表空间"和"逻辑方面的模式",表空间用于规划数据文件的物理存储路径,模式则承担数据库对象(表,视图等)的逻辑隔离功能,二者关联起来可使本地 KingbaseES 数据库的运作更为高效,安全。本文将分两部分细致阐述表空间与模式的创建,查看,使用以及删除流程,并在各步骤给予实际操作案例和防错指引。
@[toc]
一、表空间管理:给数据 "找个合适的存储位置"
表空间在KingbaseES中的"物理存储"体系里属于核心概念,其本质上就是指定数据库文件的存放目录,可以将经常读写的大表安排到高速磁盘所对应的表空间当中,而不常被用到的归档数据则放在普通磁盘所对应的表空间里面,从而来提升磁盘的IO性能,文档里面已经明确了表空间的各项操作步骤,接下来就按照"创建 - 查看 - 使用 - 修改/删除"的顺序展开说明。
1.1 前置准备:确认存储路径与权限
创建表空间之前需满足两个条件,其一,本地存储路径应当事先存在;其二,KingbaseES 的运行用户(默认为 kingbase 用户)要对该路径具备读写权限,此前提在文档中被多次提及,若不然将会出现"权限不足"的错误提示。
1.1.1 1. 创建本地存储路径(以 Linux 为例)
假设我们要创建一个名为 test_ts 的表空间,计划将数据文件存放在 /opt/kingbase/tablespace/test_ts 目录,执行以下命令创建路径(需 root 或有 sudo 权限):
bash
# 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. 基础语法
sql
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库):bashksql -d kingbase -U system -
执行创建表空间命令(Linux 系统):
sqlCREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts';若为 Windows 系统,命令如下(路径用
/分隔):sqlCREATE TABLESPACE test_ts LOCATION 'D:\Tools\Kingbase\ES\tablespace\test_ts'; -
成功验证:执行后若提示
CREATE TABLESPACE,表示表空间创建成功(ksql 对成功的 DDL 语句仅返回操作类型)。

1.2.3 3. 进阶:指定表空间所有者
表空间的默认所有者为当前创建用户(比如 system),如果想要将其他用户(譬如 user1)设为所有者,可以加上 OWNER 这个选项。
sql
CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts' OWNER user1;
这适用于多用户协作场景,确保表空间的权限归属清晰。
1.3 查看表空间:了解存储状态
创建表空间之后,要利用 ksql 命令来查看表空间列表及其详细情况,以此确认路径,大小等相关信息,建议采用 \db 这一系列命令。
1.3.1 1. 查看所有表空间列表(\db 命令)
在 ksql 交互模式下,执行以下命令,可列出本地所有表空间的核心信息:
sql
\db
执行后会显示类似以下的表格(示例): 
1.3.2 2. 查看表空间详情(\db+ 命令)
若需了解表空间的 "大小、使用情况" 等详细信息,在 \db 后加 +,语法如下:
sql
\db+ 表空间名
示例:查看 test_ts 的详情:
sql
\db+ test_ts
执行后会显示类似以下的信息: 
1.4 使用表空间:给表指定存储位置
创建表空间的终极目标是"把表,索引等对象存储到指定路径",文档表明经由使用TABLESPACE选项来指定表空间即可达成创建表时的需求。
1.4.1 1. 示例:在 test_ts 表空间创建表
如果我们要形成一个叫 user_info 的表,并且规定它的数据文件位于 test_ts 表空间当中,可以参考下面这条命令
sql
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+ 命令查看表的详情,确认表空间是否正确:
sql
\d+ user_info

1.5 修改与删除表空间:管理存储生命周期
当表空间的路径需要调整,或不再使用时,需执行修改或删除操作,文档中明确了相关语法和注意事项。
1.5.1 1. 修改表空间(ALTER TABLESPACE)
常用的修改操作包括 "重命名" 和 "修改所有者",语法如下:
-
重命名表空间:
sqlALTER TABLESPACE test_ts RENAME TO new_test_ts;示例中将
test_ts重命名为new_test_ts,执行后提示ALTER TABLESPACE,重命名后原表空间下的表会自动归属到新表空间名(存储路径不变)。 -
修改表空间所有者:
sqlALTER TABLESPACE new_test_ts OWNER TO user1;将表空间所有者从
system改为user1,适用于权限交接场景。
1.5.2 2. 删除表空间(DROP TABLESPACE)
删除表空间属于"高危操作",要保证表空间下没有表,索引之类的任何对象,不然会出现错误,文档里建议先查看表空间的使用状况,然后再去做删除操作。
步骤 1:检查表空间下的对象
执行以下 SQL 语句,查看 new_test_ts 表空间下是否有表
sql
SELECT tablename FROM pg_tables WHERE tablespace = 'new_test_ts';
若返回空结果,说明无表;若有表,需先删除表或迁移表到其他表空间(如 ALTER TABLE 表名 SET TABLESPACE pg_default;)。 
步骤 2:执行删除命令
确认无对象后,执行删除命令(建议加 IF EXISTS 避免删除不存在的表空间报错):
sql
DROP TABLESPACE IF EXISTS new_test_ts;
执行后提示 DROP TABLESPACE,表示删除成功,同时本地存储路径会被保留(需手动删除路径,数据库不会自动删除物理目录)。
1.6 表空间常见问题排查
文档中提到了表空间操作的典型报错,以下是两种高频问题及解决方案:
问题 1:创建表空间报错 "目录权限被拒绝"
报错信息:
plaintext
ERROR: could not set permissions on directory "/opt/kingbase/tablespace/test_ts": Permission denied
原因 :kingbase 用户对存储路径无读写权限。
解决方案:重新执行权限授权命令(Linux 为例):
bash
chown -R kingbase:kingbase /opt/kingbase/tablespace/test_ts
chmod -R 755 /opt/kingbase/tablespace/test_ts
问题 2:删除表空间报错 "表空间非空"
报错信息:
plaintext
ERROR: tablespace "test_ts" is not empty
原因 :表空间下仍有表、索引等对象。
解决方案:先删除或迁移对象,再执行删除命令(参考 1.5.2 步骤 1)。
二、模式管理:给数据库对象 "建个逻辑文件夹"
模式是 KingbaseES 中"逻辑隔离"的核心概念,它类似于数据库里的"文件夹",可以将不同用户的表,视图等对象分开存储,比如 user1 的表放在 schema_user1 模式下,user2 的表放在 schema_user2 模式下,即便表名相同也不会产生冲突,文档里对模式的操作流程有着清晰的阐述,我们按照"创建 - 查看 - 使用 - 权限 - 修改删除"的顺序来展开讲解。
2.1 为什么需要模式?新手必懂的核心作用
在没有创建自定义模式的时候,所有的表会默认保存在 public 模式下(这是系统默认的模式),如果很多用户共同使用一个数据库,就很可能产生"表名冲突"的情况(譬如说两个用户都想创建 user 表),而模式的关键意义就在于此:
- 对象隔离:不同模式下的对象(表、视图)可重名,互不干扰;
- 权限控制方面 ,可以向不同用户赋予不同模式的权限,譬如仅仅允许
user1访问schema_user1 - 管理非常明晰 ,按照业务模块划分的方式,比如
schema_order用于存储订单表,schema_user用于存储用户表。
2.2 创建模式:用 CREATE SCHEMA 语句
文档中给出了模式的创建语法,支持指定所有者、默认权限等,以下是基础和进阶示例:
2.2.1 1. 基础创建:仅指定模式名
在 ksql 交互模式下,执行以下命令创建名为 test_schema 的模式(默认所有者是当前用户):
sql
CREATE SCHEMA test_schema;

执行后提示 CREATE SCHEMA,表示创建成功,该模式会归属到当前连接用户(如 system)。
2.2.2 2. 进阶创建:指定所有者
若需创建一个归属 user1 的模式(让 user1 拥有该模式的所有权限),可添加 AUTHORIZATION 选项:
sql
CREATE SCHEMA test_schema AUTHORIZATION user1;
该命令适用于 "管理员为普通用户创建专属模式" 的场景,避免后续权限配置的麻烦。
2.2.3 3. 特殊场景下,要创建模式并且授权
如果在创建模式的时候还要向其他用户赋予这种模式的使用权,可以利用 GRANT 语句来实现
sql
-- 1. 创建模式,所有者为 system
CREATE SCHEMA test_schema;
-- 2. 给 user1 授予 test_schema 的使用权限和表查询权限
GRANT USAGE, SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;

2.3 查看模式以了解逻辑隔离状态
建模式之后,要利用 ksql 命令来查看模式列表与详情,从而确认创建结果,文档里建议采用 \dn 这一系列命令
2.3.1 1. 在ksql交互模式当中,输入\dn这个命令
在ksql交互模式当中,输入\dn这个命令,就可以显示当前数据库里面包含的所有模式
sql
\dn
执行后会显示类似以下的表格(示例): 
2.3.2 2. 查看模式下的对象
若需了解 test_schema 模式下有哪些表,执行以下命令:
sql
-- 方法1:ksql 专用命令(简洁)
\dt test_schema.*
-- 方法2:SQL 语句(详细)
SELECT tablename FROM pg_tables WHERE schemaname = 'test_schema';
\dt test_schema.*:显示test_schema模式下的所有表;- 若模式下无表,会提示
No relations found.,属于正常情况。
2.4 使用模式:切换与访问对象的关键
切换到访问对象的关键创建模式之后,要想在这个模式里创建表或者访问表,首先得知道"模式搜索路径"这个概念,KingbaseES 会按照搜索路径的顺序去查找相关对象,这个地方新手很容易出错
2.4.1 1. 查看当前模式搜索路径
执行以下命令,查看当前的搜索路径:
sql
SHOW search_path;
默认搜索路径为:
plaintext
search_path = "$user", public

"$user":有一个优先查找与当前用户名同名的模式的情况,比如说当下用户叫 user1,那么它会首先找 user1 这个模式public:如果没有找到同名模式,就要找public模式
2.4.2 2. 更改模式搜索路径,这非常重要,以免找不到对象
如果希望优先访问 test_schema 模式中的对象,可以更改搜索路径
sql
-- 方法1:临时修改(当前会话有效)
SET search_path TO test_schema, public;
-- 方法2:永久修改(当前用户所有会话有效)
ALTER USER current_user SET search_path TO test_schema, public;
-
临时的,关闭 ksql 就会失效,比较适合临时操作。
-
永久修改:需重新连接 ksql 生效,适合长期使用某模式的场景。
显示SET表示修改成功
2.4.3 3. 在模式下创建表
修改搜索路径后,直接创建表会默认存放在 test_schema 模式:
sql
CREATE TABLE user_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
若未修改搜索路径,需在表名前加 "模式名。表名" 指定模式:
sql
CREATE TABLE test_schema.user_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
两种方式创建的表都会归属到 test_schema 模式,可通过 \dt test_schema.* 验证。 
2.4.4 4. 访问模式下的表
访问模式下的表时,有两种方式:
-
修改搜索路径后:直接用表名访问(搜索路径会自动匹配模式)
sqlSELECT * FROM user_info; -
未修改搜索路径:需加 "模式名。表名" 全称访问:
sqlSELECT * FROM test_schema.user_info;
2.5 模式权限控制:精细化管理访问权限
模式的权限控制是其核心价值之一,包括如何通过 GRANT(授予)和 REVOKE(撤销)命令管理权限,常用权限包括 USAGE(访问权限)、CREATE(创建对象权限)、SELECT(查询表权限)等。
2.5.1 1. 授予模式权限(GRANT)
示例 1:给 user1 授予 test_schema 的 "访问权限" 和 "表查询权限":
sql
-- 1. 授予访问模式的权限(必须有,否则无法看到模式下的对象)
GRANT USAGE ON SCHEMA test_schema TO user1;
-- 2. 授予查询模式下所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;

示例 2:给 user1 授予 "在模式下创建表的权限":
sql
GRANT CREATE ON SCHEMA test_schema TO user1;
授予后 user1 可在 test_schema 下创建表,但不能修改其他用户的表。 
2.5.2 2. 撤销模式权限(REVOKE)
若需收回 user1 对 test_schema 的查询权限,执行以下命令:
sql
REVOKE SELECT ON ALL TABLES IN SCHEMA test_schema FROM user1;
撤销后 user1 仍能看到模式下的表,但无法查询数据,实现 "可见不可查" 的控制。
2.6 修改与删除模式:管理逻辑隔离生命周期
当模式名称需要调整或不再使用时,可执行修改或删除操作,文档中明确了相关语法和注意事项。
2.6.1 1. 修改模式(ALTER SCHEMA)
常用的修改操作是 "重命名",语法如下:
sql
ALTER SCHEMA test_schema RENAME TO new_test_schema;
执行后提示 ALTER SCHEMA,重命名后模式下的对象(表、视图)会自动归属到新模式名,无需修改表的归属。
2.6.2 2. 删除模式(DROP SCHEMA)
删除模式前需注意:模式下若有对象(表、视图),直接删除会报错 ,需加 CASCADE 选项级联删除模式及所有对象(高危操作,谨慎使用)。
步骤 1:确认模式下的对象
执行以下命令,查看模式下是否有对象:
sql
\dt new_test_schema.*
若有对象,需确认是否要一并删除(无备份则无法恢复)。
步骤 2:执行删除命令
-
无对象时删除:
sqlDROP SCHEMA IF EXISTS new_test_schema; -
有对象时级联删除(谨慎!会删除模式下所有表):
sqlDROP SCHEMA IF EXISTS new_test_schema CASCADE;
执行后提示 DROP SCHEMA,表示删除成功,模式及相关对象会从数据库中永久移除。
2.7 模式常见问题排查
文档中提到了模式操作的典型报错,以下是两种高频问题及解决方案:
问题 1:找不到模式下的表,报错 "关系对象不存在"
报错信息:
plaintext
ERROR: relation "user_info" does not exist
原因 :模式搜索路径未包含目标模式(如 test_schema 不在搜索路径中),数据库默认在 public 模式查找表。
解决方案:修改搜索路径包含目标模式:
sql
SET search_path TO test_schema, public;
问题 2:无权限访问模式,报错 "模式权限被拒绝"
报错信息:
plaintext
ERROR: permission denied for schema test_schema
原因 :当前用户无 test_schema 的 USAGE 权限。
解决方案 :由模式所有者或管理员授予 USAGE 权限:
sql
GRANT USAGE ON SCHEMA test_schema TO 当前用户名;
三、总结:表空间与模式的配合使用
通过本文的学习,我们掌握了表空间和模式的核心操作:
-
表空间:管 "物理存储",负责数据文件的路径规划,优化 IO 性能;
-
模式:管 "逻辑隔离",负责数据库对象的分类存放,避免冲突、精细化权限控制。
在实际应用时,二者常常一同被采用,创建起"订单业务表空间 ts_order"以及"订单业务模式 schema_order",把与订单有关的表安放于此,如此一来便改善了存储性能,而且使得业务对象的管理更为明晰。
下一篇文章将会依靠表空间和模式,去学习"表的创建与管理",表是数据库存储数据的关键载体,亦是后续执行数据操作的根基所在。