【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库

引言

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

一、前置条件:明确 "在哪操作"------ 权限库与连接状态

创建或者管理数据库之前,要先明确两件事,其一,要连上正确的"权限库",各个模式所要求的不尽相同,其二,当前用户需具备足够的权限,创建数据库就要有CREATEDB权限,这在文档里被一再提及,也是防止操作出现错误的重要因素。

1.1 确认连接到 "权限库"

KingbaseES 支持不同兼容模式,不同模式下创建数据库的 "权限库" 要求不同,必须严格区分:

  • 普通模式(默认) :可连接任意已存在的数据库(如默认的 kingbase 库),只要当前用户有创建数据库的权限即可;

  • SQLServer 兼容模式必须连接 master 才能创建新数据库(这是兼容 SQLServer 架构的特殊要求),若当前连接的是其他库,需先切换到 master 库,切换命令:

    sql 复制代码
    \c master

    执行后若提示 You are now connected to database "master" as user "system".,表示切换成功。

1.2 确认当前用户权限(避免 "权限不足" 报错)

创建数据库时,用户应具有 CREATEDB 权限(系统默认管理员用户 system 拥有该权限,普通用户则要手动获取),可经由如下命令来查看当前用户的权限

sql 复制代码
\du 用户名

示例(查看 system 用户权限):

sql 复制代码
\du system

执行之后在属性栏当中,如果存在"创建 DB",就表明具备创建数据库的权限;倘若不存在,则须要管理员(比如 system)运行下面的命令予以授予(以普通用户 user1 为例)

sql 复制代码
ALTER USER user1 CREATEDB;

在完成授权之后再度查看,确保"创建 DB"的权限得以落实。

二、创建本地数据库:两种核心方式(语句 / 工具)

KingbaseES 提供 "SQL 语句" 和 "命令行工具" 两种创建数据库的方式,前者灵活支持自定义配置(如编码、表空间),后者更简洁快速,可根据场景选择。

2.1 方式一:采用 CREATE DATABASE 语句来创建数据库(此方法较为推荐,比较灵活)

CREATE DATABASE 属于 SQL 标准语句,经由"选项"可以自定义数据库属性(譬如编码,默认表空间等),相关文档给出了基本语法及范例,下面是对这些内容的具体分析。

2.1.1 基础语法
sql 复制代码
CREATE DATABASE 数据库名 [WITH 选项];

其中 "选项" 可选,常用选项包括:

  • ENCODING '编码格式':指定数据库字符编码(如 UTF8,避免中文乱码);

  • TABLESPACE 表空间名:指定数据库默认表空间(需提前创建表空间,后续文章讲解);

  • OWNER 用户名:指定数据库所有者(默认是当前创建用户)。

2.1.2 基础示例:创建空白数据库

system 用户身份切换到普通模式并创建一个名为 temp_db 的空白数据库,相关命令如下:

sql 复制代码
CREATE DATABASE temp_db;

执行之后若是出现 CREATE DATABASE 这个提示,就说明创建已经完成(没有错误提示就算成功),ksql 对于完成的 DDL 语句只会返回操作类型,并不会显示其他内容

2.1.3 进阶示例:指定编码创建(避免中文乱码)

如果打算存储中文数据,最好指定 UTF8 编码,可以参考下面这个命令

sql 复制代码
CREATE DATABASE temp_db WITH ENCODING 'UTF8';

执行该命令之后,再运行"查看数据库详情"这样的命令,就可以验证编码是否被正确设置。

2.2 方式二:用 createdb 工具创建(快捷,适合简单场景)

createdb 是 KingbaseES 暴露出来的命令行工具,实际上是 CREATE DATABASE 语句的一种"封装",不用进入 ksql 交互模式就能创建数据库,比较适合用来快速创建一些简单的数据库。

2.2.1 基础语法
bash 复制代码
createdb -U 用户名 -d 父数据库 新数据库名 [选项]

参数说明:

  • -U 用户名:指定执行创建操作的用户(需有 CREATEDB 权限);
  • -d 父数据库:指定 "模板库"(默认用 kingbase 库作为模板,普通模式)或 master 库(SQLServer 兼容模式);
  • 新数据库名:要创建的数据库名称;
  • 选项:与 CREATE DATABASE 一致(如 -E UTF8 指定编码)。
2.2.2 示例:用 createdb 快速创建数据库

