從 mysql 命令切到 ksql,第一步先把連線搞明白

從 mysql 命令切到 ksql,第一步先把連線搞明白

資料庫裝好之後,第一件事不是建業務表,也不是急著看複雜語法,而是先確認客戶端能不能穩定連進去。

MySQL 用久了,手上一般都會有一套很熟的動作:服務起來以後,敲一條 mysql -h -P -u -p,能進互動介面,再查個 select version()。這套動作看起來簡單,但它解決的是最基礎的問題:現在連的是哪台機器、哪個埠、哪個使用者、哪個資料庫。

切到 KingbaseES 以後,入口換成了 ksql。命令也不複雜,不過幾個參數不能直接照 MySQL 的習慣套。尤其是資料庫名這一項,如果沒有明確寫出來,很容易遇到一個看起來像連線失敗、實際上只是預設庫不對的錯誤。

先確認用的是哪個 ksql

安裝目錄裡不只會有資料庫伺服器程式,也會有客戶端工具。開始連庫之前,先確認目前 shell 裡找到的 ksql 來自哪裡。

bash 体验AI代码助手 代码解读复制代码which ksql
ksql --version
ksql --help | head -n 40

目前環境裡,ksql 來自安裝目錄下的 Server/bin

text 体验AI代码助手 代码解读复制代码/acowbo/kingbase/install/KESRealPro/V009R001C010/Server/bin/ksql

版本回傳的是:

text 体验AI代码助手 代码解读复制代码ksql (KingbaseES) V009R001C010

ksql 路徑和版本

這一步看起來普通,但後面排查問題時很有用。機器上如果裝過多個版本,或者 PATH 裡混進了別的客戶端工具,先確認命令來源能省不少時間。

ksql --help 裡也能看到它自己的參數習慣。比如資料庫名使用 -d,使用者名稱使用 -U,埠使用 -p。這幾個大小寫和 MySQL 不完全一樣。

text 体验AI代码助手 代码解读复制代码MySQL:
mysql -h 127.0.0.1 -P 3306 -u root -p

KingbaseES:
ksql -h 127.0.0.1 -p 54321 -U system -d test

對 MySQL 使用者來說,最容易順手寫錯的是埠和使用者名稱:MySQL 埠是大寫 -P,使用者是小寫 -uksql 埠是小寫 -p,使用者是大寫 -U

這裡還有一個細節:ksql 的幫助裡把用法寫成了 ksql [OPTION]... [DBNAME [USERNAME]]。也就是說,資料庫名和使用者名稱除了用參數指定,也能放在命令最後。實際寫文章或腳本時,用 -U-d 會更清楚。

比如下面兩種寫法都能表達連線目標:

bash 体验AI代码助手 代码解读复制代码ksql -h 127.0.0.1 -p 54321 -U system -d test
ksql -h 127.0.0.1 -p 54321 test system

前一種更適合放在文章和腳本裡。參數名一眼就能看出來,後面排查連線問題時也不會猜最後兩個位置參數分別是什麼。

少了資料庫名,錯誤會有點繞

先看一條不完整的連線命令:

bash 体验AI代码助手 代码解读复制代码ksql -h 127.0.0.1 -p 54321 -U system

輸入密碼後,回傳的是:

text 体验AI代码助手 代码解读复制代码FATAL: database "system" does not exist

不指定資料庫連線失敗

這個錯誤不能馬上往「服務沒起來」或者「密碼錯了」上想。這裡密碼已經進入驗證流程,伺服器端也有回應,真正的問題是沒有指定要連線的資料庫。

ksql 在沒有 -d 的情況下,會嘗試連線到和使用者名稱同名的資料庫。當前使用者名稱是 system,它就去找名為 system 的資料庫。實例裡沒有這個庫,於是報了 database "system" does not exist

這點和 MySQL 的使用習慣很容易打架。MySQL 裡很多時候先用管理員使用者連進去,再 use 庫名;而這裡最好一開始就把目標資料庫寫清楚。

這類錯誤也提醒了一件事:連線資料庫時不要只看「帳號密碼對不對」。主機、埠、使用者、資料庫名四個值是一起工作的。服務能回應、密碼能通過,並不代表目標資料庫一定存在。以後看到 could not connect to serverpassword authentication faileddatabase does not exist 這幾類錯誤,也要分開判斷,不能全當成同一種連線失敗。

把 -d 寫上,先連進 test

補上資料庫名以後,連線命令變成:

bash 体验AI代码助手 代码解读复制代码ksql -h 127.0.0.1 -p 54321 -U system -d test

