心门守卫免安装绿色中文版
2.9G · 2025-10-27
掌握了数据库基本运作之后,要进一步学习“存储方面的表空间”和“逻辑方面的模式”,表空间用于规划数据文件的物理存储路径,模式则承担数据库对象(表,视图等)的逻辑隔离功能,二者关联起来可使本地 KingbaseES 数据库的运作更为高效,安全。本文将分两部分细致阐述表空间与模式的创建,查看,使用以及删除流程,并在各步骤给予实际操作案例和防错指引。
@[toc]
表空间在KingbaseES中的“物理存储”体系里属于核心概念,其本质上就是指定数据库文件的存放目录,可以将经常读写的大表安排到高速磁盘所对应的表空间当中,而不常被用到的归档数据则放在普通磁盘所对应的表空间里面,从而来提升磁盘的IO性能,文档里面已经明确了表空间的各项操作步骤,接下来就按照“创建 - 查看 - 使用 - 修改/删除”的顺序展开说明。
创建表空间之前需满足两个条件,其一,本地存储路径应当事先存在;其二,KingbaseES 的运行用户(默认为 kingbase 用户)要对该路径具备读写权限,此前提在文档中被多次提及,若不然将会出现“权限不足”的错误提示。
假设我们要创建一个名为 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 用户有读、写、执行权限,其他用户有读和执行权限。若为 Windows 系统,计划将表空间路径设为 D:ToolsKingbaseEStablespacetest_ts,操作如下:
手动在资源管理器中创建该目录;
右键目录→“属性”→“安全”→添加 kingbase 用户(若未创建,需先在 “计算机管理” 中创建),并授予 “完全控制” 权限。
CREATE TABLESPACE 表空间名 LOCATION '本地存储路径';
表空间名:自定义名称(如 test_ts,需符合标识符规则,不能含特殊字符);LOCATION '本地存储路径':必须是提前创建好的路径(如 Linux 的 /opt/kingbase/tablespace/test_ts,Windows 的 'D:/Kingbase/tablespace/test_ts',注意 Windows 路径用 / 或 \)。先通过 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:ToolsKingbaseEStablespacetest_ts';
成功验证:执行后若提示 CREATE TABLESPACE,表示表空间创建成功(ksql 对成功的 DDL 语句仅返回操作类型)。
表空间的默认所有者为当前创建用户(比如 system),如果想要将其他用户(譬如 user1)设为所有者,可以加上 OWNER 这个选项。
CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts' OWNER user1;
这适用于多用户协作场景,确保表空间的权限归属清晰。
创建表空间之后,要利用 ksql 命令来查看表空间列表及其详细情况,以此确认路径,大小等相关信息,建议采用 db 这一系列命令。
在 ksql 交互模式下,执行以下命令,可列出本地所有表空间的核心信息:
db
执行后会显示类似以下的表格(示例):
若需了解表空间的 “大小、使用情况” 等详细信息,在 db 后加 +,语法如下:
db+ 表空间名
示例:查看 test_ts 的详情:
db+ test_ts
执行后会显示类似以下的信息:
创建表空间的终极目标是“把表,索引等对象存储到指定路径”,文档表明经由使用TABLESPACE选项来指定表空间即可达成创建表时的需求。
如果我们要形成一个叫 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 表空间创建成功。
创建表后,可通过 d+ 命令查看表的详情,确认表空间是否正确:
d+ user_info
当表空间的路径需要调整,或不再使用时,需执行修改或删除操作,文档中明确了相关语法和注意事项。
常用的修改操作包括 “重命名” 和 “修改所有者”,语法如下:
重命名表空间:
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,适用于权限交接场景。
删除表空间属于“高危操作”,要保证表空间下没有表,索引之类的任何对象,不然会出现错误,文档里建议先查看表空间的使用状况,然后再去做删除操作。
执行以下 SQL 语句,查看 new_test_ts 表空间下是否有表
SELECT tablename FROM pg_tables WHERE tablespace = 'new_test_ts';
若返回空结果,说明无表;若有表,需先删除表或迁移表到其他表空间(如 ALTER TABLE 表名 SET TABLESPACE pg_default;)。
确认无对象后,执行删除命令(建议加 IF EXISTS 避免删除不存在的表空间报错):
DROP TABLESPACE IF EXISTS new_test_ts;
执行后提示 DROP TABLESPACE,表示删除成功,同时本地存储路径会被保留(需手动删除路径,数据库不会自动删除物理目录)。
文档中提到了表空间操作的典型报错,以下是两种高频问题及解决方案:
报错信息:
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
报错信息:
ERROR: tablespace "test_ts" is not empty
原因:表空间下仍有表、索引等对象。
解决方案:先删除或迁移对象,再执行删除命令(参考 1.5.2 步骤 1)。
模式是 KingbaseES 中“逻辑隔离”的核心概念,它类似于数据库里的“文件夹”,可以将不同用户的表,视图等对象分开存储,比如 user1 的表放在 schema_user1 模式下,user2 的表放在 schema_user2 模式下,即便表名相同也不会产生冲突,文档里对模式的操作流程有着清晰的阐述,我们按照“创建 - 查看 - 使用 - 权限 - 修改删除”的顺序来展开讲解。
在没有创建自定义模式的时候,所有的表会默认保存在 public 模式下(这是系统默认的模式),如果很多用户共同使用一个数据库,就很可能产生“表名冲突”的情况(譬如说两个用户都想创建 user 表),而模式的关键意义就在于此:
user1访问schema_user1schema_order用于存储订单表,schema_user用于存储用户表。文档中给出了模式的创建语法,支持指定所有者、默认权限等,以下是基础和进阶示例:
在 ksql 交互模式下,执行以下命令创建名为 test_schema 的模式(默认所有者是当前用户):
CREATE SCHEMA test_schema;
执行后提示 CREATE SCHEMA,表示创建成功,该模式会归属到当前连接用户(如 system)。
若需创建一个归属 user1 的模式(让 user1 拥有该模式的所有权限),可添加 AUTHORIZATION 选项:
CREATE SCHEMA test_schema AUTHORIZATION user1;
该命令适用于 “管理员为普通用户创建专属模式” 的场景,避免后续权限配置的麻烦。
如果在创建模式的时候还要向其他用户赋予这种模式的使用权,可以利用 GRANT 语句来实现
-- 1. 创建模式,所有者为 system
CREATE SCHEMA test_schema;
-- 2. 给 user1 授予 test_schema 的使用权限和表查询权限
GRANT USAGE, SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;
建模式之后,要利用 ksql 命令来查看模式列表与详情,从而确认创建结果,文档里建议采用 dn 这一系列命令
在ksql交互模式当中,输入dn这个命令,就可以显示当前数据库里面包含的所有模式
dn
执行后会显示类似以下的表格(示例):
若需了解 test_schema 模式下有哪些表,执行以下命令:
-- 方法1:ksql 专用命令(简洁)
dt test_schema.*
-- 方法2:SQL 语句(详细)
SELECT tablename FROM pg_tables WHERE schemaname = 'test_schema';
dt test_schema.*:显示 test_schema 模式下的所有表;No relations found.,属于正常情况。
切换到访问对象的关键创建模式之后,要想在这个模式里创建表或者访问表,首先得知道“模式搜索路径”这个概念,KingbaseES 会按照搜索路径的顺序去查找相关对象,这个地方新手很容易出错
执行以下命令,查看当前的搜索路径:
SHOW search_path;
默认搜索路径为:
search_path = "$user", public
"$user":有一个优先查找与当前用户名同名的模式的情况,比如说当下用户叫 user1,那么它会首先找 user1 这个模式public:如果没有找到同名模式,就要找 public 模式如果希望优先访问 test_schema 模式中的对象,可以更改搜索路径
-- 方法1:临时修改(当前会话有效)
SET search_path TO test_schema, public;
-- 方法2:永久修改(当前用户所有会话有效)
ALTER USER current_user SET search_path TO test_schema, public;
临时的,关闭 ksql 就会失效,比较适合临时操作。
永久修改:需重新连接 ksql 生效,适合长期使用某模式的场景。
显示
SET表示修改成功
修改搜索路径后,直接创建表会默认存放在 test_schema 模式:
CREATE TABLE user_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
若未修改搜索路径,需在表名前加 “模式名。表名” 指定模式:
CREATE TABLE test_schema.user_info (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
两种方式创建的表都会归属到 test_schema 模式,可通过 dt test_schema.* 验证。
访问模式下的表时,有两种方式:
修改搜索路径后:直接用表名访问(搜索路径会自动匹配模式)
SELECT * FROM user_info;
未修改搜索路径:需加 “模式名。表名” 全称访问:
SELECT * FROM test_schema.user_info;
模式的权限控制是其核心价值之一,包括如何通过 GRANT(授予)和 REVOKE(撤销)命令管理权限,常用权限包括 USAGE(访问权限)、CREATE(创建对象权限)、SELECT(查询表权限)等。
示例 1:给 user1 授予 test_schema 的 “访问权限” 和 “表查询权限”:
-- 1. 授予访问模式的权限(必须有,否则无法看到模式下的对象)
GRANT USAGE ON SCHEMA test_schema TO user1;
-- 2. 授予查询模式下所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;
示例 2:给 user1 授予 “在模式下创建表的权限”:
GRANT CREATE ON SCHEMA test_schema TO user1;
授予后 user1 可在 test_schema 下创建表,但不能修改其他用户的表。
若需收回 user1 对 test_schema 的查询权限,执行以下命令:
REVOKE SELECT ON ALL TABLES IN SCHEMA test_schema FROM user1;
撤销后 user1 仍能看到模式下的表,但无法查询数据,实现 “可见不可查” 的控制。
当模式名称需要调整或不再使用时,可执行修改或删除操作,文档中明确了相关语法和注意事项。
常用的修改操作是 “重命名”,语法如下:
ALTER SCHEMA test_schema RENAME TO new_test_schema;
执行后提示 ALTER SCHEMA,重命名后模式下的对象(表、视图)会自动归属到新模式名,无需修改表的归属。
删除模式前需注意:模式下若有对象(表、视图),直接删除会报错,需加 CASCADE 选项级联删除模式及所有对象(高危操作,谨慎使用)。
执行以下命令,查看模式下是否有对象:
dt new_test_schema.*
若有对象,需确认是否要一并删除(无备份则无法恢复)。
无对象时删除:
DROP SCHEMA IF EXISTS new_test_schema;
有对象时级联删除(谨慎!会删除模式下所有表):
DROP SCHEMA IF EXISTS new_test_schema CASCADE;
执行后提示 DROP SCHEMA,表示删除成功,模式及相关对象会从数据库中永久移除。
文档中提到了模式操作的典型报错,以下是两种高频问题及解决方案:
报错信息:
ERROR: relation "user_info" does not exist
原因:模式搜索路径未包含目标模式(如 test_schema 不在搜索路径中),数据库默认在 public 模式查找表。
解决方案:修改搜索路径包含目标模式:
SET search_path TO test_schema, public;
报错信息:
ERROR: permission denied for schema test_schema
原因:当前用户无 test_schema 的 USAGE 权限。
解决方案:由模式所有者或管理员授予 USAGE 权限:
GRANT USAGE ON SCHEMA test_schema TO 当前用户名;
通过本文的学习,我们掌握了表空间和模式的核心操作:
表空间:管 “物理存储”,负责数据文件的路径规划,优化 IO 性能;
模式:管 “逻辑隔离”,负责数据库对象的分类存放,避免冲突、精细化权限控制。
在实际应用时,二者常常一同被采用,创建起“订单业务表空间 ts_order”以及“订单业务模式 schema_order”,把与订单有关的表安放于此,如此一来便改善了存储性能,而且使得业务对象的管理更为明晰。
下一篇文章将会依靠表空间和模式,去学习“表的创建与管理”,表是数据库存储数据的关键载体,亦是后续执行数据操作的根基所在。