在 Linux 终端(无需进入 ksql),用 system 用户基于 kingbase 库创建 temp_db,命令如下:

bash 复制代码
createdb -U system -d kingbase temp_db -E UTF8

执行后若无报错,说明创建成功(createdb 工具成功时无返回信息,报错时才会提示)。

2.2.3 注意事项
  • createdb 工具需在 "系统终端" 执行(Linux 终端、Windows 命令提示符),而非 ksql 交互模式;
  • 若执行 createdb 时提示 "command not found",需先配置 KingbaseES 的环境变量(将 安装目录/Server/bin 路径添加到 PATH 中)。

三、查看本地数据库:了解当前数据库列表与详情

创建数据库之后,要经由 ksql 命令来查看"全部数据库列表"和"单个数据库详情",以此确认创建情况或者管理已有的数据库,包括 \l 一系列命令,属于最为常见的查看方法。

3.1 查看所有数据库列表(\l 命令)

在 ksql 交互模式里,运行如下指令,就能显示本地各个数据库的关键信息(包含名称,所有者,编码,权限等等)。

sql 复制代码
\l

执行后会显示类似以下的表格(示例):

表格中关键信息解读:

  • 名称:数据库名称(确认 temp_db 已存在);
  • 字符编码:字符编码(确认是否为 UTF8);
  • 拥有者:数据库所有者(确认是否为当前用户)。

3.2 筛选查看特定数据库(\l 数据库名称)

如果本地数据库数量较多,可以凭借"数据库名称"立即找到目的数据库,其语法表现为如下形式。

sql 复制代码
\l 数据库名称

示例:筛选名称为 "temp_db" 的数据库

sql 复制代码
\l temp_db

3.3 查看单个数据库详情(\l+ 命令)

如果想要知道数据库有关"存储路径,大小,表空间"等细致情况,就要运行如下命令(在 \l 后面加上 +)。

sql 复制代码
\l+ 数据库名

示例:查看 temp_db 的详情:

sql 复制代码
\l+ temp_db

执行后会显示类似以下的信息:

四、切换本地数据库:在不同库间灵活跳转

切换本地数据库:要操作不同数据库的时候,比如从 kingbase 切换到 temp_db,不必断开连接再重新登录,只要用 \c 命令就能马上完成切换,kingbaseES文档里清楚地记载了这个命令的用法。

4.1 切换命令语法

sql 复制代码
\c 目标数据库名 [用户名]
  • 目标数据库名:要切换到的数据库(必须已存在);
  • 用户名(可选):若需切换用户,可在后面加用户名(如 \c temp_db user1),默认保持当前用户。

4.2 切换示例:从test 切换到 temp_db

当前连接 test 库(提示符为 test=#),执行以下命令切换到 temp_db

sql 复制代码
\c temp_db

执行后若提示以下信息,说明切换成功:

同时,ksql 的提示符会从 test=# 变为 temp_db=#,直观体现当前连接的数据库。

4.3 注意事项

  • 切换数据库之前,如果当前库存在尚未提交的事务,比如未执行 COMMITINSERT 操作,那么在切换的时候会自动回滚该事务,所以事先要确认数据是否已被保存。
  • 目标数据库若不存在,将会出现"database does not exist"这条错误信息,此时要核查数据库名的拼写是否正确。

五、删除本地数据库:谨慎操作,避免数据丢失

谨慎执行删除本地数据库的操作,防止造成数据丢失,删除数据库属于"高危操作",其会把数据库中的全部表以及数据彻底删除,文档特意提示了"删除前的确认流程"和"需注意的语法事项",下面就是安全删除的完整步骤。

5.1 前提:不能连接到要删除的数据库

这是反复强调的关键点 ------无法删除当前正在连接的数据库 ,否则会报错

因此,删除前需先切换到其他数据库(如 kingbasemaster),示例:

若当前连接 temp_db,先切换到 kingbase

sql 复制代码
\c kingbase

确认提示符变为 kingbase=# 后,再执行删除操作。

5.2 删除命令语法

为避免误删,建议加上 IF EXISTS 选项(若数据库不存在,仅提示警告,不报错),语法如下:

sql 复制代码
DROP DATABASE [IF EXISTS] 数据库名;
  • IF EXISTS:可选,防止 "删除不存在的数据库" 报错;
  • 数据库名:要删除的数据库(必须已切换到其他库)。

5.3 删除示例:安全删除 temp_db

sql 复制代码
DROP DATABASE IF EXISTS temp_db;

执行后若提示 DROP DATABASE,表示删除成功

5.4 高危操作提醒(必看)

  1. 备份优先 删除之前,要确认数据库里没有重要数据,或者已经做了备份(KingbaseES 的备份能够用 pg - dump 工具来完成,后面的文章会讲述)。
  2. 避免生产环境误删 :生产环境切勿误删数据库,若要在生产环境删除数据库,则要经过审批流程,建议先利用\l+查看数据库详情,之后再予以删除。
  3. 无法恢复:KingbaseES 没有"回收站"功能,删除的数据无法直接恢复,只能依靠备份

六、常见问题排查:解决创建 / 删除数据库的高频报错

在数据库运作时,常常会碰到创建或者删除数据库时报错的情况,下面列举了三种典型的错误及其解决办法,供新手参考来定位并解决问题。

问题 1:报错 "创建数据库的权限被拒绝"

报错完整信息:

plaintext 复制代码
ERROR:  permission denied to create database

原因:

当前用户没有 CREATEDB 权限(如普通用户 user1 未授予权限)。

解决方案:

  1. 切换到管理员用户 system\c kingbase system);
  2. 执行授权命令:ALTER USER 用户名 CREATEDB;(如 ALTER USER user1 CREATEDB;);
  3. 切换回原用户(\c kingbase user1),重新执行创建命令。

