掌握KingbaseES的ksql工具:命令行操作数据库的效率秘诀
2026/5/21 19:05:28 网站建设 项目流程

掌握KingbaseES的ksql工具:命令行操作数据库的效率秘诀

前言

说实话,图形化工具确实好看,但真到了排查问题、批量跑数据、写自动化脚本的时候,还是命令行最靠谱。
ksql就是数据库自带的命令行工具。你拿它执行SQL、管理表和索引、格式化输出、跑脚本文件——甚至不用退出ksql就能直接敲操作系统的命令。说白了,掌握ksql,你就相当于拿到了直接跟数据库"对话"的钥匙。
这篇文章从头到尾把ksql的用法捋了一遍,每个环节都带实际能跑的代码。不管你是刚接触还是已经用了很久,都能在里面找到有用的东西。

文章目录
  • 前言
    • 一、连接数据库:方式比你想象的多
      • 1.1 基本连接:四个参数搞定
      • 1.2 用URI或连接字符串
      • 1.3 用服务名连接——更省事
      • 1.4 环境变量:一劳永逸
      • 1.5 退出ksql
    • 二、执行SQL:分号是触发器
      • 2.1 交互式:想怎么换行就怎么换
      • 2.2 自定义结束符
      • 2.3 不进交互模式,直接跑SQL
      • 2.4 执行SQL脚本文件
      • 2.5 管道输入
    • 三、元命令:ksql的真正杀手锏
      • 3.1 先记住怎么查帮助
      • 3.2 /d家族:数据库的X光机
      • 3.3 数据库和连接管理
      • 3.4 更多查看命令
      • 3.5 查看视图定义
    • 四、变量:让脚本"活"起来
      • 4.1 基本用法:设变量、用变量
      • 4.2 把查询结果存进变量
      • 4.3 实战:把文件内容插进数据库
      • 4.4 内置变量一览
    • 五、事务控制:别让数据改了没法回
      • 5.1 自动提交 vs 手动提交
      • 5.2 事务隔离级别
    • 六、输出格式化:别让结果看着难受
      • 6.1 五种输出格式随意切
      • 6.2 /pset:精细控制输出样式
      • 6.3 输出重定向:存文件或管道
    • 七、脚本技巧:让重复工作一次搞定
      • 7.1 编写日常报表脚本
      • 7.2 条件判断:根据结果走不同分支
      • 7.3 批量生成SQL并执行
      • 7.4 单事务包裹整个脚本
    • 八、性能诊断:ksql里的调优利器
      • 8.1 计时:看每条SQL跑多久
      • 8.2 看执行计划
      • 8.3 看元命令背后的SQL
      • 8.4 用/gdesc看查询结构
    • 九、编辑与快捷操作
      • 9.1 用外部编辑器写长SQL
      • 9.2 Tab键补全
      • 9.3 命令历史
      • 9.4 不用退出ksql就能敲系统命令
    • 十、安全:密码和权限
      • 10.1 改密码
      • 10.2 用户和权限管理
    • 十一、命令行参数速查表
      • 实用组合
    • 十二、个性化配置:打造你专属的ksql
      • 12.1 启动文件
      • 12.2 自定义提示符
    • 十三、踩坑与应对
      • 13.1 SQL跑太久,想停掉
      • 13.2 SQL写错了,想重写
      • 13.3 报错信息不够详细
      • 13.4 Windows下中文乱码
      • 13.5 查看当前数据库编码
    • 总结:一张图掌握ksql日常操作

一、连接数据库:方式比你想象的多

连数据库这事儿,看起来就是一行命令,其实有不少门道。

1.1 基本连接:四个参数搞定

连接需要四个信息:主机地址、端口、数据库名、用户名。分别对应-h-p-d-U四个参数。但不是每个都得写——本地连接不用-h,默认端口不用-p

