掌握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/serviceName11.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_password1.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.sql2.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 TABLE3.2 /d家族:数据库的X光机
这是用得最频繁的一组命令,没有之一。
查看表结构——最常用的功能:
/d ordersTable "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+ testfuncSchema | Name | Result data type | Argument data types | Type -------+----------+------------------+---------------------+------ public | testfunc | integer | | func3.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_amt4.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 | 显示执行的SQL | none |
| 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 | 3 -[ RECORD 2 ] a | 4 b | 5 c | welcome to ksql d | 66.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.sql7.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不存在,跳过' /endif7.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 INDEX7.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 ignoreboth9.4 不用退出ksql就能敲系统命令
-- 看 当前目录下有什么文件 / code data2 logfile ... -- Windows / -- 看当前路径 / -- 切工作目录 /cd /data/scripts -- Windows下切目录 /cd 'C://Users//admin'十、安全:密码和权限
10.1 改密码
-- 改自己的密码 /password -- 改别人的密码(需要有权限) /password Alice10.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 |
-H | HTML输出 | -H |
--csv | CSV输出 | --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 -- 清空当前缓冲区,从头来过 /r13.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:124413.4 Windows下中文乱码
Windows控制台默认是GBK编码,而ksql期望UTF-8。解决方法:
# 方法一:切换控制台代码页为UTF-8 cmd.exe /c chcp 65001 # 方法二:在ksql里设置客户端编码 /encoding UTF8 # 方法三:设置环境变量 set KINGBASE_CLIENTENCODING=UTF813.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,市面上网络安全书籍确实太多了,这些是我精选出来的