问题 2:删除报错 "数据库正被其他用户访问"

报错完整信息:

plaintext 复制代码
ERROR:  database "temp_db" is being accessed by other users
DETAIL:  There are 2 other sessions using the database.

原因:

有其他会话(如其他终端的 ksql 连接)正在使用要删除的数据库,无法删除。

解决方案:

  1. 查看当前连接 temp_db 的会话:

    sql 复制代码
    SELECT pid, usename, application_name FROM pg_stat_activity WHERE datname = 'temp_db';

    其中 pid 是会话进程 ID;

  2. 终止这些会话(需管理员权限):

    sql 复制代码
    SELECT pg_terminate_backend(进程ID);

    示例:终止 pid 为 1234 的会话:SELECT pg_terminate_backend(1234);

  3. 确认无其他会话后,重新执行删除命令。

问题 3:报错 "无法删除当前打开的数据库"

报错完整信息:

plaintext 复制代码
ERROR:  cannot drop the currently open database

原因:

当前 ksql 会话正在连接要删除的数据库(如要删除 temp_db,但当前连接的就是 temp_db)。

解决方案:

  1. 切换到其他数据库(如 kingbase):\c kingbase
  2. 再次执行删除命令:DROP DATABASE IF EXISTS temp_db;

总结

本文包含本地数据库的"创建,查看,切换,删除"操作,先做"权限库确认"的前置准备,然后灵活选择两种创建方式,最后注意安全删除时的事项,各个环节均符合文档规范,并附有实际操作案例,掌握了这些操作之后,你就具有了管理 KingbaseES 数据存储"顶层容器"的能力,下篇文章将会详细阐述"表空间与模式"的管理,从而更为细致地剖析数据存储的逻辑和物理结构。

相关推荐
努力学习的小廉3 小时前
初识MYSQL —— 数据类型
android·数据库·mysql
MoRanzhi12033 小时前
12. Pandas 数据合并与拼接(concat 与 merge)
数据库·人工智能·python·数学建模·矩阵·数据分析·pandas
William_cl3 小时前
【连载3】MySQL 的 MVCC 机制剖析
数据库·mysql
235163 小时前
【MySQL】MVCC:从核心原理到幻读解决方案
java·数据库·后端·sql·mysql·缓存
zym大哥大3 小时前
高并发内存池
服务器·数据库·windows
. . . . .4 小时前
数据库迁移migration
数据库
shixian10304114 小时前
Django 学习日志
数据库·学习·sqlite
IT 小阿姨(数据库)5 小时前
PostgreSQL通过pg_basebackup物理备份搭建流复制备库(Streaming Replication Standby)
运维·服务器·数据库·sql·postgresql·centos
小蒜学长6 小时前
springboot基于javaweb的小零食销售系统的设计与实现(代码+数据库+LW)
java·开发语言·数据库·spring boot·后端