# 完整写法 ksql -h 10.11.0.11 -p 54321 -d kingbase -U Alice # 连本机的数据库,省掉主机地址 ksql -p 54321 -d kingbase -U Alice # 端口也是默认的54321?再省一个 ksql -d kingbase -U Alice # 最偷懒的写法——位置参数 ksql kingbase Alice

连上之后你会看到这样的画面:

ksql (V9.0) Type "help" for help. kingbase=#

这里kingbase是数据库名,#说明你是超级用户。普通用户显示的是>

1.2 用URI或连接字符串

参数太多了记不住?可以把所有连接信息拼成一个字符串:

# URI格式 ksql kingbase://dbmaster:5433/mydb?sslmode=require # key=value格式 ksql "hostaddr=127.0.0.1 port=54321 user=system dbname=test"

Windows用户注意:参数用引号时务必用双引号,单引号可能解析出错。

1.3 用服务名连接——更省事

先在sys_service.conf里配好连接信息,之后用"别名"就能直接连:

# 配置文件 sys_service.conf [kingbase] host=192.168.0.1 dbname=test port=54321 # 以后这样连就行了 ksql usr1/123456@127.0.0.1/serviceName1
1.4 环境变量:一劳永逸

天天连同一个库,每次敲参数太累了。把连接信息存到环境变量里,以后一个ksql就够了:

export KINGBASE_HOST=10.11.0.11 export KINGBASE_PORT=54321 export KINGBASE_DATABASE=test export KINGBASE_USER=Alice # 现在只要输入这个 ksql
环境变量干啥的
KINGBASE/_HOST默认主机
KINGBASE/_PORT默认端口
KINGBASE/_DATABASE默认数据库
KINGBASE/_USER默认用户名
还可以建个.kbpass文件存密码,彻底告别手动输密码:
# ~/.kbpass hostname:port:database:username:password 10.11.0.11:54321:test:Alice:my_password
1.5 退出ksql

三种姿势任选:

/q -- 最常用 QUIT -- 也可以 -- Ctrl+Z -- 快捷键也行

二、执行SQL:分号是触发器

进到ksql之后,就是敲SQL的天下了。核心规则就一条:碰到分号才执行

2.1 交互式:想怎么换行就怎么换
test=# SELECT a, b FROM t1; a | b ---+--- 1 | 2 3 | 4 (2 rows)

因为只有分号才会触发执行,所以你完全可以把一条SQL拆成几行来写:

test=# SELECT * test-# FROM orders test-# WHERE order_id > 100 test-# ORDER BY order_date;

注意到提示符变了吗?第一行是=#,后面的行变成了-#。这是ksql在跟你说:“你上一句还没输完呢,我等着。”

2.2 自定义结束符

写存储过程的时候,函数体里面到处都是分号,这时候分号就不能当结束符了。怎么办?换一个呗:

-- 把结束符改成 / /set SQLTERM / CREATE OR REPLACE FUNCTION add_log(p_msg VARCHAR2) RETURNS VOID AS BEGIN INSERT INTO sys_log(message, created_at) VALUES(p_msg, CURRENT_TIMESTAMP); END; / -- 改回默认的分号 /set SQLTERM ; -- 调用函数 SELECT add_log('系统启动');

MySQL模式下也能用DELIMITER

DELIMITER // CREATE TABLE t2(id int, age int) // INSERT INTO t2 VALUES(1, 18) // SELECT * FROM t2 // DELIMITER ;
2.3 不进交互模式,直接跑SQL

很多时候你根本不需要进入交互界面,一条命令搞定就走:

# 执行一条SQL,显示结果就退出 ksql -d test -U system -c "SELECT count(*) FROM orders;" # 执行多条(每个-c各一条) ksql -c '/x' -c 'SELECT * FROM foo;' # 安静模式:只输出结果,不要提示信息 ksql -d test -q -c "SELECT count(*) FROM orders;"
2.4 执行SQL脚本文件

批量操作最常用的方式——把SQL写进文件,一次性执行:

