引言
掌握了 ksql 对接本地 KingbaseES 数据库的基本操作之后,接下来要学习的是'数据库自身的运作'。数据库是数据存储的顶级容器,所有的表、视图等对象均依托数据库而存在。本文将会细致阐述怎样经由 ksql 命令行来完成本地数据库从'创建、查看、切换到删除'的全部操作,各个步骤均配有具体的实例以及需要注意的地方,从而保证初学者能够顺利实施。
介绍金仓数据库(KingbaseES)中通过 ksql 命令行进行本地数据库管理的完整流程。内容包括前置权限确认(连接权限库及 CREATEDB 权限)、两种创建方式(CREATE DATABASE 语句与 createdb 工具)、查看列表与详情(\l 命令)、切换数据库(\c 命令)以及安全删除操作(DROP DATABASE)。此外还涵盖了常见报错排查,如权限拒绝、会话占用及当前库无法删除等问题,帮助开发者规范管理数据库生命周期。

掌握了 ksql 对接本地 KingbaseES 数据库的基本操作之后,接下来要学习的是'数据库自身的运作'。数据库是数据存储的顶级容器,所有的表、视图等对象均依托数据库而存在。本文将会细致阐述怎样经由 ksql 命令行来完成本地数据库从'创建、查看、切换到删除'的全部操作,各个步骤均配有具体的实例以及需要注意的地方,从而保证初学者能够顺利实施。

创建或者管理数据库之前,要先明确两件事:其一,要连上正确的'权限库',不同模式所要求的不尽相同;其二,当前用户需具备足够的权限,创建数据库要有 CREATEDB 权限,这在文档里被一再提及,也是防止操作出现错误的重要因素。
KingbaseES 支持不同兼容模式,不同模式下创建数据库的'权限库'要求不同,必须严格区分:
kingbase 库),只要当前用户有创建数据库的权限即可;master 库才能创建新数据库(这是兼容 SQLServer 架构的特殊要求)。若当前连接的是其他库,需先切换到 master 库,切换命令:\c master
执行后若提示 You are now connected to database "master" as user "system".,表示切换成功。
创建数据库时,用户应具有 CREATEDB 权限(系统默认管理员用户 system 拥有该权限,普通用户则要手动获取),可经由如下命令来查看当前用户的权限:
\du 用户名
示例(查看 system 用户权限):
\du system
执行之后在属性栏当中,如果存在'创建 DB',就表明具备创建数据库的权限;倘若不存在,则须要管理员(比如 system)运行下面的命令予以授予(以普通用户 user1 为例):
ALTER USER user1 CREATEDB;
在完成授权之后再度查看,确保'创建 DB'的权限得以落实。
KingbaseES 提供'SQL 语句'和'命令行工具'两种创建数据库的方式,前者灵活支持自定义配置(如编码、表空间),后者更简洁快速,可根据场景选择。
CREATE DATABASE 属于 SQL 标准语句,经由'选项'可以自定义数据库属性(譬如编码、默认表空间等),相关文档给出了基本语法及范例,下面是对这些内容的具体分析。
CREATE DATABASE 数据库名 [WITH 选项];
其中'选项'可选,常用选项包括:
ENCODING '编码格式':指定数据库字符编码(如 UTF8,避免中文乱码);TABLESPACE 表空间名:指定数据库默认表空间(需提前创建表空间,后续文章讲解);OWNER 用户名:指定数据库所有者(默认是当前创建用户)。以 system 用户身份切换到普通模式并创建一个名为 temp_db 的空白数据库,相关命令如下:
CREATE DATABASE temp_db;

执行之后若是出现 CREATE DATABASE 这个提示,就说明创建已经完成(没有错误提示就算成功),ksql 对于完成的 DDL 语句只会返回操作类型,并不会显示其他内容。
如果打算存储中文数据,最好指定 UTF8 编码,可以参考下面这个命令:
CREATE DATABASE temp_db WITH ENCODING 'UTF8';

执行该命令之后,再运行'查看数据库详情'这样的命令,就可以验证编码是否被正确设置。
createdb 是 KingbaseES 暴露出来的命令行工具,实际上是 CREATE DATABASE 语句的一种'封装',不用进入 ksql 交互模式就能创建数据库,比较适合用来快速创建一些简单的数据库。
createdb -U 用户名 -d 父数据库 新数据库名 [选项]
参数说明:
-U 用户名:指定执行创建操作的用户(需有 CREATEDB 权限);-d 父数据库:指定'模板库'(默认用 kingbase 库作为模板,普通模式)或 master 库(SQLServer 兼容模式);新数据库名:要创建的数据库名称;CREATE DATABASE 一致(如 -E UTF8 指定编码)。在 Linux 终端(无需进入 ksql),用 system 用户基于 kingbase 库创建 temp_db,命令如下:
createdb -U system -d kingbase temp_db -E UTF8
执行后若无报错,说明创建成功(createdb 工具成功时无返回信息,报错时才会提示)。
createdb 工具需在'系统终端'执行(Linux 终端、Windows 命令提示符),而非 ksql 交互模式;createdb 时提示'command not found',需先配置 KingbaseES 的环境变量(将 安装目录/Server/bin 路径添加到 PATH 中)。创建数据库之后,要经由 ksql 命令来查看'全部数据库列表'和'单个数据库详情',以此确认创建情况或者管理已有的数据库,包括 一系列命令,属于最为常见的查看方法。
在 ksql 交互模式里,运行如下指令,就能显示本地各个数据库的关键信息(包含名称、所有者、编码、权限等等)。
\l
执行后会显示类似以下的表格(示例):