這次能正常進入互動介面,提示字元變成了:

text 体验AI代码助手 代码解读复制代码test=#

指定 test 資料庫連線成功

這條命令裡主要是四個參數:

text 体验AI代码助手 代码解读复制代码-h 127.0.0.1   連接本機資料庫服務
-p 54321       連接埠
-U system      登入使用者
-d test        目標資料庫

這裡的 test 是初始化後可以連線的資料庫。實際環境裡可以換成自己的業務庫或實驗庫,關鍵是不要讓客戶端去猜預設庫。

提示字元也能順手看一下。test=# 裡的 test 是目前資料庫,後面的 # 和當前高權限使用者有關。後面換成普通使用者連線 app_db 時,提示字元會變成 app_db=>。它不是權限檢查工具,但能快速看出現在大概連在哪個庫、用的是什麼等級的使用者。

連進去以後,先確認自己在哪

進入互動介面後,先查目前資料庫、目前使用者和版本:

sql 体验AI代码助手 代码解读复制代码select current_database(), current_user;
select version();

目前回傳結果裡,資料庫是 test,使用者是 system,版本是 KingbaseES V009R001C010

目前使用者和版本

MySQL 裡常用 select database();select user(); 看目前位置。KingbaseES 這裡換成:

sql 体验AI代码助手 代码解读复制代码select current_database(), current_user;

命令不同,作用差不多。後面要建立使用者、建立資料庫、建表,先確認目前資料庫和目前使用者,能少犯很多低級錯誤。

再試一個最小查詢:

sql 体验AI代码助手 代码解读复制代码select 1;

然後用 \conninfo 看目前連線資訊:

text 体验AI代码助手 代码解读复制代码\conninfo

最後退出:

text 体验AI代码助手 代码解读复制代码\q

基礎查詢與退出

這裡順手碰到了 ksql 裡的另一類命令:反斜線開頭的是客戶端元命令,不是 SQL。比如 \conninfo 檢視連線資訊,\q 退出客戶端。元命令後面會再展開,這裡先知道它不是發給資料庫執行的 SQL 就行。

select 1; 這種 SQL 會被送到資料庫執行;\conninfo\qksql 客戶端自己處理。這一點和 MySQL 客戶端裡的部分命令有點像,比如 statussource\q 這類動作不完全等同於 SQL。先把這個邊界分清,後面看 \l\d\dt 時就不會困惑:為什麼這些命令不用分號,為什麼它們不是標準 SQL。

環境變數也能連

完整參數寫熟以後,可以用環境變數減少重複輸入。

bash 体验AI代码助手 代码解读复制代码export KINGBASE_HOST=127.0.0.1
export KINGBASE_PORT=54321
export KINGBASE_USER=system
export KINGBASE_DATABASE=test

再執行:

bash 体验AI代码助手 代码解读复制代码ksql

客戶端會讀取這些環境變數,直接連線到對應資料庫。

使用環境變數連線

環境變數適合固定連線目標。比如這台測試機一直連 127.0.0.1:54321test 庫,就可以少敲一長串參數。

臨時測試時,先放在目前終端即可,不急著寫進 .bashrc。要確認目前 shell 裡留了什麼值,可以直接看:

bash 体验AI代码助手 代码解读复制代码echo $KINGBASE_HOST
echo $KINGBASE_PORT
echo $KINGBASE_USER
echo $KINGBASE_DATABASE

換使用者、換資料庫、換伺服器之前,最好先清掉舊值:

bash 体验AI代码助手 代码解读复制代码unset KINGBASE_HOST KINGBASE_PORT KINGBASE_USER KINGBASE_DATABASE

這樣再執行 ksql 時,就會回到手動傳參的狀態,不會帶著上一次的連線目標。

別一直用 system 做實驗

前面的連線都是用 system 做的。安裝初始化階段用它沒問題,但日常寫 SQL、試表結構、做小實驗,最好不要一直使用管理員使用者。

這裡建立一個普通使用者:

sql 体验AI代码助手 代码解读复制代码create user app_user with password '<實驗密碼>' nosuperuser nocreatedb nocreaterole;

執行成功後回傳:

text 体验AI代码助手 代码解读复制代码CREATE ROLE

再用 \du 看角色列表,可以看到 app_user 已經存在。

建立普通使用者

這裡有個細節:命令寫的是 create user,回傳卻是 CREATE ROLE。這不是異常。官方文件裡也能看到,CREATE USERCREATE ROLE 的別名,差別在於 CREATE USER 預設帶登入屬性。也就是說,KingbaseES 這裡的使用者和角色體系是放在一起理解的。