# 先准备好脚本文件 test.sql cat > test.sql << 'EOF' CREATE TABLE employees ( emp_id INT PRIMARY KEY, emp_name VARCHAR2(50) NOT NULL, dept VARCHAR2(30), hire_date DATE DEFAULT CURRENT_DATE ); INSERT INTO employees VALUES(1, '张三', '技术部', '2024-01-15'); INSERT INTO employees VALUES(2, '李四', '市场部', '2024-02-20'); INSERT INTO employees VALUES(3, '王五', '技术部', '2024-03-10'); SELECT dept, COUNT(*) AS headcount FROM employees GROUP BY dept ORDER BY headcount DESC; EOF # 执行脚本 ksql -p 54321 -d test -f test.sql

执行结果:

CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 dept | headcount ---------+----------- 技术部 | 2 市场部 | 1 (2 rows)

在ksql内部也能用/i命令跑脚本:

test=# /i test.sql

/ir/i的"相对路径版",在脚本里嵌套调用其他脚本时更好用——它按当前脚本所在目录去找文件,而不是按你的工作目录:

-- 在脚本里引用同目录下的另一个脚本 /ir sub_scripts/init_data.sql
2.5 管道输入

跟shell配合使用,灵活度更高:

# 用echo把SQL管道给ksql echo '/x // SELECT * FROM foo;' | ksql # 用heredoc写多行SQL ksql <<EOF /timing on SELECT * FROM orders WHERE order_date = CURRENT_DATE; EOF

三、元命令:ksql的真正杀手锏

这是ksql跟普通SQL客户端最大的区别。所有以/开头的命令都是"元命令"——它们由ksql自己处理,不用发给数据库服务器。速度快,功能强,熟练了之后根本离不开。

3.1 先记住怎么查帮助
-- 看ksql元命令的帮助 /? -- 看SQL语法的帮助 /h -- 查某个具体SQL怎么写 /h CREATE TABLE
3.2 /d家族:数据库的X光机

这是用得最频繁的一组命令,没有之一。
查看表结构——最常用的功能:

/d orders
Table "public.orders" Column | Type | Collation | Nullable | Default ---------------+--------------------------+-----------+----------+-------- order_id | integer | | not null | customer_name | character varying(10) | | not null | employee_id | integer | | | order_date | date | | |

看更多信息——加个+号就行,索引、大小、注释全出来:

/d+ orders

列出各类对象——按需筛选:

/dt -- 所有表 /di -- 所有索引 /dv -- 所有视图 /ds -- 所有序列 /dm -- 所有物化视图 /dE -- 所有外部表 /dtv -- 表和视图一起列出来 /dit -- 索引和表一起列出来

用通配符精准过滤

/dt ord* -- 名字以ord开头的表 /dt public.* -- public模式下的所有表 /dt *.* -- 所有模式下的所有表(不看可见性)

查看函数定义

-- 列出所有函数 /df -- 按名字过滤 /df test* -- 看详细信息和源代码 /df+ testfunc
Schema | Name | Result data type | Argument data types | Type -------+----------+------------------+---------------------+------ public | testfunc | integer | | func
3.3 数据库和连接管理
/l -- 列出所有数据库 /c test -- 切到test数据库 /c mydb myuser 192.168.1.1 54321 -- 切库+切用户+切主机 /conninfo -- 看当前连接信息

来一个完整的操作流程看看:

-- 连上之后先看看有哪些库 test=# /l Name | Owner | Encoding -----------+-------+--------- kingbase | system| UTF8 test | system| UTF8 analytics | system| UTF8 -- 切到analytics库 test=# /c analytics You are now connected to database "analytics" as user "system". analytics=# -- 看看当前连接信息 analytics=# /conninfo You are connected to database "analytics" as user "system" on host "localhost" at port "54321".
3.4 更多查看命令
/dn -- 所有模式(schema) /du -- 所有用户/角色 /db -- 所有表空间 /db+ -- 表空间详情(含大小) /dT -- 所有数据类型 /do -- 所有操作符 /dx -- 已安装的扩展 /dO -- 排序规则 /dy -- 事件触发器 /dpkg -- 包信息 /dp -- 表/视图的权限 /ddp -- 默认权限设置
3.5 查看视图定义
-- 查看视图的创建语句 /sv orders_info -- 或者用/d+查看视图定义 /d+ orders_info