表格中关键信息解读:
名称:数据库名称(确认 temp_db 已存在);字符编码:字符编码(确认是否为 UTF8);拥有者:数据库所有者(确认是否为当前用户)。如果本地数据库数量较多,可以凭借'数据库名称'立即找到目的数据库,其语法表现为如下形式。
\l 数据库名称
示例:筛选名称为'temp_db'的数据库
\l temp_db

如果想要知道数据库有关'存储路径、大小、表空间'等细致情况,就要运行如下命令(在 \l 后面加上 +)。
\l+ 数据库名
示例:查看 temp_db 的详情:
\l+ temp_db
执行后会显示类似以下的信息:

切换本地数据库:要操作不同数据库的时候,比如从 kingbase 切换到 temp_db,不必断开连接再重新登录,只要用 \c 命令就能马上完成切换,kingbaseES 文档里清楚地记载了这个命令的用法。
\c 目标数据库名 [用户名]
目标数据库名:要切换到的数据库(必须已存在);用户名(可选):若需切换用户,可在后面加用户名(如 \c temp_db user1),默认保持当前用户。当前连接 test 库(提示符为 test=#),执行以下命令切换到 temp_db:
\c temp_db
执行后若提示以下信息,说明切换成功:

同时,ksql 的提示符会从 test=# 变为 temp_db=#,直观体现当前连接的数据库。
COMMIT 的 INSERT 操作,那么在切换的时候会自动回滚该事务,所以事先要确认数据是否已被保存。谨慎执行删除本地数据库的操作,防止造成数据丢失。删除数据库属于'高危操作',其会把数据库中的全部表以及数据彻底删除,文档特意提示了'删除前的确认流程'和'需注意的语法事项',下面就是安全删除的完整步骤。
这是反复强调的关键点——无法删除当前正在连接的数据库,否则会报错:

因此,删除前需先切换到其他数据库(如 kingbase 或 master),示例:
若当前连接 temp_db,先切换到 kingbase:
\c kingbase
确认提示符变为 kingbase=# 后,再执行删除操作。
为避免误删,建议加上 IF EXISTS 选项(若数据库不存在,仅提示警告,不报错),语法如下:
DROP DATABASE IF EXISTS 数据库名;
IF EXISTS:可选,防止'删除不存在的数据库'报错;数据库名:要删除的数据库(必须已切换到其他库)。DROP DATABASE IF EXISTS temp_db;
执行后若提示 DROP DATABASE,表示删除成功:

pg_dump 工具来完成,后面的文章会讲述)。\l+ 查看数据库详情,之后再予以删除。在数据库运作时,常常会碰到创建或者删除数据库时报错的情况,下面列举了三种典型的错误及其解决办法,供新手参考来定位并解决问题。
报错完整信息:
ERROR: permission denied to create database
原因:
当前用户没有 CREATEDB 权限(如普通用户 user1 未授予权限)。
解决方案:
system(\c kingbase system);ALTER USER 用户名 CREATEDB;(如 ALTER USER user1 CREATEDB;);\c kingbase user1),重新执行创建命令。报错完整信息:
ERROR: database "temp_db" is being accessed by other users DETAIL: There are 2 other sessions using the database.
原因:
有其他会话(如其他终端的 ksql 连接)正在使用要删除的数据库,无法删除。
解决方案:
终止这些会话(需管理员权限):
SELECT pg_terminate_backend(进程 ID);
示例:终止 pid 为 1234 的会话:SELECT pg_terminate_backend(1234);;
查看当前连接 temp_db 的会话:
SELECT pid, usename, application_name FROM pg_stat_activity WHERE datname ='temp_db';
其中 pid 是会话进程 ID;
报错完整信息:
ERROR: cannot drop the currently open database
原因:
当前 ksql 会话正在连接要删除的数据库(如要删除 temp_db,但当前连接的就是 temp_db)。
解决方案:
kingbase):\c kingbase;DROP DATABASE IF EXISTS temp_db;。本文包含本地数据库的'创建、查看、切换、删除'操作,先做'权限库确认'的前置准备,然后灵活选择两种创建方式,最后注意安全删除时的事项,各个环节均符合文档规范,并附有实际操作案例。掌握了这些操作之后,你就具有了管理 KingbaseES 数据存储'顶层容器'的能力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online