這裡不展開完整權限模型,只先做一個最小隔離:管理員使用者負責建立資源,普通使用者負責實驗操作。

nosuperuser nocreatedb nocreaterole 這幾個選項也不用背得太早,先看字面就夠了:不是超級使用者、不能建立資料庫、不能建立角色。也就是說,app_user 只是一個普通登入使用者。這樣後面用它建表、插入資料時,能更接近日常應用帳號的狀態,而不是一直用管理員權限把問題蓋過去。

建立使用者時的密碼只用於本地實驗,公開內容裡不要放真實密碼。範例裡可以寫成 <實驗密碼>,實際操作時按自己的密碼策略設定。命令輸出裡如果出現密碼,也應該提前打碼。

給普通使用者建一個自己的資料庫

使用者建立好之後,再建立一個資料庫,並把 owner 指向這個使用者:

sql 体验AI代码助手 代码解读复制代码create database app_db owner app_user;

執行成功後,用 \l 看資料庫列表。app_db 出現在列表裡,owner 是 app_user

建立普通使用者專屬資料庫

這裡要把兩個概念分清楚:使用者和資料庫不是一回事。app_user 是登入身分,app_db 是資料庫。把 app_db 的 owner 指給 app_user,再用這個使用者連線這個庫,就不用一直依賴 system

官方 CREATE DATABASE 文件裡也有對應語法,OWNER 可以指定新資料庫的所有者。建立資料庫本身需要超級使用者或者 CREATEDB 權限,這也是這裡繼續使用 system 來執行建立動作的原因。

和 MySQL 對比時,這裡也容易有錯覺。MySQL 裡經常把「一個庫 + 一個使用者 + 一組授權」放在一起理解,業務上也會說「給某個使用者建一個庫」。KingbaseES 這裡仍然可以這麼組織實驗環境,但概念上要分開:使用者是使用者,資料庫是資料庫,owner 是資料庫的所有者,後面還會遇到 schema 和物件權限。當前這一步只先把使用者和資料庫綁起來,不把權限體系一次講完。

用普通使用者重新連一次

退出目前連線後,換成普通使用者連線新庫:

bash 体验AI代码助手 代码解读复制代码ksql -h 127.0.0.1 -p 54321 -U app_user -d app_db

進入後先確認目前身分:

sql 体验AI代码助手 代码解读复制代码select current_database(), current_user;

回傳的是 app_dbapp_user。這表示連線目標已經從管理員使用者的 test,切到了普通使用者自己的資料庫。

普通使用者連線專屬庫並建表

接著做一個很小的寫入驗證:

sql 体验AI代码助手 代码解读复制代码create table t_ksql_conn_demo(id int, name varchar(50));
insert into t_ksql_conn_demo values (1, 'hello ksql');
select * from t_ksql_conn_demo;

結果能查到 hello ksql,表示這個普通使用者不僅能連庫,也能在自己的資料庫裡完成建表和寫入。

到這一步,ksql 入門就不只是「連上了」這麼簡單。連線參數、預設資料庫、目前使用者、普通使用者、資料庫 owner,都已經串起來了。

這個小表沒有業務含義,只是驗證連線後的寫入能力。比單純執行 select 1 更進一步:select 1 只能說明查詢能執行,建表和插入成功,才說明這個使用者在目前資料庫裡確實有基本操作能力。後面要繼續練 SQL,也可以從這個 app_db 開始,避免在 test 庫裡越堆越亂。

先把連線習慣改過來

從 MySQL 切到 ksql,第一關不是 SQL 方言,而是連線習慣。

mysql 常用的是:

bash 体验AI代码助手 代码解读复制代码mysql -h 127.0.0.1 -P 3306 -u root -p

ksql 這裡更建議一開始就寫完整:

bash 体验AI代码助手 代码解读复制代码ksql -h 127.0.0.1 -p 54321 -U app_user -d app_db

幾個點最容易踩:


text 体验AI代码助手 代码解读复制代码埠參數:MySQL 是 -P,ksql 是 -p
使用者參數:MySQL 是 -u,ksql 是 -U
資料庫名:ksql 最好明確寫 -d
預設行為:不寫 -d 時,可能嘗試連線到和使用者名稱同名的資料庫
管理員使用者:system 用來初始化和管理,不適合所有實驗都壓在它身上

---

原文出處:https://juejin.cn/post/7647434190326841371

精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝6   💬2  
337
🥈
我愛JS
💬1  
3
🥉
alicec
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登