四、变量:让脚本"活"起来

ksql的变量功能看着简单,但在写脚本的时候特别好用。表名、条件值这些可以参数化,不用每次手动改SQL。

4.1 基本用法:设变量、用变量
-- 设一个变量 /set table_name orders -- 用冒号引用变量 SELECT count(*) FROM :table_name; -- 等同于 SELECT count(*) FROM orders; -- 安全引用(带引号替换,防止注入,推荐) SELECT count(*) FROM :"table_name";
4.2 把查询结果存进变量

/gset是个特别实用的命令——把查询结果直接存成ksql变量:

-- 查出最大订单号,存到变量里 SELECT MAX(order_id) AS max_id FROM orders /gset -- 然后在后面的SQL中引用 /echo :max_id -- 输出:107 SELECT * FROM orders WHERE order_id = :max_id;

加前缀可以避免变量名冲突:

SELECT COUNT(*) AS cnt, AVG(amount) AS avg_amt FROM orders WHERE order_date = CURRENT_DATE /gset daily_ /echo 今日订单数::daily_cnt,平均金额::daily_avg_amt
4.3 实战:把文件内容插进数据库
-- Linux:用反引号执行系统命令,把文件内容读进变量 /set content `cat /data/report.txt` -- Windows /set content `type C:/data/report.txt` -- 插入数据库 INSERT INTO documents(title, body) VALUES ('日报', :'content');
4.4 内置变量一览

ksql有一些预定义的变量,可以直接改它们来改变行为:

变量干什么用默认值
AUTOCOMMIT每条SQL自动提交on
ECHO显示执行的SQLnone
FETCH/_COUNT大结果分批取0(全部)
HISTSIZE命令历史条数500
ON/_ERROR/_STOP出错就停off
VERBOSITY错误信息详细程度default
-- 关掉自动提交,自己控制事务 /set AUTOCOMMIT off -- 执行时把SQL显示出来(调试用) /set ECHO queries -- 大结果集别一口气全拿,每次拿100行 /set FETCH_COUNT 100 -- 跑脚本时,一出错就别继续了 /set ON_ERROR_STOP on -- 查看某个变量当前是什么值 /echo :AUTOCOMMIT

五、事务控制:别让数据改了没法回

5.1 自动提交 vs 手动提交

默认情况下ksql开了自动提交——每条SQL跑完就自动COMMIT了。这很方便,但也有风险:手滑执行了个DELETE FROM orders忘了写WHERE,数据就没了,回都回不来。
手动控制事务,就稳妥多了:

-- 关掉自动提交 /set AUTOCOMMIT off -- 开启事务 BEGIN; -- 执行一系列操作 INSERT INTO orders VALUES(107, 'RDJC', 5, '2024-03-20'); UPDATE inventory SET stock = stock - 1 WHERE product_id = 'P001'; INSERT INTO order_log(order_id, action, action_time) VALUES(107, 'CREATED', CURRENT_TIMESTAMP); -- 确认没问题再提交 COMMIT; -- 发现不对劲?全部撤销 ROLLBACK;

也可以不关自动提交,手动开事务也行:

/set AUTOCOMMIT on -- 保持自动提交 -- 但用BEGIN手动开启事务块 BEGIN; DELETE FROM temp_data WHERE created_at < '2024-01-01'; -- 确认OK COMMIT;
5.2 事务隔离级别

需要控制并发行为的时候:

-- 开启一个可重复读的事务 BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT * FROM accounts WHERE user_id = 1001; UPDATE accounts SET balance = balance - 500 WHERE user_id = 1001; COMMIT; -- 只读事务(只查不改) BEGIN; SET TRANSACTION READ ONLY; SELECT * FROM sensitive_data WHERE date_range = '2024-Q1'; COMMIT;

