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

引言

掌握了数据库基本运作之后,要进一步学习"存储方面的表空间"和"逻辑方面的模式",表空间用于规划数据文件的物理存储路径,模式则承担数据库对象(表,视图等)的逻辑隔离功能,二者关联起来可使本地 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,操作如下:

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

  2. 右键目录→"属性"→"安全"→添加 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 表空间
  1. 先通过 ksql 连接本地数据库(如连接 kingbase 库):

    bash 复制代码
    ksql -d kingbase -U system
  2. 执行创建表空间命令(Linux 系统):

    sql 复制代码
    CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts';

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

    sql 复制代码
    CREATE TABLESPACE test_ts LOCATION 'D:\Tools\Kingbase\ES\tablespace\test_ts';
  3. 成功验证:执行后若提示 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)

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

  • 重命名表空间

    sql 复制代码
    ALTER TABLESPACE test_ts RENAME TO new_test_ts;

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

  • 修改表空间所有者

    sql 复制代码
    ALTER 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 表),而模式的关键意义就在于此:

  1. 对象隔离:不同模式下的对象(表、视图)可重名,互不干扰;
  2. 权限控制方面 ,可以向不同用户赋予不同模式的权限,譬如仅仅允许user1访问schema_user1
  3. 管理非常明晰 ,按照业务模块划分的方式,比如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. 访问模式下的表

访问模式下的表时,有两种方式:

  • 修改搜索路径后:直接用表名访问(搜索路径会自动匹配模式)

    sql 复制代码
    SELECT * FROM user_info;
  • 未修改搜索路径:需加 "模式名。表名" 全称访问:

    sql 复制代码
    SELECT * 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)

若需收回 user1test_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:执行删除命令
  • 无对象时删除

    sql 复制代码
    DROP SCHEMA IF EXISTS new_test_schema;
  • 有对象时级联删除(谨慎!会删除模式下所有表):

    sql 复制代码
    DROP 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_schemaUSAGE 权限。
解决方案 :由模式所有者或管理员授予 USAGE 权限:

sql 复制代码
GRANT USAGE ON SCHEMA test_schema TO 当前用户名;

三、总结:表空间与模式的配合使用

通过本文的学习,我们掌握了表空间和模式的核心操作:

  • 表空间:管 "物理存储",负责数据文件的路径规划,优化 IO 性能;

  • 模式:管 "逻辑隔离",负责数据库对象的分类存放,避免冲突、精细化权限控制。

在实际应用时,二者常常一同被采用,创建起"订单业务表空间 ts_order"以及"订单业务模式 schema_order",把与订单有关的表安放于此,如此一来便改善了存储性能,而且使得业务对象的管理更为明晰。

下一篇文章将会依靠表空间和模式,去学习"表的创建与管理",表是数据库存储数据的关键载体,亦是后续执行数据操作的根基所在。

相关推荐
程序新视界5 小时前
详解MySQL两种存储引擎MyISAM和InnoDB的优缺点
数据库·后端·mysql
半路_出家ren6 小时前
设计一个学生管理系统的数据库
linux·数据库·sql·mysql·网络安全·数据库管理员
金仓拾光集8 小时前
筑牢风控生命线:金仓数据库替代MongoDB,重构证券融资融券业务的数据基石
数据库·mongodb·信创·1024程序员节·kingbasees·国产化替代
那我掉的头发算什么8 小时前
【数据库】navicat的下载以及数据库约束
android·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
纪伊路上盛名在8 小时前
如何批量获取蛋白质序列的所有结构域(domain)数据-2
数据库·人工智能·机器学习·统计·计算生物学·蛋白质
2301_772093569 小时前
高并发webserver_interview
运维·服务器·数据库·后端·网络协议·mysql·wireshark
大G的笔记本11 小时前
MySQL 大表查询优化、超大分页处理、SQL 慢查询优化、主键选择
数据库·sql·mysql
Lear11 小时前
Redis 持久化机制
数据库
儒道易行11 小时前
【攻防实战】Redis未授权RCE联动metasploit打穿三层内网(上)
数据库·redis·网络安全·缓存