六、输出格式化:别让结果看着难受

ksql默认用对齐的文本表格显示查询结果,但它的格式化选项远不止于此。

6.1 五种输出格式随意切
-- 1. 默认:对齐表格(日常查询最舒服) SELECT * FROM t1; a | b | c | d ---+---+--------------------+--- 1 | 2 | hello world! | 3 4 | 5 | welcome to ksql | 6 -- 2. 非对齐(适合导出、脚本处理) /a SELECT * FROM t1; a|b|c|d 1|2|hello world!|3 4|5|welcome to ksql|6 -- 3. CSV格式(直接导入Excel) /pset format csv SELECT * FROM t1; a,b,c,d 1,2,hello world!,3 4,5,welcome to ksql,6 -- 4. HTML表格 /H SELECT * FROM t1; <table border="1"> <tr><th>a</th><th>b</th><th>c</th><th>d</th></tr> <tr><td>1</td><td>2</td><td>hello world!</td><td>3</td></tr> </table> -- 5. 扩展模式(列特别多的时候最合适) /x SELECT * FROM t1; -[ RECORD 1 ] a | 1 b | 2 c | hello world![图片](d) | 3 -[ RECORD 2 ] a | 4 b | 5 c | welcome to ksql d | 6
6.2 /pset:精细控制输出样式

/pset就是输出格式的"万能遥控器":

-- 全边框模式(看起来最整齐) /pset border 2 +---+---+--------------------+---+ | a | b | c | d | +---+---+--------------------+---+ | 1 | 2 | hello world! | 3 | +---+---+--------------------+---+ -- 无边框 /pset border 0 -- 只显示数据,不显示列名和行数统计 /pset tuples_only on -- 自定义分隔符(非对齐模式下用) /pset fieldsep '/t' -- 给输出加标题 /pset title '=== 订单统计报表 ===' SELECT * FROM orders;
6.3 输出重定向:存文件或管道

持续输出到文件

-- 打开文件输出 /o result.txt -- 后面所有查询结果都写进文件 SELECT * FROM orders; SELECT count(*) FROM employees; -- 关掉,回到屏幕显示 /o

一次性输出

-- 只把这一条查询的结果存文件 SELECT * FROM orders /g orders_export.txt -- 传给系统命令处理 SELECT customer_name FROM orders /g | sort | uniq -c

交叉表显示——/crosstabview把行变成列:

-- 普通查询 SELECT dept, job_level, COUNT(*) AS cnt FROM employees GROUP BY dept, job_level; dept | job_level | cnt --------+-----------+----- 技术部 | 初级 | 3 技术部 | 高级 | 5 市场部 | 初级 | 2 市场部 | 高级 | 1 -- 用交叉表看更直观 SELECT dept, job_level, COUNT(*) AS cnt FROM employees GROUP BY dept, job_level /crosstabview dept job_level cnt; dept | 初级 | 高级 --------+------+------ 技术部 | 3 | 5 市场部 | 2 | 1

七、脚本技巧:让重复工作一次搞定

7.1 编写日常报表脚本

把常用查询写成脚本文件,配合格式化命令,跑出来就是漂亮的报表:

-- 文件:daily_report.sql -- 每日订单统计报表 /timing on /pset title '=== 每日订单统计 ===' /pset border 2 SELECT order_date, COUNT(*) AS order_count, SUM(amount) AS total_amount, AVG(amount) AS avg_amount FROM orders WHERE order_date = CURRENT_DATE GROUP BY order_date; /pset title '=== 热销商品 TOP 10 ===' SELECT product_name, SUM(quantity) AS total_qty, SUM(quantity * unit_price) AS revenue FROM order_items GROUP BY product_name ORDER BY revenue DESC LIMIT 10;

跑起来:

ksql -d test -f daily_report.sql
7.2 条件判断:根据结果走不同分支

ksql在脚本里能写/if条件判断,这让脚本的灵活性上了一个台阶:

-- 先检查某个客户是否存在 SELECT EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) AS is_customer /gset /if :is_customer /echo '客户123存在,生成账单...' INSERT INTO invoices(customer_id, amount, created_at) SELECT 123, SUM(amount), CURRENT_TIMESTAMP FROM orders WHERE customer_id = 123 AND status = 'unpaid'; UPDATE orders SET status = 'billed' WHERE customer_id = 123 AND status = 'unpaid'; /else /echo '客户123不存在,跳过' /endif
7.3 批量生成SQL并执行

/gexec能把查询结果的每一行当作SQL来执行。举个例子——给一张表的所有列都建索引:

SELECT format('CREATE INDEX idx_my_table_%s ON my_table(%I)', attname, attname) FROM sys_attribute WHERE attrelid = 'my_table'::regclass AND attnum > 0 ORDER BY attnum /gexec

输出:

CREATE INDEX CREATE INDEX CREATE INDEX CREATE INDEX
7.4 单事务包裹整个脚本

怕脚本跑到一半出错导致数据只改了一半?用-1参数把整个脚本包在一个事务里:

# 要么全成功,要么全部回滚 ksql -1 -d test -f migration_v2.sql

八、性能诊断:ksql里的调优利器

8.1 计时:看每条SQL跑多久

打开/timing之后,每条SQL执行完都会显示耗时:

/timing on SELECT * FROM orders WHERE customer_name = 'RDJC'; order_id | customer_name | employee_id | order_date ----------+---------------+-------------+------------ 101 | RDJC | 1 | 1999-03-20 (1 row) Time: 0.852 ms -- 试试加索引前后的对比 CREATE INDEX idx_customer ON orders(customer_name); Time: 12.345 ms SELECT * FROM orders WHERE customer_name = 'RDJC'; Time: 0.123 ms -- 快了不少!
8.2 看执行计划

不用离开ksql就能分析SQL是怎么跑的:

-- 看预估计划 EXPLAIN SELECT * FROM t1 ORDER BY a; QUERY PLAN ------------------------------------------------------------ Sort (cost=158.51..164.16 rows=2260 width=8) Sort Key: a -> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8) (3 rows) -- 看实际执行的计划(含真实耗时和行数) EXPLAIN ANALYZE SELECT * FROM t1 WHERE a > 10; QUERY PLAN ------------------------------------------------------------------------------------------ Seq Scan on t1 (cost=0.00..32.60 rows=1130 width=8) (actual time=0.012..0.035 rows=1132 loops=1) Filter: (a > 10) Planning Time: 0.085 ms Execution Time: 0.062 ms (4 rows)

读执行计划的小窍门:从最里面往外读,Seq Scan是全表扫描,Index Scan是走了索引,cost是代价估算,actual time是实际耗时。

8.3 看元命令背后的SQL

好奇/d命令背后到底执行了什么SQL?打开ECHO_HIDDEN就知道了:

/set ECHO_HIDDEN on /d orders -- 你会先看到类似这样的底层查询: -- ********* QUERY ********** -- SELECT c.oid, n.nspname, c.relname ... -- FROM sys_catalog.sys_class c -- JOIN sys_catalog.sys_namespace n ON n.oid = c.relnamespace -- WHERE c.relname OPERATOR(sys_catalog.~) '^(orders)$' -- **************************

这个功能不仅能满足好奇心,还能帮你学习系统表的结构,自己写监控脚本的时候非常有用。

8.4 用/gdesc看查询结构

想知道一条SQL会返回哪些列和什么类型,但不实际执行它?/gdesc就是干这个的:

SELECT emp_name, hire_date, salary * 12 AS annual_salary FROM employees WHERE dept = '技术部' /gdesc Column | Type --------------+------- emp_name | character varying hire_date | date annual_salary| numeric (3 rows)

九、编辑与快捷操作

9.1 用外部编辑器写长SQL

在命令行里写几十行的SQL很痛苦,用/e调出编辑器就好多了:

/e -- 编辑当前缓冲区 /e query.sql -- 编辑指定文件 /ef my_func -- 编辑函数定义(自动加载CREATE OR REPLACE模板) /ev my_view -- 编辑视图定义

配置你喜欢的编辑器:

# 优先级:KSQL_EDITOR > EDITOR > VISUAL export KSQL_EDITOR=vim # Vim党 export KSQL_EDITOR=nano # 简单党 export KSQL_EDITOR=code # VS Code用户
9.2 Tab键补全

ksql支持Tab补全,输入一半按Tab就能自动补上表名、列名、函数名:

SELECT * FROM ord<Tab> -- 补全为 orders SELECT order_<Tab> -- 补全为 order_id 或 order_date /dt cust<Tab> -- 补全为 customer 相关的表
9.3 命令历史

上下箭头翻历史命令,这是基本操作。但你可以做得更好:

-- 历史文件默认位置 -- Linux: ~/.ksql_history -- Windows: %APPDATA%/kingbase/ksql_history -- 按数据库分开存历史 /set HISTFILE ~/.ksql_history-:DBNAME -- 保存更多历史记录 /set HISTSIZE 2000 -- 不记录以空格开头的命令(密码相关的操作可以这样隐藏) /set HISTCONTROL ignorespace -- 不记录重复命令 /set HISTCONTROL ignoredups -- 两个都生效 /set HISTCONTROL ignoreboth
9.4 不用退出ksql就能敲系统命令
-- 看 当前目录下有什么文件 /![图片](ls) code data2 logfile ... -- Windows /![图片](dir) -- 看当前路径 /![图片](pwd) -- 切工作目录 /cd /data/scripts -- Windows下切目录 /cd 'C://Users//admin'

十、安全:密码和权限

10.1 改密码
-- 改自己的密码 /password -- 改别人的密码(需要有权限) /password Alice
10.2 用户和权限管理
-- 建用户 CREATE USER test_user WITH PASSWORD 'Str0ng!Pass'; -- 给权限 GRANT SELECT, INSERT ON orders TO test_user; GRANT ALL PRIVILEGES ON DATABASE analytics TO test_user; -- 看所有用户 /du -- 查看表的权限 /dp orders -- 收回权限 REVOKE INSERT ON orders FROM test_user; -- 删用户 DROP USER test_user;

注意:/du在超级用户下会显示所有用户信息,普通用户只能看到自己。

十一、命令行参数速查表

ksql的启动参数不少,记住这几个最常用的就够了:

参数作用示例
-h主机地址-h 10.11.0.11
-p端口号-p 54321
-d数据库名-d test
-U用户名-U system
-c执行一条SQL就退出-c "SELECT 1"
-f执行SQL文件-f script.sql
-l列出所有数据库-l
-o输出到文件-o result.txt
-q安静模式-q
-1单事务执行-1 -f batch.sql
-e回显SQL语句-e
-E回显内部查询-E
-t只显示数据行-t
-A非对齐输出-A
-F设置分隔符-F ','
-x扩展显示-x
-HHTML输出-H
--csvCSV输出--csv
-W强制输密码-W
-L记录到日志-L session.log
实用组合
# 导出CSV:安静+只显示数据+非对齐+逗号分隔 ksql -d test -q -t -A -F ',' -c "SELECT * FROM orders" > orders.csv # 跑迁移脚本:显示SQL+出错即停+单事务 ksql -d test -e -1 --set ON_ERROR_STOP=on -f migration_v2.sql # 会话全程记录到日志 ksql -d test -L session.log # 非交互式导出为CSV ksql -d test --csv -c "SELECT * FROM orders" -o orders.csv # 用heredoc一次性跑多行SQL ksql -d test << 'EOF' /timing on /pset format csv SELECT * FROM employees WHERE dept = '技术部'; EOF

十二、个性化配置:打造你专属的ksql

12.1 启动文件

ksql启动时会自动读取配置文件,你可以在里面写上常用的初始化命令,每次进去就是你要的状态:

系统级:安装目录/etc/ksqlrc 用户级:~/.ksqlrc(Windows: %APPDATA%/kingbase/ksqlrc.conf)

一个够用的.ksqlrc示例:

-- 开启计时 /timing on -- 历史记录多一点 /set HISTSIZE 2000 /set HISTCONTROL ignoreboth -- 大结果集分批拿 /set FETCH_COUNT 500 -- 自定义提示符:显示 用户名@主机 数据库名 /set PROMPT1 '%n@%m %~%R%# '
12.2 自定义提示符

提示符里可以放很多动态信息:

转义符显示什么
%n当前用户名
%/当前数据库名
%m主机名
%>端口号
%#超级用户#,普通用户>
%x事务状态:空=无事务,/*=事务中,!=事务失败
%R=正常,-等续行,!断开连接
%l当前行号
-- 显示用户@主机 数据库 /set PROMPT1 '%n@%m %~%R%# ' -- 效果:alice@dbserver testdb=# -- 事务中带星号提醒 /set PROMPT1 '%/%x%R%# ' -- 无事务时:testdb=# -- 事务中时:testdb*=# -- 彩色提示符(黑底黄字) /set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '

十三、踩坑与应对

13.1 SQL跑太久,想停掉

Ctrl+C,ksql会立刻中断当前操作。

13.2 SQL写错了,想重写
-- 打开编辑器改上一条SQL /e -- 清空当前缓冲区,从头来过 /r
13.3 报错信息不够详细

普通错误信息有时候太简略了,用/errverbose看完整的错误堆栈:

SELECT * FROM nonexistent_table; -- ERROR: relation "nonexistent_table" does not exist /errverbose -- ERROR: 42P01: relation "nonexistent_table" does not exist -- LINE 1: SELECT * FROM nonexistent_table; -- ^ -- LOCATION: parserOpenTable, parse_relation.c:1244
13.4 Windows下中文乱码

Windows控制台默认是GBK编码,而ksql期望UTF-8。解决方法:

# 方法一:切换控制台代码页为UTF-8 cmd.exe /c chcp 65001 # 方法二:在ksql里设置客户端编码 /encoding UTF8 # 方法三:设置环境变量 set KINGBASE_CLIENTENCODING=UTF8
13.5 查看当前数据库编码
/encoding -- 输出:UTF8 -- 或者用SQL查 SHOW server_encoding; SHOW client_encoding;

总结:一张图掌握ksql日常操作

你想干嘛敲这个
连数据库ksql -h host -p port -d db -U user
看表结构/d+ 表名
列出所有表/dt
列出所有库/l
切数据库/c 库名
跑脚本文件/i 文件名ksql -f 文件名
看执行计划EXPLAIN SELECT ...
计时/timing on
导出CSV/pset format csv/o 文件名→ 查询
改密码/password
看函数代码/df+ 函数名
退出/q
ksql看着只是个命令行工具,但它的元命令、变量系统、脚本支持加在一起,其实已经具备了脚本语言的能力。日常查数据、管对象、调SQL性能,ksql全都能搞定。碰到批量操作或者需要自动化的场景,把命令写成脚本文件配合-c-f参数用,效率比图形化工具高出一大截。
一句话:多用ksql,你会发现越来越顺手。

《网络安全从零到精通全套学习大礼包》

96节从入门到精通的全套视频教程免费领取

如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。

网络安全学习路线图

想要学习 网络安全,作为新手一定要先按照路线图学习方向不对,努力白费。对于从来没有接触过网络安全的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线,大家跟着这个路线图学习准没错。

配套实战项目/源码

所有视频教程所涉及的实战项目和项目源码

学习电子书籍

学习网络安全必看的书籍和文章的PDF,市面上网络安全书籍确实太多了,这些是我精选出来的

面试真题/经验

以上资料如何领取?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询